前端单元测试(Unit Testing)整理
是什么
wiki: 在计算机编程中,单元测试(英语:Unit Testing)又称为模块测试, 是针对程序模块来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。
为什么
正确性: 测试可以验证代码的正确性,在上线前做到心里有底;
自动化: 通过编写测试用例,可以做到一次编写,多次运行;
解释性: 测试用例用于测试接口、模块的重要性,那么在测试用例中就会涉及如何使用这些 API。其他开发人员如果要使用这些API,那阅读测试用例是一种很好地途径,有时比文档说明更清晰;
保证重构: 互联网行业产品迭代速度很快,迭代后必然存在代码重构的过程,那怎么才能保证重构后代码的质量呢?有测试用例做后盾,就可以大胆的进行重构;
简化集成: 单元测试可以减少单元自身的不确定性,当单元集成在一起测试可已更加容易;
…
怎么做
我要测什么: 函数运行流程(函数是否如预期被调用)、校验参数(某函数接收的参数和预期是否一致)、校验返回值(函数应该返回什么)
工具
断言库: chai
TDD: assert
BDD: expert、should
测试框架: mocha
测试覆盖率: istanbul
测试运行器: karma
mock库: sinon
原则
- 测试用例需要覆盖所有分支;
- 除了必要的正确逻辑分支,针对 if else、switch、&&、|| 等的逻辑判断也都需要进行测试,以保证函数所可能产生的行为能如预期。
- 尽可能将被测试的代码与其他代码进行隔离,明确测试主逻辑,外部依赖使用 mock、stub 等替代。
- 凡是非本项目开发的代码,都可以认为是第三方代码。
- 对于使用的第三方工具库,我们是在信任它的基础上进行使用,既然选择信任,就没有测试它的必要,就算出了问题也是提供工具库的团队的问题。
- 针对调用接口的函数,或者其他一些不稳定变量,当对其进行合理的 mock/stub,以保证不会因为其的不稳定因素导致测试失败。即将非纯函数转化为纯函数。
- 一次只测一个单元。
- 如果有两个函数 A、B,A 调用了 B,那么我们在测试A的时候应该 stub 掉 B,这样能保证测试失败的时候,准确的找到错误的原因。反之,可能是B方法出了问题,导致A的测试失败了,测试结果就会有误导性。
- 有些项目中,测试代码是先于开发代码完成的。当我们想测试 A 的时候,可能 B 还没有实现,这个时候,也是需要 stub 掉 B。
建议
- 测试先行(TDD),定输入输出,定默认值;
- 用例的描述要符合用例的目的;
- 测试用例具有可重复执行的能力;
- 测试用例避免依赖或影响其他用例;
- 业务变动时及时更新用例;
- 合理使用 describe 分组,合理使用 before、beforeEach、arfter 等钩子,减少代码复杂度;
…
还没有评论,来说两句吧...