前言测试可以根据测试用例进行快速反馈和覆盖代码,从而提高代码开发效率和质量。根据输入输出的值,对于通常迭代较快的业务逻辑不使用测试用例,对于常见的、常用的代码基础组件或框架需要编写测试。2018年初测试工具全盘回顾:2018年JavaScript测试概览测试与开发TDD测试驱动开发测试驱动开发的基本思想是先写测试代码,再开发功能代码。也就是说,明确了要开发某个功能后,首先想的是如何测试这个功能,并完成测试代码的编写,然后再编写相关的代码来满足这些测试用例。然后循环添加其他功能,直到所有功能开发完成。(mochaexample)//mochasuite('Array',function(){setup(function(){//...});suite('#indexOf()',function(){test('应该返回-1当不存在时',function(){assert.equal(-1,[1,2,3].indexOf(4));});});});BDDBehaviorDrivenDevelopment,BehaviorDrivenDevelopment是一种敏捷的软件开发技术,它鼓励开发人员、QA以及软件项目的非技术或业务参与者之间的协作。不同于一般的自动化测试(如单元测试、服务测试、UI测试),BDD是一种多方参与的测试开发方式。例如,使用Protractor编写AngularE2E测试时,所有测试都是由前端测试人员编写的。BDD最重要的特点之一是测试用例是由非开发人员编写的,而这些测试用例是用自然语言编写的DSL(领域特定语言)。也就是说,业务人员、测试人员、客户等利益相关者按照惯例编写相关的测试用例,然后由开发人员实现相关的测试。(Jasmine展示示例)//Jasminescribe("套件只是一个函数",function(){vara;it("andsoisaspec",function(){a=true;expect(a).toBe(true);});});单元测试单元测试单元测试准则27条断言库nodeassertconstassert=require('assert');assert.equal(1,'1');//okconstobj1={a:{b:1}};constobj2={a:{b:1}};assert.deepEqual(obj1,obj2);//okshouldjsshould(null).not.be.ok();({a:10}).should.be.eql({a:10});'ab'.should.be.equalOneOf(['a',10,'ab']);chai//shouldchai.should();foo.should.be.a('string');foo.should.equal('bar');foo.should.have.lengthOf(3);tea.should.have.property('flavors').with.lengthOf(3);//exceptvarexpect=chai.expect;expect(foo).to.be.a('string');expect(foo).to.equal('bar');expect(foo).to.have.lengthOf(3);expect(tea).to.have.property('flavors').with.lengthOf(3);//assertvarassert=chai.assert;assert.typeOf(foo,'string');assert.equal(foo,'bar');assert.lengthOf(foo,3)assert.property(tea,'flavors');assert.lengthOf(tea.fl口味,3);模拟响应数据MockMock.mock({"number|1-100":100})//{"number":30}Mock.mock({'regexp':/\d{5,10}/})//{"regexp":"365355673"}Mock.mock({"object|2-4":{"110000":"北京","120000":"天津","130000":"河北省","140000":"山西省"}})/*{"object":{"120000":"天津市","130000":"河北省","140000":"山西省"}}*/Random.date()//"2007-10-24"Random.image('200x100','#4A7BF7','Hello')端到端测试EndtoEndTestingcypress在浏览器中预览执行可视化测试用例,模拟用户操作像selenium一样,可以访问Mocha和chaidescribe('MyFirstTest',function(){it('clicking"type"navigatestoanewurl',function(){cy.visit('https://example.cypress.io')cy.contains('type').click()//应该在一个包含'/commands/actions'的新URL上cy.url().should('include','/commands/actions')})})模拟浏览器交互NightmareElectron-basedframeworkforwebautomationtestingandcrawlingwebdriverioNode.js的下一代WebDriver测试自动化框架,参考官方代码示例性能测试PerformanceTestingjsPerfbenchmark.js持续集成持续集成是一个非常好的多人开发实践,通过代码推送触发hooks实现自动运行编译和测试等待工作。接入持续集成后,我们每次推送代码,每个MergeRequest都会产生相应的测试结果,项目的其他成员可以清楚的了解到新代码是否影响了已有的功能。接入自动报警后,可以在代码提交阶段快速发现错误,提高开发迭代效率。持续集成会为每次集成提供一个几乎空白的虚拟机,将用户提交的代码拷贝到本地机器上。通过读取用户项目下的持续集成配置,编译测试后会生成自动安装环境和依赖。报告虚拟机资源在一段时间后被释放。TravelCI是一个yaml格式的开源持续集成构建项目。Coverallsnodejs下的代码测试覆盖率,原理是通过istanbul生成测试数据,上传到coveralls网站,然后以徽章的形式展示代码风格。目前比较流行的js验证工具有JSLint、JSHint、JSCS、ESLint。差异对比参考JavaScriptLinting工具对比,推荐使用ESlint。代码风格检查也可以集成到ci中,只需要在ci命令前加一个检查命令即可。以eslint为例:"scripts":{//.."lint":"eslint.","cov":"istanbulcover.","ci":"tnpmrunlint&&TEST_TIMEOUT=60000istanbulcover."这个时候构建会先检查代码风格,然后再做单元测试和覆盖率统计。如果代码风格检查失败,将直接中断构建。流行的测试框架Jest是Facebook出品的测试框架。与其他测试框架相比,它的一大特点是内置了常用的测试工具,比如内置断言和测试覆盖率工具。与React配合使用效果更好。(示例)karma是一个测试集成框架,可以通过插件的形式方便的集成测试框架、测试环境、覆盖工具等。与Angular配合使用效果更好。(使用vue-cli快速生成Vue项目,包含Webpack、Karma的配置和覆盖率统计)Cucumber&cuketest参考快速创建Cucumber.js测试脚本的方法其他参考:前端自动化测试概述E2E测试Cypress使用Jest+Enzyme对React项目进行单元测试TestingStrategiesforReactandRedux
