如何对JavaScript程序代码进行单元测试?答案有很多,就如同世界上许多事情一样,总是存在诸多选择。
本篇文章重点描述几个当下比较受欢迎的JavaScript单元测试工具,也是笔者常用并且爱不释手的工具。
希望这篇文章能够帮助各位读者在启动和设置项目时节省时间,更高效地对JavaScript进行单元测试。
什么是JS中的单元测试
软件测试的经验法则是:如果我们编写的代码中有业务逻辑,那么它就需要测试。测试方法通常就是在想实现逻辑的步骤上启用断言。
所以,在大多数情况下,JavaScript单元测试与任何其他语言的单元测试没有什么不同。
对于任何具有web体验的应用程序,JavaScript将以某种方式成为该应用程序的一部分。即使整个项目的业务逻辑主要在后端,我们也不能忽略前端测试,尤其是为JavaScript代码库进行基础测试。
单元测试很大程度上确保了代码质量,同时也使重构变得更容易。
当我们用测试来验证应用程序行为时,或者编写测试以验证修复的bug时,这都会让我们很有成就感,从而也能更自信地更新代码。
JavaScript单元测试工具
Jest
Jest是一个JavaScript测试框架,它以零配置、并行测试为卖点,同时具有快照等特性,可以轻松捕获并保存大型项目的快照。
Jest由Facebook维护,最开始常常与ReactJS测试联系在一起。
Jest内置了很多特性,不仅可以适用于React,还适用于Vue、Angular、Node.js、TypeScript等项目。
Jest的诸多优点让它被戏称为:令人愉快的测试框架。
用Jest开始编写单元测试通常不需要任何配置,而且使用npm就能轻易安装:
npm install --save-dev jest
让Jest意识到测试文件的存在很简单,只需要编写一段代码,然后将它命名为“NAME.test.js”(扩展名为.test.js的文件将被Jest获取)。
Jest的API使用了单元测试中常见的语法,编写一个sum.test.js文件,比如像这样:
test('adds 1 + 2 to equal 3', () => {
expect(sum(1, 2)).toBe(3);
});
还有其他语法或测试术语,比如用“describe”来形成一个作用域,创造性地去使用“it”而不是“test”,就像这样的风格:
describe("an area of code", () => {
it("does what I expect", () => {
expect(true).toBeTruthy();
});
});
到目前为止,Jest是JavaScript单元测试领域的最受欢迎的一种框架,始终处于领先地位,几乎任何其他框架迁移到Jest都很容易实现,就像它可以在Jasmine中“按原样”工作,并且代码模块也可以从其他工具迁移。
Jasmine
Jest是在Jasmine的工作基础上实现的,在我们describe一个测试套件(test suite),或者使用其他语句实现逻辑过程时,Jasmine使用行为驱动开发(BDD)分类。
Jasmine提供了许多扩展包,可以在适用于各种开发环境,比如Jasmine for Ruby或Jasmine for Python,甚至还有一个浏览器内的测试运行程序。
Jasmine的独立发行版可以在浏览器中运行(通过HTML页面加载脚本、测试运行程序和测试脚本),所以如果你在JavaScript中进行单元测试,但没有npm/Node.js环境设置,Jasmine将会是一个很好的选择。
一个简单的Jasmine代码段:
describe(“My wonderful function”, function() {
it(“should be very cool”, function() {
expect(myfunction()).toEqual(“cool”);
});
});
Jasmine能被灵活运用于在各种工具和测试运行程序之间,并且测它的语法格式使它们易于阅读,当然前提是代码编得很好并富有层次!
AVA
AVA是一个Node.js和JavaScript的测试运行程序,小而快,并且有友好的输出结果,比如当测试失败时突出显示异常。
AVA的语法格式与Jest或Jasmine有些不同:
const test = require('ava');
test('a is not b', t => {
t.is("a", "b"); // This test will fail
});
AVA称自己个性化的不同为“神奇的断言”,确实,当我们查看测试输出时,它非常有用:
其他测试工具
除了这些比较流行的选择之外,还有很多JavaScript测试框架和工具,值得一提的是tape,它强调TAP原则(TAP:Test Anything Protocol测试任何协议)。
还有DOM测试库,它不是一个测试运行程序或测试框架,但当使用各种框架(或没有框架)为web ui编写测试时,它是一个非常有用的工具。
对于单元测试之外的JavaScript测试,JavaScript中的集成测试和终端测试也十分与必要,对于这些测试,除了通常所用的Selenium以外,还有有相当多的有趣工具等着我们发现!
例如,QA Wolf能在你的APP上使用浏览器时创建Jest测试代码!
如果我们想要确保客户端的代码质量,我们需要严格地对代码进行测试和实践。
幸运的是,有许多经过反复审查的工具可用来进行JavaScript单元测试,这使我们的测试工作能够事半功倍。
最后,希望笔者举出来的这些工具能够帮助更多读者进行JavaScript单元测试。
最后也给大家分享一份软件测试资料
上面的这些内容,对于软件测试的的朋友来说应该是最全面最完整的备战仓库,为了更好地整理每个模块,我也参考了很多网上的优质博文和项目,力求不漏掉每一个知识点,很多朋友靠着这些内容进行复习,拿到了BATJ等大厂的offer,这个仓库也已经帮助了很多的软件测试的学习者,希望也能帮助到你。
关注我的微信公众号:程序员二黑,即可免费获取!
最困难的时候,也就是我们离成功不远的时候!如果你不想再体验一次自学时找不到资料,没人解答问题,坚持几天便放弃的感受的话,可以加入我们的群:785128166 大家一起讨论交流学习。