技术开发 频道

使用JsUnit和JSMock的JavaScript测试驱动开发

  【IT168技术文档】本文是一个速成班,介绍了如何编写可维护的JavaScript。我们向一个贯穿全文的例子中逐渐添加新功能,并遵循如下简单的规则:编写一个单元测试,然后让它通过。每个测试都起到质量反馈回路的作用,给那些想修改产品代码的人创建了一个安全保护网,以及一份可以执行的文档。通过简单、失败的测试开始每个功能,我们可以保证所有的功能都被测试覆盖到了。我们也避免了重写代码后再进行测试的高昂代价。考虑到JavaScript开发者很容易深陷泥沼、难以自拔的事实,这显得尤其难能可贵──只需要考虑一下DOM API和JavaScript语言本身之间有多少全局可变状态就够了。

  这个贯穿全文的例子是赌场的3轴老虎机。每轴有5种可能的状态,用图片来表示。当老虎机的play按钮被按下时,每个轴会随机给出一种状态。老虎机的余额根据三个轴的状态是否相等而增加或者减少。

  我们的工具有stubs、mock对象和一丁点的依赖注入。我们使用JsUnit运行单元测试,以及一个叫做JsMock的JavaScript mock对象库。集成测试──单元测试的补充,则超出了本文的范围。这并不意味着集成测试不重要──仅仅是因为我们希望得到更快的反馈,而不是从类似 Selenium和Watir这样的工具那里得到更慢、更全面的反馈。

  JsUnit,一个JavaScript单元测试框架

  JsUnit是JavaScript的开源单元测试框架。它受到JUnit的启发,并完全用JavaScript编写。作为最流行的 JavaScript单元测试框架,它还提供了一些ant任务,使开发人员在持续集成服务器上构建时很容易运行测试套件。持续集成是另外一个重要的实践, 其与TDD结合使用时是对质量的一个“强有力的保证”,不过这也超出了本文的范围。

  让我们从JsUnit的test runner开始吧。Test runner是一个普通的HTML和JavaScript web页面,意味着你的单元测试可以直接在浏览器或者你想支持的浏览器中运行。解压缩JsUnit下载文件,你就会在根目录下发现testRunner.html。你不需要通过web服务器访问它──只需要通过文件系统加载它进行浏览就可以了。

  Test runner最重要的控件是位于页面顶部的文件输入栏。这个控件意在获取一个指向测试页面或者测试页面套件的路径。现在我们看一个JsUnit测试页面的简单例子。

1 <html>
2 <title>A unit test for drw.SystemUnderTest class</title>
3 <head>
4   <script type='text/javascript' src='../jsunit/app/jsUnitCore.js'></script>
5   <script type='text/javascript' src='../app/system_under_test.js'></script>
6   <script type='text/javascript'>
7
8
9     function setUp(){
10       // perform fixture set up
11     }
12     function tearDown() {
13       // clean up
14     }
15     function testOneThing(){
16       // instantiating a SystemUnderTest, a class in the drw namespace
17       var sut = new drw.SystemUnderTest();
18       var thing = sut.oneThing();
19       assertEquals(1, thing);
20     }
21
22
23     function testAnotherThing(){
24       var sut = new drw.SystemUnderTest();
25       var thing = sut.anotherThing();
26       assertNotEquals(1, thing);
27     }
28   </script>
29 </head>
30 <body/>
31 </html>
32
0
相关文章