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/

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

  1. JavaScript单元测试框架-Jasmine

    Jasmine的开发团队来自PivotalLabs,他们一开始开发的JavaScript测试框架是JsUnit,来源于著名的JAVA测试框架JUnit.JsUnit是xUnit的JavaScript实 ...

  2. Javascript单元测试框架比较Qunit VS Jasmine

    Javascript单元测试框架比较Qunit VS Jasmine 工欲行其事必先利其器,好的单元测试框架是TDD成功的一半.Javascript优秀的测试框架很多, 包括Jasmine,Qunit ...

  3. javascript单元测试框架mochajs详解

    关于单元测试的想法 对于一些比较重要的项目,每次更新代码之后总是要自己测好久,担心一旦上线出了问题影响的服务太多,此时就希望能有一个比较规范的测试流程.在github上看到牛逼的javascript开 ...

  4. javascript单元测试框架mochajs详解(转载)

    章节目录 关于单元测试的想法 mocha单元测试框架简介 安装mocha 一个简单的例子 mocha支持的断言模块 同步代码测试 异步代码测试 promise代码测试 不建议使用箭头函数 钩子函数 钩 ...

  5. JavaScript单元测试框架:Jasmine

    摘抄:http://blog.csdn.net/GuoJiangweigege/article/details/52130589 互联网的快速发展,给web开发人员带来了前所未有的挑战.对于前端开发, ...

  6. Junit4 单元测试框架的常用方法介绍

    Junit 介绍: Junit是一套框架(用于JAVA语言),由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework),即 ...

  7. javascript单元测试(转)

    1.      什么是单元测试 在计算机编程中,单元测试(又称为模块测试)是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作.程序单元是应用的最小可测试部件.在过程化编程中,一个单元就是单 ...

  8. (译)学习如何构建自动化、跨浏览器的JavaScript单元测试

    作者:Philip Walton 译者:Yeaseon 原文链接:点此查看 译文仅供个人学习,不用于任何形式商业目的,转载请注明原作者.文章来源.翻译作者及链接,版权归原文作者所有. ___ 我们都知 ...

  9. [转]javascript单元测试

    1.      什么是单元测试 在计算机编程中,单元测试(又称为模块测试)是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作.程序单元是应用的最小可测试部件.在过程化编程中,一个单元就是单 ...

随机推荐

  1. 前端学PHP之数组函数

    × 目录 [1]键值操作 [2]记数[3]回调函数[4]组合[5]栈和队列[6]顺序 前面的话 PHP中的数组功能非常强大,数组处理函数有着强大.灵活.高效的特点.PHP5提供了近100个操作数组的系 ...

  2. android给View设置边框 填充颜色 弧度

    <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http: ...

  3. EasyUI Tabs绑定右键

    JS:             /*为选项卡绑定右键*/                 $("#tabs").tabs({                     onConte ...

  4. 窥探Swift之数组安全索引与数组切片

    今天是元宵节,祝大家元宵节快乐!在Swift中的数组和字典中下标是非常常见的,数组可以通过索引下标进行元素的查询,字典可以通过键下标来获取相应的值.在使用数组时,一个常见的致命错误就是数组越界.如果在 ...

  5. Entity FrameWork 365日系列文章源码研究 (1)

    By KMSFan --  此系列的文章只作为自己的读书笔记,不纳入博客园首页. 总结的知识点: 1.DBContext 类 2.Attribute里的属性(NotNull) 3.DbContext实 ...

  6. linux下命令行操作快捷键及技巧

      历史相关命令 !!:执行上一条命令 !num:执行历史命令中第num条命令 !-num:执行历史命令中倒数第num条命令 !?string?:执行最近一条包含有string字符串的命令 Ctrl+ ...

  7. 【UWP开发】一个简单的Toast实现

    Toast简介 在安卓里Toast是内置原生支持,它是Android中用来显示显示信息的一种机制.它主要用于向用户显示提示消息,没有焦点,显示的时间有限,过一定的时间就会自动消失.在UWP中虽然没有原 ...

  8. [Asp.net 5] Logging-日志系统的基本架构(下)

    接上节内容,我们继续讲解日志的其他部分. ILoggerProvider以及扩展类 我们在上节的架构图上并没有看到有直接实现该接口的实现类.那么如果将Logger类直接使用会有什么结果呢? var f ...

  9. C语言: 预处理

    1. 字符映射 键盘有多种标准规格,例如常用的IBM 104键盘标准,然而不是所有键盘都能打出像#这样的符号,因此C语言的预处理引入了字符映射机制.如果程序员要求,预处理会按照约定对源代码中的字符进行 ...

  10. Tomcat问题,不能正确访问http://localhost:8080/

    最近在学Struts2框架部分的内容,但是eclipse中配置tomcat遇到了很大的问题,当辛辛苦苦的配置完了之后,竟让连小猫的首页都不能访问,http://localhost:8080/输入了之后 ...