JavaScript单元测试框架JsUnit基本介绍和使用

JavaScript单元测试框架JsUnit基本介绍和使用

XUnit framework

  XUnit是一套标准化的独立于语言的概念和结构集合,用于编写和运行单元测试(Unit tests).

  每一个语言都有一个用于单元测试的XUnit框架,比如Java有JUnit, C++有CppUnit, PHP有PHPUnit, Oracle SQL有UTPL/SQL.

JsUnit

  JsUnit的官网: http://jsunit.net/

  JsUnit遵循XUnit的一些惯例:

  单元测试在JsUnit中叫做Test Functions.

  Test Functions所在的HTML页面叫做Test Page.

  一个Test Page是一个包含jsUnitCore.js的HTML页面. jsUnitCore.js提供了一些断言函数, 比如assertEquals(comment, arg1, arg2).

  JsUnit支持setUp()tearDown().

  Test Suite Page声明了一个suite()函数,返回一个JsUnitTestSuite, 用来运行含多个测试的套件.

  JsUnit的testRunner.html页运行Test Pages.

  TestRunner页面可以运行在一个文件服务器或者web服务器上.

JUnit和JsUnit

JavaScript编码规范

  由于JavaScript没有访问修饰符,所以通常在JavaScript中,不希望外界访问的成员和方法名以下划线开始.

  这是一种编码规范,不是语言的规定,虽然外界仍然可以访问但是不推荐.

  JsUnit测试函数要遵循的规则与JUnit3.8类似,比如说测试函数名以test开头等.

JsUnit基本使用实例

  待测试的源代码:test1.js

  function add(num1, num2)
  {
    return num1 + num2;
  }

  function subtract(num1, num2)
  {
    return num1 - num2;
  }

  function multiply(num1, num2)
  {
    return num1 * num2;
  }

  function addNumbers()
  {
    var v1 = document.getElementById("value1").value;
    var v2 = document.getElementById("value2").value;

    v1 = parseInt(v1);
    v2 = parseInt(v2);

    var v3 = v1 + v2;

    document.getElementById("value3").value = v3;
  }

  测试页面:test1.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
 <head>
  <title> New Document </title>
  <meta name="Generator" content="EditPlus">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">

  <script type="text/javascript" src="..\jsunit2_2\jsunit\app\jsUnitCore.js"></script>

  <script type="text/javascript" src="test1.js"></script>

  <script type="text/javascript">

  var count = 0;

  // 此函数只执行一次(在页面加载后),类似于JUnit 4.x中的@BeforeClass
  // 注意:并没有与@AfterClass对应的函数存在
  function setUpPage()
  {
    alert(‘setUpPage Invoked‘);

    // 这行代码必须放在setUpPage函数的最后一行
    // 告诉JsUnit,setUpPage函数已经执行完毕

    setUpPageStatus = "complete";
  }

  // setUp run before every test function
  function setUp()
  {
    //alert(count++);    //JUnit若这样执行,count全是0,因为每一个测试方法都会生成新的测试对象;
                        //JsUnit会递增count, 因为都是在同一个页面里去执行,所以会基于原有的值

    //设定初始条件
    document.getElementById("value1").value = 2;
    document.getElementById("value2").value = 3;
  }

  // tearDown run after every test function
  function tearDown()
  {
    //alert("tearDown");

    //清理状态
    document.getElementById("value1").value = "";
    document.getElementById("value2").value = "";
    document.getElementById("value3").value = "";
  }

  // 以下为测试函数(Test Function)

  function testAdd()
  {
    var result = add(1, 2);

    assertEquals(3, result);
  }

  function testSubtract()
  {
    var result = subtract(1, 2);

    assertEquals(-1, result);
  }

  function testMultiply()
  {
    var result = multiply(1, 2);

    assertEquals(2,result);
  }

  function testAddNumbers()
  {
    addNumbers();

    assertEquals("5", document.getElementById("value3").value);
  }

  </script>

 </head>
 <body>

  <input type="text" id="value1"><br>
  <input type="text" id="value2"><br>
  <input type="text" id="value3"><br>

  <input type="button" value="Add" onclick="addNumbers();">

 </body>
</html>

  使用JsUnit提供的测试运行器: testRunner.html, 加载测试页面,即可运行相关测试,并报告结果.

