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

  1. function add(num1, num2)
  2. {
  3. return num1 + num2;
  4. }
  5.  
  6. function subtract(num1, num2)
  7. {
  8. return num1 - num2;
  9. }
  10.  
  11. function multiply(num1, num2)
  12. {
  13. return num1 * num2;
  14. }
  15.  
  16. function addNumbers()
  17. {
  18. var v1 = document.getElementById("value1").value;
  19. var v2 = document.getElementById("value2").value;
  20.  
  21. v1 = parseInt(v1);
  22. v2 = parseInt(v2);
  23.  
  24. var v3 = v1 + v2;
  25.  
  26. document.getElementById("value3").value = v3;
  27. }

  测试页面:test1.html

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
  2. <html>
  3. <head>
  4. <title> New Document </title>
  5. <meta name="Generator" content="EditPlus">
  6. <meta name="Author" content="">
  7. <meta name="Keywords" content="">
  8. <meta name="Description" content="">
  9.  
  10. <script type="text/javascript" src="..\jsunit2_2\jsunit\app\jsUnitCore.js"></script>
  11.  
  12. <script type="text/javascript" src="test1.js"></script>
  13.  
  14. <script type="text/javascript">
  15.  
  16. var count = 0;
  17.  
  18. // 此函数只执行一次(在页面加载后),类似于JUnit 4.x中的@BeforeClass
  19. // 注意:并没有与@AfterClass对应的函数存在
  20. function setUpPage()
  21. {
  22. alert('setUpPage Invoked');
  23.  
  24. // 这行代码必须放在setUpPage函数的最后一行
  25. // 告诉JsUnit,setUpPage函数已经执行完毕
  26.  
  27. setUpPageStatus = "complete";
  28. }
  29.  
  30. // setUp run before every test function
  31. function setUp()
  32. {
  33. //alert(count++); //JUnit若这样执行,count全是0,因为每一个测试方法都会生成新的测试对象;
  34. //JsUnit会递增count, 因为都是在同一个页面里去执行,所以会基于原有的值
  35.  
  36. //设定初始条件
  37. document.getElementById("value1").value = 2;
  38. document.getElementById("value2").value = 3;
  39. }
  40.  
  41. // tearDown run after every test function
  42. function tearDown()
  43. {
  44. //alert("tearDown");
  45.  
  46. //清理状态
  47. document.getElementById("value1").value = "";
  48. document.getElementById("value2").value = "";
  49. document.getElementById("value3").value = "";
  50. }
  51.  
  52. // 以下为测试函数(Test Function)
  53.  
  54. function testAdd()
  55. {
  56. var result = add(1, 2);
  57.  
  58. assertEquals(3, result);
  59. }
  60.  
  61. function testSubtract()
  62. {
  63. var result = subtract(1, 2);
  64.  
  65. assertEquals(-1, result);
  66. }
  67.  
  68. function testMultiply()
  69. {
  70. var result = multiply(1, 2);
  71.  
  72. assertEquals(2,result);
  73. }
  74.  
  75. function testAddNumbers()
  76. {
  77. addNumbers();
  78.  
  79. assertEquals("5", document.getElementById("value3").value);
  80. }
  81.  
  82. </script>
  83.  
  84. </head>
  85. <body>
  86.  
  87. <input type="text" id="value1"><br>
  88. <input type="text" id="value2"><br>
  89. <input type="text" id="value3"><br>
  90.  
  91. <input type="button" value="Add" onclick="addNumbers();">
  92.  
  93. </body>
  94. </html>

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

setUp()和tearDown()

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

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

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

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

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

setUpPage()

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

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

  1. setUpPageStatus = "complete";

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

