译者按: 也许你讨厌测试,可是你不得不面对它,因此至少区分一下单元测试、集成测试与功能测试?对吧...javascript
原文: What are Unit Testing, Integration Testing and Functional Testing?java
译者: Fundebuggit
为了保证可读性,本文采用意译而非直译。另外,本文版权归原做者全部,翻译仅用于学习。程序员
JavaScript代码测试有不少分类,好比单元测试(unit test)、集成测试(integration test)、功能测试(functional test)、端到端测试(end to end test)、回归测试(regression test)、浏览器测试(browser test)...github
也许你会傻傻地分不清楚,它们是什么?如何使用?什么状况下使用?这篇博客将解答你的疑问。数据库
单元测试指的是测试小的代码块,一般指的是独立测试单个函数。若是某个测试依赖于一些外部资源,好比网络或者数据库,那它就不是单元测试。浏览器
单元测试通常很容易写。一个单元测试一般是这样的:为某个函数提供某些输入值,而后验证函数的返回值是否正确。然而,若是你的代码设计很是糟糕,则单元测试会很难写。从另外一个角度理解,单元测试能够帮助咱们写更好的代码。网络
从某种意义上,单元测试就是代码的骨干。经过单元测试,能够帮助你优化代码设计,能够保证修改代码时正确无误。函数
单元测试能够帮助咱们避免一些常见的BUG。一般,程序员会在同一个细节上反复犯错,若是为这些BUG添加单元测试,则能够有效避免这种状况。固然,你也可使用集成测试和功能测试来解决这个问题,可是单元测试更加适合,由于单元测试更加细致,能够帮助咱们快速定位和解决问题。工具
何时应该作单元测试呢?采用测试驱动开发(test driven development)的话,你应该一直写单元测试。好的单元测试不只能够避免BUG,还能够优化代码,而且保证修改或者重构代码时不会出错。
流行的JavaScript单元测试工具备Mocha, Jasmine和Tape。
集成测试就是测试应用中不一样模块如何集成,如何一块儿工做,这和它的名字一致。集成测试与单元测试类似,可是它们也有很大的不一样:单元测试是测试每一个独立的模块,而集成测试刚好相反。好比,当测试须要访问数据库的代码时,单元测试不会真的去访问数据库,而集成测试则会。
单元测试不够时,这时就须要集成测试了。当你须要去验证两个独立的模块,好比数据库和应用,保证它们可以正确的一块儿工做,这时就须要集成测试了。为了验证测试结果,你就须要经过查询数据库验证数据正确性。
集成测试一般比单元测试慢,由于它更加复杂。而且,集成测试还须要配置测试环境,好比配置测试数据库或者其余依赖的组件。这就使得编写和维护集成测试更加困难,所以,你应该专一于单元测试,除非你真的须要集成测试。
你须要的集成测试应该少于单元测试。除非你须要测试多个模块,或者你的代码太复杂时,你才须要集成测试。而且,当你的代码过于复杂时,我建议优化代码以便进行单元测试,而不是直接写集成测试。
一般,咱们可使用单元测试工具编写集成测试。
功能测试有时候也被称做端到端测试,或者浏览器测试,它们指的是同一件事。
功能测试指的是测试应用的某个完整的功能。对于网页应用,功能测试意味着使用工具模拟浏览器,而后经过点击页面来测试应用。
单元测试能够测试单个函数,集成测试能够测试两个模块一块儿工做。功能测试则彻底是另一个层次。你能够有上百个单元测试,可是一般你只有少许的功能测试。这是由于功能测试太复杂了,难于编写和维护。功能测试很慢,由于它须要模拟真实用户进行网页交互。
事实上,你不须要编写很是详细的功能测试。功能测试并不意味着你须要测试每个功能,其实,你只须要测试一些常见的用户行为。若是你须要在浏览器中手动测试应用的某个流程,好比注册帐号,这时你能够编写一个功能测试。
对于单元测试,你会使用代码去验证结果,在功能测试中也应该这样作。以注册帐号为例,你能够验证浏览器是否跳转到了"感谢注册"页面。
当有些测试你须要手动在浏览器下重复进行时,你应该编写功能测试。注意不要写得太细致了,不然维护这些测试将是一个噩梦。
最流行的功能测试工具是 Selenium。Selenium WebDriver或者Protractor一般与Selenium一块儿使用,有时也使用PhantomJS和CasperJS ,注意你不须要使用真实浏览器。
测试JavaScript代码时,应该着重于单元测试,它很是容易编写和维护,除了能够减小BUG还有不少益处。而集成测试与功能测试应该做为补充。
欢迎加入咱们Fundebug的全栈BUG监控交流群: 622902485。
版权声明:
转载时请注明做者Fundebug以及本文地址: