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/
JavaScript单元测试框架JsUnit基本介绍和使用的更多相关文章
- JavaScript单元测试框架-Jasmine
Jasmine的开发团队来自PivotalLabs,他们一开始开发的JavaScript测试框架是JsUnit,来源于著名的JAVA测试框架JUnit.JsUnit是xUnit的JavaScript实 ...
- Javascript单元测试框架比较Qunit VS Jasmine
Javascript单元测试框架比较Qunit VS Jasmine 工欲行其事必先利其器,好的单元测试框架是TDD成功的一半.Javascript优秀的测试框架很多, 包括Jasmine,Qunit ...
- javascript单元测试框架mochajs详解
关于单元测试的想法 对于一些比较重要的项目,每次更新代码之后总是要自己测好久,担心一旦上线出了问题影响的服务太多,此时就希望能有一个比较规范的测试流程.在github上看到牛逼的javascript开 ...
- javascript单元测试框架mochajs详解(转载)
章节目录 关于单元测试的想法 mocha单元测试框架简介 安装mocha 一个简单的例子 mocha支持的断言模块 同步代码测试 异步代码测试 promise代码测试 不建议使用箭头函数 钩子函数 钩 ...
- JavaScript单元测试框架:Jasmine
摘抄:http://blog.csdn.net/GuoJiangweigege/article/details/52130589 互联网的快速发展,给web开发人员带来了前所未有的挑战.对于前端开发, ...
- Junit4 单元测试框架的常用方法介绍
Junit 介绍: Junit是一套框架(用于JAVA语言),由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework),即 ...
- javascript单元测试(转)
1. 什么是单元测试 在计算机编程中,单元测试(又称为模块测试)是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作.程序单元是应用的最小可测试部件.在过程化编程中,一个单元就是单 ...
- (译)学习如何构建自动化、跨浏览器的JavaScript单元测试
作者:Philip Walton 译者:Yeaseon 原文链接:点此查看 译文仅供个人学习,不用于任何形式商业目的,转载请注明原作者.文章来源.翻译作者及链接,版权归原文作者所有. ___ 我们都知 ...
- [转]javascript单元测试
1. 什么是单元测试 在计算机编程中,单元测试(又称为模块测试)是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作.程序单元是应用的最小可测试部件.在过程化编程中,一个单元就是单 ...
随机推荐
- HTTP的长连接和短连接——Node上的测试
本文主要从实践角度介绍长.短连接在TCP层面的表现,借助Node.JS搭建后台服务,使用WinHTTP.Ajax做客户端请求测试,最后简单涉及WebSocket. 关键字:长连接.短连 ...
- .NET平台机器学习组件-Infer.NET(三) Learner API—数据映射与序列化
所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html 微软Infer.NET机器学习组件:http://www.cnblo ...
- android帧动画,移动位置,缩放,改变透明度等动画讲解
1.苦逼的需求又来了,需要实现一些动画效果,第一个想到的是播放gif图片,但是这样会占包的资源,并且清晰度不高,于是想着程序实现,自己用帧动画+缩放+移动+透明度 实现了一些想要的效果,这里跟大家分享 ...
- 解决 android 高低版本 webView 里内容 自适应屏幕的终极方法
转载请声明出处(http://www.cnblogs.com/linguanh/) 一,先说下我的情况,大家可以对号入座(嫌无聊请跳过) 我的项目要求是这样的,先从数据库里面拿出来html标签,因为加 ...
- 附录C 编译安装Hive
如果需要直接安装Hive,可以跳过编译步骤,从Hive的官网下载编译好的安装包,下载地址为http://hive.apache.org/downloads.html . C.1 编译Hive C.1 ...
- Spinner控件
首先在XML文件中声明一个Spinner控件: <Spinner android:id="@+id/spinnerId" android:layout_width=" ...
- 函数----Beginning Visual C#
span.kw { color: #007020; font-weight: bold; } code > span.dt { color: #902000; } code > span. ...
- VS2015 打开html 提示 未能完成操作 解决办法
删除%LocalAppData%\Microsoft\VisualStudio\14.0\ComponentModelCache下所有文件,然后重启VS. 快捷键:Win + R,输入 %LocalA ...
- 整数压缩编码 ZigZag
在分析Avro源码时,发现Avro为了对int.long类型数据压缩,采用Protocol Buffers的ZigZag编码(Thrift也采用了ZigZag来压缩整数). 1. 补码编码 为了便于后 ...
- MySQL5.7不停业务将传统复制变更为GTID复制
由于GTID的优势,我们需要将传统基于file-pos的复制更改为基于GTID的复制,如何在线变更成为我们关心的一个点,如下为具体的方法: 目前我们有一个传统复制下的M-S结构: port 330 ...