node 测试框架
(TDD - Test Driven Development)测试驱动开发,它是一种测试先于编写代码的思想用于指导软件开发。测试驱动开发是敏捷开发中的一项核心实践和技术,也是一种设计方法论。TDD的原理是在开发功能代码之前,先编写单元测试用例代码,测试代码确定需要编写什么产品代码。
(BDD - Behavior Driven Development)行为驱动开发,是一种近乎自然语言的描述软件的形式。传统的开发模式中,客户很难从技术层面理解问题,开发人员很难从业务需求考虑问题,基于这种通用语言形式可以尽可能的避免客户和开发者在沟通上的障碍,实现客户和开发者同时定义系统的需求。避免了因为理解需求不充分而带来的不必必要的工作量。
测试框架的组件
断言库
了解一下node 常见的一些断言库的区别:
assert TDD风格 官方支持的 API
样例:
assert("mike" == user.name);
should BDD风格 API
样例
foo.should.be("aa");
expect BDD风格,基于should
的简化 API
样例
expect(foo).to.be("aa");
chai BDD/TDD双模 ,同时支持 should / expect / assert 三种风格的断言库
单元测试框架
mocha
mocha是JavaScript的一种单元测试框架,既可以在浏览器环境下运行,也可以在Node.js环境下运行。
使用mocha,我们就只需要专注于编写单元测试本身,然后,让mocha去自动运行所有的测试,并给出测试结果。
mocha的特点主要有:
-
既可以测试简单的JavaScript函数,又可以测试异步代码,因为异步是JavaScript的特性之一;
-
可以自动运行所有测试,也可以只运行特定的测试;
-
可以支持before、after、beforeEach和afterEach来编写初始化代码。
我们会详细讲解如何使用mocha编写自动化测试,以及如何测试异步代码。
覆盖率工具
istanbul ync machawesome
单元测试流程
Mocha 的安装与配置
npm install --save ts-node npm install --save typescript npm install --save-dev mocha npm install --save-dev @types/mocha npm install --save-dev chai npm install --save-dev @types/chai npm install --save-dev nyc
package.json中文件如下:
{ "name": "ts", "version": "1.0.0", "description": "", "main": "index.js", "dependencies": { "ts-node": "^10.1.0", "typescript": "^4.3.5" }, "devDependencies": { "@types/chai": "^4.3.0", "@types/mocha": "^9.1.0", "chai": "^4.3.6", "mocha": "^9.2.2", "nyc": "^15.1.0" }, "scripts": { "test": "mocha -r ts-node/register test/**/*.ts", "coverage": "nyc --reporter=html mocha -r ts-node/register test/**/*.ts" }, "author": "", "license": "ISC" }
代码和目录结构
test/test-count.ts
import {sum,pass,max} from "../src/count"; import { expect } from "chai"; describe('#count.ts', () => { describe('#sum()', () => { it('sum() should return 0', () => { expect(sum()).eql(0); }); it('sum(1) should return 1', () => { expect(sum(1)).eql(1); }); it('sum(1, 2) should return 3', () => { expect(sum(1,2)).eql(3); }); it('sum(1, 2, 3) should return 6', () => { expect(sum(1,2,3)).eql(6); }); }); describe('#pass()', () => { it('pass() should return false', () => { expect(pass(10)).eql(false); }); // it('pass() should return true', () => { // expect(pass(70)).eql(true); // }); }); describe('#max()', () => { it('max() should return 2', () => { expect(max(1,2)).eql(2); }); }); });
src/count.ts
export* from "./count2" export function sum(...rest) { var sum = 0; for (let n of rest) { sum += n; } return sum; };
src/count2.ts
export function pass(num) { if(num>60){ return true; } return false; }; export function max(num1,num2) { return num1>num2?num1:num2; };
执行: npm run coverage 会在目录下生成 coverage 文件夹,内容为测试覆盖率文件。
点击 coverage/index.html 可浏览查看测试覆盖率报表
点击 count2.ts 可以查看文件测试覆盖率详情
行号又边的淡绿色1x 或无色代码说明测试用例覆盖到的代码。
红色说明测试用例没有覆盖到的代码。
黄色标色测试用例在这行内没有覆盖到的代码。