setUp()和tearDown()

  setUp()在每一个测试方法运行之前运行;

  tearDown()在每一个测试方法运行之后运行.

  对于JsUnit来说, 其setUp()和tearDown()方法与JUnit的运行原理是不同的.

  JUnit中的setUp()和tearDown()之间是没有关系的,也就是说不同的测试方法运行在不同的测试对象之中;

  而JsUnit的各个测试函数是运行在同一个测试页面中,因此同一个页面中setUp()和tearDown()运行多次(每个测试函数之前和之后),会针对同一个变量进行操作.

setUpPage()

  setUpPage()在测试页面加载时执行,每次运行只执行一次.

  这个方法的末尾必须加上:

       setUpPageStatus = "complete";

  表示setUpPage()执行完成,否则会提示setUpPage not completed, 从而无法执行测试用例.

测试套件Suite

  JsUnitTestSuite定义在jsUnitCore.js中, JsUnitTestSuite代表多个JsUnit测试页面的套件,测试页面和测试套件都可以被加在套件中,即套件是可嵌套的.(组合模式).

  JsUnitTestSuite的定义(见jsUnitCore.js):

/**
 * @class
 * A JsUnitTestSuite represents a suite of JsUnit Test Pages.  Test Pages and Test Suites can be added to a
 * JsUnitTestSuite
 * @constructor
 */
function JsUnitTestSuite() {
    /**
     * Declares that this object is a JsUnitTestSuite
     */
    this.isJsUnitTestSuite = true;
    /**
     * @private
     */
    this._testPages = Array();
    /**
     * @private
     */
    this._pageIndex = 0;

    for (var i = 0; i < arguments.length; i++) {
        if (arguments[i]._testPages) {
            this.addTestSuite(arguments[i]);
        } else {
            this.addTestPage(arguments[i]);
        }
    }
}

测试套件的使用例子1: test2.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
 <head>
  <title> New Document </title>
  <meta name="Generator" content="EditPlus">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">

  <script type="text/javascript" src="..\jsunit2_2\jsunit\app\jsUnitCore.js"></script>

<script type="text/javascript">

//测试套件名一定为suite
function suite()
{
    var testSuite = new top.jsUnitTestSuite();

    // 增加的测试页面的路径是相对于测试运行器(testRunner.html)的路径
    // 而不是当前页面
    testSuite.addTestPage("../../jsUnit_code/test1.html");
    testSuite.addTestPage("../../jsUnit_code/test1.html");
    testSuite.addTestPage("../../jsUnit_code/test1.html");

    return testSuite; // 最后需要返回套件
}
</script>
 </head>

 <body>

 </body>
</html>

测试套件的使用例子2: test3.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
 <head>
  <title> New Document </title>
  <meta name="Generator" content="EditPlus">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">

  <script type="text/javascript" src="..\jsunit2_2\jsunit\app\jsUnitCore.js"></script>

  <script type="text/javascript">

   // 自定义的测试套件
  function mySuite()
  {
    var testSuite = new top.jsUnitTestSuite();

    testSuite.addTestPage("../../jsUnit_code/test1.html");
    testSuite.addTestPage("../../jsUnit_code/test1.html");
    testSuite.addTestPage("../../jsUnit_code/test1.html");

    return testSuite;
  }

  function suite()
  {
    var testSuite = new top.jsUnitTestSuite();

    testSuite.addTestPage("../../jsUnit_code/test1.html"); // 在测试套件中加入页面
    testSuite.addTestSuite(mySuite()); // 在测试套件中加入测试套件

    return testSuite; // 记得返回套件
  }

  </script>

 </head>

 <body>

 </body>
</html>

参考资料

  圣思园张龙老师Java Web培训视频教程: 60-62.

  JsUnit官网: http://jsunit.net/

时间: 2024-08-15 11:13:55

JavaScript单元测试框架JsUnit基本介绍和使用的相关文章

JavaScript单元测试框架-Jasmine

转载自金石开的blog:http://www.cnblogs.com/zhcncn/p/4330112.html Jasmine的开发团队来自PivotalLabs,他们一开始开发的JavaScript测试框架是JsUnit,来源于著名的JAVA测试框架JUnit.JsUnit是xUnit的JavaScript实现.但是JsUnit在2009年后就已经停止维护了,他们推出了一个新的BDD框架Jasmine.Jasmine不依赖于任何框架,所以适用于所有的Javascript代码. 所谓BDD(行