测试套件Suite

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

  JsUnitTestSuite的定义(见jsUnitCore.js):

  1. /**
  2. * @class
  3. * A JsUnitTestSuite represents a suite of JsUnit Test Pages. Test Pages and Test Suites can be added to a
  4. * JsUnitTestSuite
  5. * @constructor
  6. */
  7. function JsUnitTestSuite() {
  8. /**
  9. * Declares that this object is a JsUnitTestSuite
  10. */
  11. this.isJsUnitTestSuite = true;
  12. /**
  13. * @private
  14. */
  15. this._testPages = Array();
  16. /**
  17. * @private
  18. */
  19. this._pageIndex = 0;
  20.  
  21. for (var i = 0; i < arguments.length; i++) {
  22. if (arguments[i]._testPages) {
  23. this.addTestSuite(arguments[i]);
  24. } else {
  25. this.addTestPage(arguments[i]);
  26. }
  27. }
  28. }

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

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
  2. <html>
  3. <head>
  4. <title> New Document </title>
  5. <meta name="Generator" content="EditPlus">
  6. <meta name="Author" content="">
  7. <meta name="Keywords" content="">
  8. <meta name="Description" content="">
  9.  
  10. <script type="text/javascript" src="..\jsunit2_2\jsunit\app\jsUnitCore.js"></script>
  11.  
  12. <script type="text/javascript">
  13.  
  14. //测试套件名一定为suite
  15. function suite()
  16. {
  17. var testSuite = new top.jsUnitTestSuite();
  18.  
  19. // 增加的测试页面的路径是相对于测试运行器(testRunner.html)的路径
  20. // 而不是当前页面
  21. testSuite.addTestPage("../../jsUnit_code/test1.html");
  22. testSuite.addTestPage("../../jsUnit_code/test1.html");
  23. testSuite.addTestPage("../../jsUnit_code/test1.html");
  24.  
  25. return testSuite; // 最后需要返回套件
  26. }
  27. </script>
  28. </head>
  29.  
  30. <body>
  31.  
  32. </body>
  33. </html>

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

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
  2. <html>
  3. <head>
  4. <title> New Document </title>
  5. <meta name="Generator" content="EditPlus">
  6. <meta name="Author" content="">
  7. <meta name="Keywords" content="">
  8. <meta name="Description" content="">
  9.  
  10. <script type="text/javascript" src="..\jsunit2_2\jsunit\app\jsUnitCore.js"></script>
  11.  
  12. <script type="text/javascript">
  13.  
  14. // 自定义的测试套件
  15. function mySuite()
  16. {
  17. var testSuite = new top.jsUnitTestSuite();
  18.  
  19. testSuite.addTestPage("../../jsUnit_code/test1.html");
  20. testSuite.addTestPage("../../jsUnit_code/test1.html");
  21. testSuite.addTestPage("../../jsUnit_code/test1.html");
  22.  
  23. return testSuite;
  24. }
  25.  
  26. function suite()
  27. {
  28. var testSuite = new top.jsUnitTestSuite();
  29.  
  30. testSuite.addTestPage("../../jsUnit_code/test1.html"); // 在测试套件中加入页面
  31. testSuite.addTestSuite(mySuite()); // 在测试套件中加入测试套件
  32.  
  33. return testSuite; // 记得返回套件
  34. }
  35.  
  36. </script>
  37.  
  38. </head>
  39.  
  40. <body>
  41.  
  42. </body>
  43. </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. HTTP的长连接和短连接——Node上的测试

        本文主要从实践角度介绍长.短连接在TCP层面的表现,借助Node.JS搭建后台服务,使用WinHTTP.Ajax做客户端请求测试,最后简单涉及WebSocket.     关键字:长连接.短连 ...

  2. .NET平台机器学习组件-Infer.NET(三) Learner API—数据映射与序列化

             所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html 微软Infer.NET机器学习组件:http://www.cnblo ...

  3. android帧动画,移动位置,缩放,改变透明度等动画讲解

    1.苦逼的需求又来了,需要实现一些动画效果,第一个想到的是播放gif图片,但是这样会占包的资源,并且清晰度不高,于是想着程序实现,自己用帧动画+缩放+移动+透明度 实现了一些想要的效果,这里跟大家分享 ...

  4. 解决 android 高低版本 webView 里内容 自适应屏幕的终极方法

    转载请声明出处(http://www.cnblogs.com/linguanh/) 一,先说下我的情况,大家可以对号入座(嫌无聊请跳过) 我的项目要求是这样的,先从数据库里面拿出来html标签,因为加 ...

  5. 附录C 编译安装Hive

    如果需要直接安装Hive,可以跳过编译步骤,从Hive的官网下载编译好的安装包,下载地址为http://hive.apache.org/downloads.html . C.1  编译Hive C.1 ...

  6. Spinner控件

    首先在XML文件中声明一个Spinner控件: <Spinner android:id="@+id/spinnerId" android:layout_width=" ...

  7. 函数----Beginning Visual C#

    span.kw { color: #007020; font-weight: bold; } code > span.dt { color: #902000; } code > span. ...

  8. VS2015 打开html 提示 未能完成操作 解决办法

    删除%LocalAppData%\Microsoft\VisualStudio\14.0\ComponentModelCache下所有文件,然后重启VS. 快捷键:Win + R,输入 %LocalA ...

  9. 整数压缩编码 ZigZag

    在分析Avro源码时,发现Avro为了对int.long类型数据压缩,采用Protocol Buffers的ZigZag编码(Thrift也采用了ZigZag来压缩整数). 1. 补码编码 为了便于后 ...

  10. MySQL5.7不停业务将传统复制变更为GTID复制

      由于GTID的优势,我们需要将传统基于file-pos的复制更改为基于GTID的复制,如何在线变更成为我们关心的一个点,如下为具体的方法: 目前我们有一个传统复制下的M-S结构: port 330 ...