# 单元测试课件 **Repository Path**: melody-lx/unit-testing- ## Basic Information - **Project Name**: 单元测试课件 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-02-14 - **Last Updated**: 2022-02-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 断言 断言(assertion)是一种在程序中的一阶逻辑(如:一个结果为真或假的逻辑判断式),目的为了表示与验证软件开发者预期的结果——当程序执行到断言的位置时,对应的断言应该为真。若断言不为真时,程序会中止执行,并给出错误信息 ## assert node给js提供了一个断言模块————“assert”,给js提供了断言相关的api。 | api | 例子 | 备注 | | -- | ---- | ---- | | assert.equal | assert.equal(1,2) | assert.strictEqual 严格模式 | | assert.equal |assert.deepEqual([1,2],[1,2]) | deepStrictEqual 严格模式| assert断言api,成功通过的话,返回的是udefined,只有断言失败的时候才会报错。 ### nodev15.3+严格模式下的断言 ```js const assert = require("assert/strict"); ``` ## mochajs 摩卡js是一个单元测试框架(测试框架)-https://mochajs.cn/ mocha是一个功能丰富的javascript测试框架,运行在node.js和浏览器中,使异步测试变得简单有趣。 Mocha测试连续运行,允许灵活和准确的报告,同时将未捕获的异常映射到正确的测试用例。 ```shell yarn add mocha ``` ## 测试框架默认的规范 + 默认规范下,我们把用来测试的脚本以 .test.js为结尾进行命名,并将其放在test文件夹下; + 测试框架API与断言API一起工作,构建我们的测试用例。 + 一个完整的测试用例,应该具备关于它的合理描述和具体的断言。 ```js var assert = require('assert'); describe('Array', function() { describe('#indexOf()', function() { it('should return -1 when the value is not present', function() { assert.equal([1,2,3].indexOf(4), -1); }); }); }); ``` + 当然我们也可以指定去运行某个测试脚本,在多数时候,我们使用这种方式指定用例运行的目录和文件。 ```shell mocha ./demo/*.js ``` ### mocka的异步代码测试 test/demo3.test.js 1. 方式1 - 配合 done api使用,告诉mocha用例已经结束。 1. 方式2 - 直接使用async await // v(node) > 14 当然推荐使用第二种啦~ ### js测试框架和任意断言库配合工作。 + 一般而言,任何通用的断言库在封装的时候,错误返回值都符合“断言错误”的规范。因此你可以选定任何一门断言库来和你的js测试框架进行配合工作 #### 知名的断言库 + 所谓断言库,就是封装了一些方便写断言的api的js库。它们的api调用,一般都遵循三种风格(expect, should, assert)之一,或者兼容三种风格。 + 但无论使用哪种风格,我们的测试用例都应当遵循TDD(技术驱动开发)/BDD(行为驱动开发)的指导思想。 should.js - BDD风格贯穿始终 expect.js - expect()样式断言 chai - expect(),assert()和should风格的断言 better-assert - C风格的自文档化的assert() unexpected - “可扩展的BDD断言工具”。 #### chai 我们已经尝试过了mocha+assert(node原生模块),现在我们来尝试mocha+chai(摩卡和茶更般配哟 ☕️ 🍵)。 https://www.chaijs.com/ ```js const { assert } = require('chai'); // Using Assert style const { expect } = require('chai'); // Using Expect style const { should } = require('chai'); // Using Should style ``` test/demo4.test.js ```js // Should chai.should(); foo.should.be.a('string'); foo.should.equal('bar'); foo.should.have.lengthOf(3); tea.should.have.property('flavors') .with.lengthOf(3); ``` ```js // Expect var expect = 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); ``` ```js // Assert var assert = chai.assert; assert.typeOf(foo, 'string'); assert.equal(foo, 'bar'); assert.lengthOf(foo, 3) assert.property(tea, 'flavors'); assert.lengthOf(tea.flavors, 3); ``` ## 覆盖率 衡量我们所写的用例,是否能够cover住测试需求,“覆盖率”可以作为一个衡量参考。 ### 集成能够对代码进行覆盖率统计相关的框架 #### nyc(伊斯坦布尔) https://istanbul.js.org/ ```shell yarn add nyc nyc mocha ``` npm run nyc-mocha ### jest jest是一个集成了js测试框架, 断言库,代码覆盖率测试框架的缝合怪。 ### 对于前端来讲,单测的意义? 函数库测试 / UI组件测试 #### 函数库测试 本质就是函数的测试。我们考虑从入参的边界,以及基于函数的各种可能存在的应用场景枚举可能传入的参数值,来对我们所写的函数进行单测。 关键点在于测试思维! 补充: 对于react而言,16.8版本,hooks风格的react函数式代码开始流行起来。我们用单测拿捏它!死死的! #### UI组件库测试 如何测试我们的UI组件? 要先思考用例的点,再思考具体去测试的姿势。 #### react项目单元测试 + react全家桶?react内置的测试库! https://react.docschina.org/docs/test-utils.html + jest和react都是脸书的。。。 + 单测渲染器环境-eact-test-renderer https://react.docschina.org/docs/test-renderer.html #### 生成快照,保存记录!