继上一篇理论,本篇重点说明实践,包括nodejs中异步、promises、私有方法、mock及web等的测试方法。
以下示例均基于mocha.
在异步操作完成时,调用回调(通常是 <code>done</code>) 即可。
mocha的超时设定默认是2s,如果执行的测试超过2s的话,就会报timeout错误。可以修改超时时间,有两种方法:
命令行式
api式
一般测试只测试接口或公共方法,并不直接测试私有方法。但是如果当私有方法特别多且复杂时,测试私有方法比测试接口或公共方法更直接、有效。
严格上讲,javascript并没有私有方法的概念,这里所讨论的私有方法指未被导出(<code>exports</code>)的方法。
一个简单的盒子,在一个 <code>cal.js</code> 里有一个 <code>add</code> 方法,如下所示:
rewire adds a special setter and getter to modules so you can modify their behaviour for better unit testing.
获取上面的私有方法,并测试:
除了获取私有方法,<code>rewire</code> 还可以设置私有变量或方法, 以便测试。
比如有这样一个模块,
设置并获取私有变量。
还可以用作mock。
需要测试的方法:
spy
stubs
mocks
持续集成(ci, continuous integration)是一种软件开发实践,即团队开发成员经常集成它们的工作。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。
代码风格检查同样也可以集成到 ci,只需要在 <code>ci</code> 命令前追加检查命令即可。以 eslint 为例:
此时构建会先做代码风格检查,再做单元测试、覆盖率统计,如代码风格检查失败,会直接导致构建中断。
原本计划写一个nodejs的测试参考,帮助还不太了解nodejs测试的同学快速入门,在写的过程中才发现,需要的东西太多,而自己又知道的太少。虽然在一个应用的测试中覆盖率达到了90%,但并不代码在测试方面可以拿到90分。
正如前面写到的,”剩下的10,还有很长的路“,甚至比从0到90更长,唯有不断的学习才能进一步提升,希望自己还能再写个下篇《nodejs测试:从90到100》。
<a href="http://mochajs.org/">mocha</a>
<a href="http://qunitjs.com/">qunit</a>
<a href="http://jasmine.github.io/">jasmine</a>
<a href="http://karma-runner.github.io/0.12/index.html">karma</a>
<a href="http://stackoverflow.com/questions/300855/javascript-unit-test-tools-for-tdd">javascript unit test tools for tdd</a>
<a href="http://joshldavis.com/2013/05/27/difference-between-tdd-and-bdd/">the difference between tdd and bdd</a>
<a href="https://www.sitepoint.com/comparison-javascript-linting-tools/">a comparison of javascript linting tools</a>