拥抱JsUnit

拥抱JsUnit
以往在测试js的时候,都是以alert方式来检测错误,很不专业,今天发现竟然有jsunit这个测试工具,感觉非常不错。
废话不说了,是骡子是马拉出来溜溜再说。

1 简单入门实例
首先我们定义我们的函数
这里以最简单的加减乘除四个方法来进行测试
建立我们的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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值