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的特点主要有:

  1. 既可以测试简单的JavaScript函数,又可以测试异步代码,因为异步是JavaScript的特性之一;

  2. 可以自动运行所有测试,也可以只运行特定的测试;

  3. 可以支持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 或无色代码说明测试用例覆盖到的代码。

红色说明测试用例没有覆盖到的代码。

黄色标色测试用例在这行内没有覆盖到的代码。

posted @ 2022-03-24 16:05  super-caide  阅读(105)  评论(0编辑  收藏  举报