javascript--QUnit【javascript单元测试框架】

QUnit官网 开源中国:http://www.oschina.net/p/qunit 参考:http://www.zhangxinxu.com/wordpress/2013/04/qunit-javascript-unit-test-单元测试/ http://blog.csdn.net/cyq1984/article/details/6398596 一.断言(Assert) async() Instruct QUnit to wait for an asynchronous operation

[转]javascript单元测试

1.      什么是单元测试 在计算机编程中,单元测试(又称为模块测试)是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作.程序单元是应用的最小可测试部件.在过程化编程中,一个单元就是单个程序.函数.过程等:对于面向对象编程,最小单元就是方法,包括基类(超类).抽象类.或者派生类(子类)中的方法. 每个理想的测试案例独立于其它案例:为测试时隔离模块,经常使用stubs.mock 或fake等测试马甲程序.单元测试通常由软件开发人员编写,用于确保他们所写的代码符合软件需求和遵循开发目

构建自动化、跨浏览器的 JavaScript 单元测试

我们都知道在多个浏览器中测试我们的代码是多么的重要.至少在我们发布第一个项目的时候,我认为我们在网络开发社区做大部分工作还是相当不错的. 我们做的不够好的工作是测试代码时每一次做出的改变. 我个人对此感到很惭愧.我已经把"学习如何构建自动化.跨浏览器的JavaScript的单元测试"列在我的年度to-do清单中,但我每一次坐下来真正想要做的时候,我又退却了.虽然我肯定这一部分原因是因为我的懒惰,同时我认为这也是由于缺乏良好的可用信息在这个主题上. 有许多工具和框架(例如 Karma)宣

Java单元测试框架 JUnit

Java单元测试框架 JUnit JUnit是一个Java语言的单元测试框架.它由Kent Beck和Erich Gamma建立,逐渐成为源于KentBeck的sUnit的xUnit家族中为最成功的一个. JUnit有它自己的JUnit扩展生态圈.多数Java的开发环境都已经集成了JUnit作为单元测试的工具. 在线Javadoc:http://ww...更多JUnit信息 最近更新: JUnit 4.12 发布,Java 单元测试框架 发布于4个月前 C++模拟测试框架 Google Mock

15. Unittest单元测试框架的介绍与使用

?什么是单元测试 在计算机编程中,单元测试(英语:Unit Testing)又称为模块测试, 是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作.程序单元是应用的最小可测试部件.在过程化编程中,一个单元就是单个程序.函数.过程等:对于面向对象编程,最小单元就是方法,包括基类(超类).抽象类.或者派生类(子类)中的方法. 上面这段内容摘自维基百科.笔者在入职的时候,一直搞不明白什么是单元测试.即使搜了很多资料,也还是搞不明白.一直到接触代码的时候,才对单元测试有了一个大概的认识.当然以

单元测试框架的基本使用介绍

测试人员一般用TestNG来写自动化测试.  开发人员一般用JUnit写单元测试. TestNG 单元测试框架 http://www.cnblogs.com/TankXiao/p/3888070.html

前端单元测试框架-Mocha

引言 随着前端工程化这一概念的产生,项目开发中前端的代码量可谓是'急剧上升',所以在这种情况下,我们如何才能保证代码的质量呢,对于框架,比如React.Vue,因为有自己的语法规则,及时每个开发人员的编码风格规范各不相同,但最终的产出都大同小异,代码质量差距不是很大:但对于一些基础类库或方法的开发,我们就要谨慎又谨慎,代码质量一定要高,尽量避免出现Bug. 那我们如何做到产出高质量代码呢?单元测试才是正解,俗话说'跳过单元测试和不仔细过冒烟就交由QA测试的,就是在耍流氓'(这句话是我自己编的):

【JavsScript】JavaScript MVC 框架技术选型

你很喜欢Gmail和Trello之类的单页面应用,但是不太确定该从何开始.也许你的JavaScript代码是如此的杂乱无章,以致于你很想在下一个项目上尝试下JavaScript MVC库和框架,却苦于没有头绪?我正在撰写一本单页面应用的书,所以我阅读了大量网上的相关资料.在这里我尝试提供一些看法,希望可以帮助你下决定. 简介 这里讨论的是时下最热的框架,AngularJS.Backbone.Ember和Knockout.同时提到了Batman.CANjs.Meteor和Spine,但是没有详细展