JsUnit && JUnit之讲解
首先我们定义我们的函数
这里以最简单的加减乘除四个方法来进行测试
建立我们的js文件myjs.js
- function add(num1,num2){
- return num1 + num2;
- }
- function minus(num1,num2){
- return num1 - num2;
- }
- function multiply(num1,num2){
- return num1 * num2;
- }
- function divide(num1,num2){
- return num1 / num2;
- }
建立我们的测试用例,mytest1.html
我们将建立四个测试方法,jsUnit的测试方法必须以test开头。
下面我们对myjs.js中的加减乘除四个函数进行测试,
下面是jsUnit给我们提供的断言方式 [comment] 是可选的 表示断言出错的时候给出的提示
assert([comment], booleanValue)
assertTrue([comment], booleanValue)
assertFalse([comment], booleanValue)
assertEquals([comment], value1, value2)
assertNotEquals([comment], value1, value2)
assertNull([comment], value)
assertNotNull([comment], value)
assertUndefined([comment], value)
assertNotUndefined([comment], value)
assertNaN([comment], value)
assertNotNaN([comment], value)
fail(comment)
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
- <HTML>
- <HEAD>
- <TITLE>testHtml</TITLE>
- </HEAD>
- <script type="text/javascript" src="myjs.js"></script>
- <script type="text/javascript" src="jsunit\app\jsUnitCore.js"></script>
- <script type="text/javascript">
- <!--
- function testAdd(){
- var result = add(4,2)
- assertEquals(6,result);
- }
- function testMinus(){
- var result = minus(4,2)
- assertEquals(2,result);
- }
- function testMultiply(){
- var result = multiply(4,2)
- assertEquals(8,result);
- }
- function testDivide(){
- var result = divide(4,2)
- assertEquals("4 divide 2 is 2",2,result);
- }
- //-->
- </SCRIPT>
- <BODY>
- </BODY>
- </HTML>
我们通过jsunit给我们提供的测试运行器testRunner.html来进行测试
2 setUp()与tearDown()
JsUnit也支持setUp()和tearDown()。JsUnit与JUnit有一点是一样的,即setUp()和tearDown()是可选的,而且setUp()会在每个测试之前调用,tearDown()会在每个测试之后调用。
我们可以在测试页面中加入setUp()和tearDown()的方法。
- function setUp(){
- alert("setUp");
- }
- function tearDown(){
- alert("tearDown");
- }
JUnit与JsUnit中setUp()和tearDown()方法的重要区别:
在JUnit中,每次测试运行会导致创建Test类的一个新实例,这说明,声明的所有实例变量在下一次测试运行时会“重置”。
JsUnit有所不同,它不会为每次测试运行重新加载测试页,所以变量状态会在多次测试之间保留。
还有一个重要区别与测试顺序有关,使用JUnit的话,测试执行的顺序是不能保证的。在JsUnit中,测试会按测试页中声明的顺序执行,先从最上面的测试开始。
虽然区别如此,但我们应该了解每个测试用例都是应该相互独立的,不能真的顺序来调整我们的用例
下面是一个具体例子。
这里我们将函数和测试用例都写在一起了,在实际测试中应该避免
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
- <HTML>
- <HEAD>
- <TITLE></TITLE>
- <script type="text/javascript" src="jsunit\app\jsUnitCore.js"></script>
- </HEAD>
- <BODY>
- <script language="JavaScript">
- //原函数
- function addTwoNumbers(value1, value2) {
- return parseInt(value1) + parseInt(value2);
- }
- function addNumbers() {
- var val1 = document.getElementById("value1").value;
- var val2 = document.getElementById("value2").value;
- return addTwoNumbers(val1, val2);
- }
- //初始化测试数据
- function setUp() {
- document.getElementById("value1").value = "2";
- document.getElementById("value2").value = "2";
- }
- //测试方法
- function testValidArgs() {
- assertEquals("2 + 2 should equal 4", 4, addNumbers());
- }
- //清空测试数据
- function tearDown() {
- document.getElementById("value1").value = "";
- document.getElementById("value2").value = "";
- }
- </script>
- <form id="test">
- <input type="text" size="3" id="value1"/>
- <input type="text" size="3" id="value2"/>
- <input type="button" value="Add" onclick="addNumbers()"/>
- </form>
- </body>
- </html>
- </BODY>
- </HTML>
3 setUpPage()函数
setUpPage()函数只对每个测试页调用一次,即在所有测试函数调用之前调用。现在,你可能已经发现,这里很适合完成预处理,特别是在运行
测试之前如果需要向页面加载一些数据,setUpPage()函数就非常有用。不同于setUp()和tearDown()函数的是,使用
setUpPage()不只是把处理放在这个函数中就行了的。如果确实选择使用这个特性,一定要保证函数完成时要把setUpPageStatus变量设
置为complete,这就告诉JsUnit可以继续,接下来可以执行测试页上的测试了。
我们更改第一个实例来看看结果
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
- <HTML>
- <HEAD>
- <TITLE>testHtml</TITLE>
- </HEAD>
- <script type="text/javascript" src="myjs.js"></script>
- <script type="text/javascript" src="jsunit\app\jsUnitCore.js"></script>
- <script type="text/javascript">
- <!--
- function testAdd(){
- var result = add(arg1,arg2)
- assertEquals(6,result);
- }
- function testMinus(){
- var result = minus(arg1,arg2)
- assertEquals(2,result);
- }
- function testMultiply(){
- var result = multiply(arg1,arg2)
- assertEquals(8,result);
- }
- function testDivide(){
- var result = divide(arg1,arg2)
- assertEquals("4 divide 2 is 2",2,result);
- }
- function setUpPage(){
- arg1 = 4;
- arg2 = 2;
- setUpPageStatus = "complete";
- }
- //-->
- </SCRIPT>
- <BODY>
- </BODY>
- </HTML>
4 exposeTestFunctionNames()函数显示的声明我们的测试方法
JsUnit会自动发现测试函数,就像JUnit会发现所有测试方法一样。
有些操作系统/浏览器不能合作。如果你发现不能如你所愿地发现测试函数,使用exposeTestFunctionNames()方法就能解决这个问题。
在测试页面里定义exposeTestFunctionNames方法,jsunit运行器在执行时会寻找exposeTestFunctionNames方法,只执行在此方法内指定的方法;
我们还是已第一个例子为例
可以变为
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
- <HTML>
- <HEAD>
- <TITLE>testHtml</TITLE>
- </HEAD>
- <script type="text/javascript" src="myjs.js"></script>
- <script type="text/javascript" src="jsunit\app\jsUnitCore.js"></script>
- <script type="text/javascript">
- <!--
- function testAdd(){
- var result = add(arg1,arg2)
- assertEquals(6,result);
- }
- function testMinus(){
- var result = minus(arg1,arg2)
- assertEquals(2,result);
- }
- function testMultiply(){
- var result = multiply(arg1,arg2)
- assertEquals(8,result);
- }
- function testDivide(){
- var result = divide(arg1,arg2)
- assertEquals("4 divide 2 is 2",2,result);
- }
- function setUpPage(){
- arg1 = 4;
- arg2 = 2;
- setUpPageStatus = "complete";
- }
- function exposeTestFunctionNames(){
- var tests = new Array();
- tests[0]="testAdd";
- tests[1]="testMinus";
- tests[2]="testMultiply";
- return tests;
- }
- //-->
- </SCRIPT>
- <BODY>
- </BODY>
- </HTML>
5 jsUnit的日志跟踪
jsUuit的日志跟踪有3各级别:warn、info和debug
看下面的例子就知道了
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
- <HTML>
- <HEAD>
- <TITLE>testHtml</TITLE>
- </HEAD>
- <script type="text/javascript" src="myjs.js"></script>
- <script type="text/javascript" src="jsunit\app\jsUnitCore.js"></script>
- <script type="text/javascript">
- <!--
- function testAdd(){
- var result = add(arg1,arg2);
- warn("result", result);
- debug("result", result);
- info("result", result);
- assertEquals(6,result);
- }
- function testMinus(){
- var result = minus(arg1,arg2)
- assertEquals(2,result);
- }
- function testMultiply(){
- var result = multiply(arg1,arg2)
- assertEquals(8,result);
- }
- function testDivide(){
- var result = divide(arg1,arg2)
- assertEquals("4 divide 2 is 2",2,result);
- }
- function setUpPage(){
- arg1 = 4;
- arg2 = 2;
- setUpPageStatus = "complete";
- }
- function exposeTestFunctionNames(){
- var tests = new Array();
- tests[0]="testAdd";
- tests[1]="testMinus";
- tests[2]="testMultiply";
- return tests;
- }
- //-->
- </SCRIPT>
- <BODY>
- </BODY>
- </HTML>
在测试运行器中选择Trace level的级别就可以看到相应的日志信息了
6 测试套件(suit test)
测试集是为了把不同的测试页分组组织,其中可以包含测试页或其他测试集,他们会按照顺序执行。
注意点:
测试集中不能包含任何测试函数
必须包含一个返回 jsUnitTestSuite 对象的 suite 函数
有两个方法添加测试页:addTestPage(testPage) addTestSuite(testSuite), 在添加测试页时要注意路径,应是相对于testRunner.html的。
测试集的名称必须是suit()
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
- <HTML>
- <HEAD>
- <TITLE>suit test</TITLE>
- </HEAD>
- <script type="text/javascript" src="jsunit\app\jsUnitCore.js"></script>
- <script type="text/javascript">
- <!--
- function suite()
- {
- var testSuite = new top.jsUnitTestSuite();
- //增加的测试页面的路径是相对于测试运行器的路径的(testRunner.html),而不是相对于当前的页面
- testSuite.addTestPage("../mytest1.html");
- //套件里还可以在包含套件
- testSuite.addTestSuite(Suite2());
- return testSuite;
- }
- function Suite2() //需要与suite定义在同一个页面中
- {
- var testSuite = new top.jsUnitTestSuite();
- testSuite.addTestPage("../mytest2.html");
- return testSuite;
- }
- //-->
- </SCRIPT>
- <BODY>
- </BODY>
- </HTML>
7 通过浏览器完成自动测试
file:///D:/mytest/jsunit/testRunner.html?testPage=D:/mytest/mytest1.html&autoRun=true
个人感觉没有实际意义
8 采用ant方式完成自动测试
首先进入jsunit目录,build.xml是junit定义好的模板,我们只需要简单的添加就可以了。
配置property属性
browserFileNames:浏览器地址;多个可以用逗号隔开;
closeBrowsersAfterTestRuns:执行测试后,是否关闭浏览器;默认true
logsDirectory:日志存放目录
url:测试文件地址;如:
file:///c:/jsunit/testRunner.html?testPage=c:/jsunit/tests/jsUnitTestSuite.html
在控制台下进入相关目录运行ant standalone_test 即可。
standalone_test是在单机上行运行测试;
distributed_test:是分布式远程测试;
ant不能执行或者执行出错:
查看环境变量
path下是否有java与ant的bin
是否设置Java_Home
JsUnit && JUnit之讲解的更多相关文章
- 走进JavaWeb技术世界11:单元测试框架Junit
JUnit你不知道的那些事儿 转自 老刘 码农翻身 2016-02-24 话说有一次Eric Gamma 坐飞机的时候偶遇Kent Beck(对,就是极限编程和TDD的发起人) , 两位大牛见面寒暄 ...
- 「译」JUnit 5 系列:条件测试
原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...
- 「译」JUnit 5 系列:环境搭建
原文地址:http://blog.codefx.org/libraries/junit-5-setup/ 原文日期:15, Feb, 2016 译文首发:Linesh 的博客:环境搭建 我的 Gith ...
- 「译」JUnit 5 系列:扩展模型(Extension Model)
原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...
- JavaScript单元测试框架JsUnit基本介绍和使用
JavaScript单元测试框架JsUnit基本介绍和使用 XUnit framework XUnit是一套标准化的独立于语言的概念和结构集合,用于编写和运行单元测试(Unit tests). 每一个 ...
- IntelliJ IDEA 教程设置讲解
IntelliJ IDEA 常用设置讲解 说明 IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手.代码自动提示.重构.J2EE支持.Ant.JUnit.CVS整合.代码审查 ...
- 安卓下如何使用JUnit进行软件测试
软件测试作为程序员必备的一项技能是决定软件开发周期长短以及软件运行成败的关键,可以说好的软件不是代码写得好而是有效的测试决定的.本文将介绍在android下利用eclipse进行开发时如何使用JUni ...
- Maven聚合与继承的实例讲解(一)
概述 在javaweb高速发展的今天,我们软件设计人员往往会用很多种方式对软件划分模块,目的就是为了能有清晰的设计和低耦合性的,高重用性的软件.Maven有很好的依赖管理系统(Dependency M ...
- Java知识积累——单元测试和JUnit(一)
说起单元测试,刚毕业或者没毕业的人可能大多停留在课本讲述的定义阶段,至于具体是怎么定义的,估计也不会有太多人记得.我们的教育总是这样让人“欣 慰”.那么什么是单元测试呢?具体科学的定义咱就不去关心了, ...
随机推荐
- webshell + xss 猥琐刷某投票
团队成员发来一个投票的地址,需要撸某某网站的一个某某投票,果断看了下,ip限制了,看到post 数据包 额 随便找个大流量shell post 数据 Js代码代码 <script type=&q ...
- .Net并行编程
1.什么是线程?线程和进程的区别是什么? 线程是程序执行的最小单元. 区别: 进程是操作系统进行资源处理和分配的最小单位,而一个进程可以包含多个线程,并共享进程的资源. 2.什么是多线程?为什么设计多 ...
- C# 平时碰见的问题【1】
1. SqlBulkCopy 可以利用这个类实现快速大批量新增数据的效果, 但在使用过程中发现了一个问题: 无法将数据源中的DateTime类型转换成数据库中的int类型 看起来就是数据列不对应导致的 ...
- 配置《算法 第四版》的Eclipse开发环境
1. 安装JAVA JAVA网址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 配置环境变量(我把JAVA安装在 ...
- 使用 libevent 和 libev 提高网络应用性能——I/O模型演进变化史
构建现代的服务器应用程序需要以某种方法同时接收数百.数千甚至数万个事件,无论它们是内部请求还是网络连接,都要有效地处理它们的操作. 有许多解决方案,但事件驱动也被广泛应用到网络编程中.并大规模部署在高 ...
- poj 2887 Big String
题目连接 http://poj.org/problem?id=2887 Big String Description You are given a string and supposed to do ...
- xcode 产生指定颜色的图片imageWithColor
是在万能的stackOverflow上找到的答案,留下了, 原地址:http://stackoverflow.com/questions/6496441/creating-a-uiimage-from ...
- .Net开源数据库设计工具Mr.E For Linq (EF 6.1) 教程(二)级联删除和触发器
1.建立级联删除 Mr.E的级联删除并非数据库自带那个级联删除,而是Mr.E自带的,所以它能触发你C#里面编写的触发器. 首先,建立级联删除关系,如下图有两个表,UserInfo和UserDocume ...
- EF6 在原有数据库中使用 CodeFirst 总复习(四、新建实体对象)
在原有数据库中使用 CodeFirst ,除了第一次添加实体后要立即执行一次 Enable-Migrations add-migration Initial -IgnoreChanges updat ...
- html <input>标签类型属性type(file、text、radio、hidden等)详细介绍
html <input>标签类型属性type(file.text.radio.hidden等)详细介绍 转载请注明:文章转载自:[169IT-最新最全的IT资讯] html <inp ...