JsUnit && JUnit之讲解

首先我们定义我们的函数
这里以最简单的加减乘除四个方法来进行测试

建立我们的js文件myjs.js

  1. function add(num1,num2){
  2. return num1 + num2;
  3. }
  4. function minus(num1,num2){
  5. return num1 - num2;
  6. }
  7. function multiply(num1,num2){
  8. return num1 * num2;
  9. }
  10. function divide(num1,num2){
  11. return num1 / num2;
  12. }

建立我们的测试用例,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)

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
  2. <HTML>
  3. <HEAD>
  4. <TITLE>testHtml</TITLE>
  5. </HEAD>
  6. <script type="text/javascript" src="myjs.js"></script>
  7. <script type="text/javascript" src="jsunit\app\jsUnitCore.js"></script>
  8. <script type="text/javascript">
  9. <!--
  10. function testAdd(){
  11. var result = add(4,2)
  12. assertEquals(6,result);
  13. }
  14. function testMinus(){
  15. var result = minus(4,2)
  16. assertEquals(2,result);
  17. }
  18. function testMultiply(){
  19. var result = multiply(4,2)
  20. assertEquals(8,result);
  21. }
  22. function testDivide(){
  23. var result = divide(4,2)
  24. assertEquals("4 divide 2 is 2",2,result);
  25. }
  26. //-->
  27. </SCRIPT>
  28. <BODY>
  29. </BODY>
  30. </HTML>

我们通过jsunit给我们提供的测试运行器testRunner.html来进行测试

2 setUp()与tearDown()

JsUnit也支持setUp()和tearDown()。JsUnit与JUnit有一点是一样的,即setUp()和tearDown()是可选的,而且setUp()会在每个测试之前调用,tearDown()会在每个测试之后调用。

我们可以在测试页面中加入setUp()和tearDown()的方法。

  1. function setUp(){
  2. alert("setUp");
  3. }
  4. function tearDown(){
  5. alert("tearDown");
  6. }

JUnit与JsUnit中setUp()和tearDown()方法的重要区别:

在JUnit中,每次测试运行会导致创建Test类的一个新实例,这说明,声明的所有实例变量在下一次测试运行时会“重置”。

JsUnit有所不同,它不会为每次测试运行重新加载测试页,所以变量状态会在多次测试之间保留。

还有一个重要区别与测试顺序有关,使用JUnit的话,测试执行的顺序是不能保证的。在JsUnit中,测试会按测试页中声明的顺序执行,先从最上面的测试开始。

虽然区别如此,但我们应该了解每个测试用例都是应该相互独立的,不能真的顺序来调整我们的用例

下面是一个具体例子。

这里我们将函数和测试用例都写在一起了,在实际测试中应该避免

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
  2. <HTML>
  3. <HEAD>
  4. <TITLE></TITLE>
  5. <script type="text/javascript" src="jsunit\app\jsUnitCore.js"></script>
  6. </HEAD>
  7. <BODY>
  8. <script language="JavaScript">
  9. //原函数
  10. function addTwoNumbers(value1, value2) {
  11. return parseInt(value1) + parseInt(value2);
  12. }
  13. function addNumbers() {
  14. var val1 = document.getElementById("value1").value;
  15. var val2 = document.getElementById("value2").value;
  16. return addTwoNumbers(val1, val2);
  17. }
  18. //初始化测试数据
  19. function setUp() {
  20. document.getElementById("value1").value = "2";
  21. document.getElementById("value2").value = "2";
  22. }
  23. //测试方法
  24. function testValidArgs() {
  25. assertEquals("2 + 2 should equal 4", 4, addNumbers());
  26. }
  27. //清空测试数据
  28. function tearDown() {
  29. document.getElementById("value1").value = "";
  30. document.getElementById("value2").value = "";
  31. }
  32. </script>
  33. <form id="test">
  34. <input type="text" size="3" id="value1"/>
  35. <input type="text" size="3" id="value2"/>
  36. <input type="button" value="Add" onclick="addNumbers()"/>
  37. </form>
  38. </body>
  39. </html>
  40. </BODY>
  41. </HTML>

3 setUpPage()函数

setUpPage()函数只对每个测试页调用一次,即在所有测试函数调用之前调用。现在,你可能已经发现,这里很适合完成预处理,特别是在运行
测试之前如果需要向页面加载一些数据,setUpPage()函数就非常有用。不同于setUp()和tearDown()函数的是,使用
setUpPage()不只是把处理放在这个函数中就行了的。如果确实选择使用这个特性,一定要保证函数完成时要把setUpPageStatus变量设
置为complete,这就告诉JsUnit可以继续,接下来可以执行测试页上的测试了。

我们更改第一个实例来看看结果

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
  2. <HTML>
  3. <HEAD>
  4. <TITLE>testHtml</TITLE>
  5. </HEAD>
  6. <script type="text/javascript" src="myjs.js"></script>
  7. <script type="text/javascript" src="jsunit\app\jsUnitCore.js"></script>
  8. <script type="text/javascript">
  9. <!--
  10. function testAdd(){
  11. var result = add(arg1,arg2)
  12. assertEquals(6,result);
  13. }
  14. function testMinus(){
  15. var result = minus(arg1,arg2)
  16. assertEquals(2,result);
  17. }
  18. function testMultiply(){
  19. var result = multiply(arg1,arg2)
  20. assertEquals(8,result);
  21. }
  22. function testDivide(){
  23. var result = divide(arg1,arg2)
  24. assertEquals("4 divide 2 is 2",2,result);
  25. }
  26. function setUpPage(){
  27. arg1 = 4;
  28. arg2 = 2;
  29. setUpPageStatus = "complete";
  30. }
  31. //-->
  32. </SCRIPT>
  33. <BODY>
  34. </BODY>
  35. </HTML>

