• JsUnit && JUnit之讲解


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

    Js代码  收藏代码
    1. function add(num1,num2){  
    2.     return num1 + num2;  
    3. }  
    4.   
    5. function minus(num1,num2){  
    6.     return num1 - num2;  
    7. }  
    8.   
    9. function multiply(num1,num2){  
    10.     return num1 * num2;  
    11. }  
    12.   
    13. function divide(num1,num2){  
    14.     return num1 / num2;  
    15. }  


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

    Html代码  收藏代码
    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="jsunitappjsUnitCore.js"></script>  
    8. <script type="text/javascript">  
    9. <!--  
    10. function testAdd(){  
    11.     var result = add(4,2)  
    12.     assertEquals(6,result);  
    13. }  
    14.   
    15. function testMinus(){  
    16.     var result = minus(4,2)  
    17.     assertEquals(2,result);  
    18. }  
    19.   
    20. function testMultiply(){  
    21.     var result = multiply(4,2)  
    22.     assertEquals(8,result);  
    23. }  
    24.   
    25. function testDivide(){  
    26.     var result = divide(4,2)  
    27.     assertEquals("4 divide 2 is 2",2,result);  
    28. }  
    29.   
    30. //-->  
    31. </SCRIPT>  
    32.  <BODY>  
    33.     
    34.  </BODY>  
    35. </HTML>  


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

    2 setUp()与tearDown()
    JsUnit也支持setUp()和tearDown()。JsUnit与JUnit有一点是一样的,即setUp()和tearDown()是可选的,而且setUp()会在每个测试之前调用,tearDown()会在每个测试之后调用。
    我们可以在测试页面中加入setUp()和tearDown()的方法。

    Js代码  收藏代码
    1. function setUp(){  
    2.     alert("setUp");  
    3. }  
    4.   
    5. function tearDown(){  
    6.     alert("tearDown");  
    7. }  


    JUnit与JsUnit中setUp()和tearDown()方法的重要区别:
    在JUnit中,每次测试运行会导致创建Test类的一个新实例,这说明,声明的所有实例变量在下一次测试运行时会“重置”。
    JsUnit有所不同,它不会为每次测试运行重新加载测试页,所以变量状态会在多次测试之间保留。
    还有一个重要区别与测试顺序有关,使用JUnit的话,测试执行的顺序是不能保证的。在JsUnit中,测试会按测试页中声明的顺序执行,先从最上面的测试开始。
    虽然区别如此,但我们应该了解每个测试用例都是应该相互独立的,不能真的顺序来调整我们的用例

    下面是一个具体例子。
    这里我们将函数和测试用例都写在一起了,在实际测试中应该避免

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



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

    Html代码  收藏代码
    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="jsunitappjsUnitCore.js"></script>  
    8. <script type="text/javascript">  
    9. <!--  
    10. function testAdd(){  
    11.     var result = add(arg1,arg2)  
    12.     assertEquals(6,result);  
    13. }  
    14.   
    15. function testMinus(){  
    16.     var result = minus(arg1,arg2)  
    17.     assertEquals(2,result);  
    18. }  
    19.   
    20. function testMultiply(){  
    21.     var result = multiply(arg1,arg2)  
    22.     assertEquals(8,result);  
    23. }  
    24.   
    25. function testDivide(){  
    26.     var result = divide(arg1,arg2)  
    27.     assertEquals("4 divide 2 is 2",2,result);  
    28. }  
    29.   
    30. function setUpPage(){  
    31.     arg1 = 4;  
    32.     arg2 = 2;  
    33.     setUpPageStatus = "complete";  
    34. }  
    35.   
    36. //-->  
    37. </SCRIPT>  
    38.  <BODY>  
    39.  </BODY>  
    40. </HTML>  



    4 exposeTestFunctionNames()函数显示的声明我们的测试方法
    JsUnit会自动发现测试函数,就像JUnit会发现所有测试方法一样。
    有些操作系统/浏览器不能合作。如果你发现不能如你所愿地发现测试函数,使用exposeTestFunctionNames()方法就能解决这个问题。
    在测试页面里定义exposeTestFunctionNames方法,jsunit运行器在执行时会寻找exposeTestFunctionNames方法,只执行在此方法内指定的方法;
    我们还是已第一个例子为例
    可以变为

    Html代码  收藏代码
    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="jsunitappjsUnitCore.js"></script>  
    8. <script type="text/javascript">  
    9. <!--  
    10. function testAdd(){  
    11.     var result = add(arg1,arg2)  
    12.     assertEquals(6,result);  
    13. }  
    14.   
    15. function testMinus(){  
    16.     var result = minus(arg1,arg2)  
    17.     assertEquals(2,result);  
    18. }  
    19.   
    20. function testMultiply(){  
    21.     var result = multiply(arg1,arg2)  
    22.     assertEquals(8,result);  
    23. }  
    24.   
    25. function testDivide(){  
    26.     var result = divide(arg1,arg2)  
    27.     assertEquals("4 divide 2 is 2",2,result);  
    28. }  
    29.   
    30. function setUpPage(){  
    31.     arg1 = 4;  
    32.     arg2 = 2;  
    33.     setUpPageStatus = "complete";  
    34. }  
    35.   
    36. function exposeTestFunctionNames(){  
    37.     var tests = new Array();  
    38.     tests[0]="testAdd";  
    39.     tests[1]="testMinus";  
    40.     tests[2]="testMultiply";  
    41.     return tests;  
    42. }  
    43.   
    44. //-->  
    45. </SCRIPT>  
    46.  <BODY>  
    47.     
    48.  </BODY>  
    49. </HTML>  



    5 jsUnit的日志跟踪
    jsUuit的日志跟踪有3各级别:warn、info和debug
    看下面的例子就知道了

    Html代码  收藏代码
    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="jsunitappjsUnitCore.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.   
    18. function testMinus(){  
    19.     var result = minus(arg1,arg2)  
    20.     assertEquals(2,result);  
    21. }  
    22.   
    23. function testMultiply(){  
    24.     var result = multiply(arg1,arg2)  
    25.     assertEquals(8,result);  
    26. }  
    27.   
    28. function testDivide(){  
    29.     var result = divide(arg1,arg2)  
    30.     assertEquals("4 divide 2 is 2",2,result);  
    31. }  
    32.   
    33. function setUpPage(){  
    34.     arg1 = 4;  
    35.     arg2 = 2;  
    36.     setUpPageStatus = "complete";  
    37. }  
    38.   
    39. function exposeTestFunctionNames(){  
    40.     var tests = new Array();  
    41.     tests[0]="testAdd";  
    42.     tests[1]="testMinus";  
    43.     tests[2]="testMultiply";  
    44.     return tests;  
    45. }  
    46.   
    47. //-->  
    48. </SCRIPT>  
    49.  <BODY>  
    50.     
    51.  </BODY>  
    52. </HTML>  


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

    6 测试套件(suit test)
    测试集是为了把不同的测试页分组组织,其中可以包含测试页或其他测试集,他们会按照顺序执行。
    注意点:
    测试集中不能包含任何测试函数
    必须包含一个返回 jsUnitTestSuite 对象的 suite 函数
    有两个方法添加测试页:addTestPage(testPage) addTestSuite(testSuite), 在添加测试页时要注意路径,应是相对于testRunner.html的。
    测试集的名称必须是suit()

    Html代码  收藏代码
    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="jsunitappjsUnitCore.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. //-->  
    26. </SCRIPT>  
    27.  <BODY>  
    28.     
    29.  </BODY>  
    30. </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

  • 相关阅读:
    如何导出和导入mysql数据(数据迁移)
    C# exe dll防止反编译-- dotNET_Reactor
    C#防止反编译
    WCF异常相关
    了解WCF的前世今生之实现服务端(一)
    svn忽略文件后缀
    马云给年轻人的10句忠告 真的后悔才看到!
    如何利用好清晨与夜间的时间?
    浙江旅游好去处
    突然觉得生活好累......
  • 原文地址:https://www.cnblogs.com/milantgh/p/3652996.html
Copyright © 2020-2023  润新知