4 exposeTestFunctionNames()函数显示的声明我们的测试方法

JsUnit会自动发现测试函数,就像JUnit会发现所有测试方法一样。

有些操作系统/浏览器不能合作。如果你发现不能如你所愿地发现测试函数,使用exposeTestFunctionNames()方法就能解决这个问题。

在测试页面里定义exposeTestFunctionNames方法,jsunit运行器在执行时会寻找exposeTestFunctionNames方法,只执行在此方法内指定的方法;

我们还是已第一个例子为例

可以变为

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
  2. <HTML>
  3. <HEAD>
  4. <TITLE>testHtml</TITLE>
  5. </HEAD>
  6. <script type="text/javascript" src="myjs.js"></script>
  7. <script type="text/javascript" src="jsunit\app\jsUnitCore.js"></script>
  8. <script type="text/javascript">
  9. <!--
  10. function testAdd(){
  11. var result = add(arg1,arg2)
  12. assertEquals(6,result);
  13. }
  14. function testMinus(){
  15. var result = minus(arg1,arg2)
  16. assertEquals(2,result);
  17. }
  18. function testMultiply(){
  19. var result = multiply(arg1,arg2)
  20. assertEquals(8,result);
  21. }
  22. function testDivide(){
  23. var result = divide(arg1,arg2)
  24. assertEquals("4 divide 2 is 2",2,result);
  25. }
  26. function setUpPage(){
  27. arg1 = 4;
  28. arg2 = 2;
  29. setUpPageStatus = "complete";
  30. }
  31. function exposeTestFunctionNames(){
  32. var tests = new Array();
  33. tests[0]="testAdd";
  34. tests[1]="testMinus";
  35. tests[2]="testMultiply";
  36. return tests;
  37. }
  38. //-->
  39. </SCRIPT>
  40. <BODY>
  41. </BODY>
  42. </HTML>

5 jsUnit的日志跟踪

jsUuit的日志跟踪有3各级别:warn、info和debug

看下面的例子就知道了

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
  2. <HTML>
  3. <HEAD>
  4. <TITLE>testHtml</TITLE>
  5. </HEAD>
  6. <script type="text/javascript" src="myjs.js"></script>
  7. <script type="text/javascript" src="jsunit\app\jsUnitCore.js"></script>
  8. <script type="text/javascript">
  9. <!--
  10. function testAdd(){
  11. var result = add(arg1,arg2);
  12. warn("result", result);
  13. debug("result", result);
  14. info("result", result);
  15. assertEquals(6,result);
  16. }
  17. function testMinus(){
  18. var result = minus(arg1,arg2)
  19. assertEquals(2,result);
  20. }
  21. function testMultiply(){
  22. var result = multiply(arg1,arg2)
  23. assertEquals(8,result);
  24. }
  25. function testDivide(){
  26. var result = divide(arg1,arg2)
  27. assertEquals("4 divide 2 is 2",2,result);
  28. }
  29. function setUpPage(){
  30. arg1 = 4;
  31. arg2 = 2;
  32. setUpPageStatus = "complete";
  33. }
  34. function exposeTestFunctionNames(){
  35. var tests = new Array();
  36. tests[0]="testAdd";
  37. tests[1]="testMinus";
  38. tests[2]="testMultiply";
  39. return tests;
  40. }
  41. //-->
  42. </SCRIPT>
  43. <BODY>
  44. </BODY>
  45. </HTML>

在测试运行器中选择Trace level的级别就可以看到相应的日志信息了

6 测试套件(suit test)

测试集是为了把不同的测试页分组组织,其中可以包含测试页或其他测试集,他们会按照顺序执行。

注意点:

测试集中不能包含任何测试函数

必须包含一个返回 jsUnitTestSuite 对象的 suite 函数

有两个方法添加测试页:addTestPage(testPage) addTestSuite(testSuite), 在添加测试页时要注意路径,应是相对于testRunner.html的。

测试集的名称必须是suit()

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
  2. <HTML>
  3. <HEAD>
  4. <TITLE>suit test</TITLE>
  5. </HEAD>
  6. <script type="text/javascript" src="jsunit\app\jsUnitCore.js"></script>
  7. <script type="text/javascript">
  8. <!--
  9. function suite()
  10. {
  11. var testSuite = new top.jsUnitTestSuite();
  12. //增加的测试页面的路径是相对于测试运行器的路径的(testRunner.html),而不是相对于当前的页面
  13. testSuite.addTestPage("../mytest1.html");
  14. //套件里还可以在包含套件
  15. testSuite.addTestSuite(Suite2());
  16. return testSuite;
  17. }
  18. function Suite2() //需要与suite定义在同一个页面中
  19. {
  20. var testSuite = new top.jsUnitTestSuite();
  21. testSuite.addTestPage("../mytest2.html");
  22. return testSuite;
  23. }
  24. //-->
  25. </SCRIPT>
  26. <BODY>
  27. </BODY>
  28. </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

上一篇:FineReport根据点击次数奇偶性排序之字符型


下一篇:Android--带你一点点封装项目 MVP+BaseActivity+Retrofit+Dagger+RxJava(一)