Фреймворк модульного тестирования JavaScript

модульный тест

мой блог:Фреймворк модульного тестирования JavaScript

Введение

Тестирование является важной частью обеспечения качества кода.Хотя модульное тестирование веб-проектов не может полностью завершить функциональное тестирование, оно может обеспечить качество работы базового отдельного модуля и гарантировать, что внешний интерфейс не изменится во время рефакторинга кода.

тестовая среда

  • Mocha
  • Jasmine
  • Jest
  • Tape
  • Karma

Mocha

Mocha — это гибкая среда тестирования, но это всего лишь структура, вам нужно ввести другие плагины для реализации некоторых функций тестирования, таких как библиотека утверждений, статистика покрытия и т. д.

Инсталляция мокко

установка нпм:npm install mocha --save-dev

Синтаксис сценария

Краткий пример:

// 引入需测试的模块或类
const add = require("./add");
const assert = require("assert");

// describe:定义一组测试
describe("加法函数测试", function() {
    before(function() {
        // runs before all tests in this block
    });
    
    // it: 定义一个测试用例
    it("1 加 1 应该等于 2", function() {
        // assert: nodejs内置断言模块
        assert.equal(add(1, 1), 2);
    });
    
    after(function() {
        // runs after all test in this block
    });
});

инструкции

Создайте каталог для тестовых скриптовtest-mocha, имя тестового сценария должно следовать[模块名].test.jsстиле, то вpackage.jsonНастройте тестовую команду в:

"scripts": {
    "test-mocha": "mocha test-mocha/"
}

воплощать в жизньnpm run test-mochaЗатем результаты выходного теста выглядят следующим образом:

mocha-执行脚本

Библиотека утверждений

Поддержка моккоshould.js, chai, expect.js, better-assert, unexpectedи т. д. Библиотека утверждений. В приведенном выше примере вы можете сравнить различия между различными библиотеками утверждений:

  • assert
assert.ok(add(1, 1));
assert.equal(add(1, 1), 2);
  • should.js
(add(1, 1)).should.be.a.Number();
(add(1, 1)).should.equal(2);
  • expect.js
expect(add(1, 1)).to.be.a("number");
expect(add(1, 1)).to.equal(2);
  • chai: поддержка должна, ожидать, утверждать три синтаксиса

Подводить итоги,should.jsа такжеexpect.jsВ сравнении сassertЭто более семантично и поддерживает определение типа, в то время какshould.jsСинтаксически более краткий, поддерживая синтаксис цепочки.and.

hooks

Mocha поддерживает 4 вида хуков, в том числеbefore / after / beforeEach / afterEach.

Асинхронное тестирование

Значение по умолчанию Mocha для каждого выполнения тестового случая 2000ms превышает заданную длину, поэтому, если тестовый код в асинхронной работе, то необходимостьdoneфункция, чтобы очистить конец тестового примера.doneприниматьErrorпараметр.

BOM/DOM

Когда Mocha работает в среде узла, он не поддерживает интерфейсы BOM и DOM и должен быть импортирован.jsdomа такжеjsdom-globalбиблиотека.

Jasmine

Jasmine — полнофункциональная среда тестирования со встроенными утверждениями.expect; Однако существуют глобальные объявления и требуется конфигурация, которая является относительно более сложной и негибкой в ​​использовании.

Жасминовая инсталляция

установка нпм:npm install jasmine --save-dev

синтаксис скрипта

const add = require("../src/add");

describe("加法函数测试", function () {
    it("1加1等于2", function() {
        expect(add(1, 1)).toEqual(2);
    });
    it("输出数字", function() {
        expect(add(1, 1)).toEqual(jasmine.any(Number));
    });
});

Синтаксис Jasmine очень похож на Mocha, но утверждения используют встроенныеexpect().

инструкции

Новый файл конфигурацииjasmine.json:

{
    // 测试脚本相对路径
    "spec_dir": "test-jasmine",
    // 测试脚本
    "spec_files": [
        "*.test.js"
        "!*.notest.js"
    ],
    // 测试前需要引入的脚本
    "helpers": [],
    // 是否在遇到第一个报错后停止测试
    "stopSpecOnExpectationFailure": false,
    // 是否以半随机顺序执行测试
    "random": false
}

Создать каталог тестовых скриптовtest-jasmine, файл скрипта называется[模块名].test.js,существуетpackage.jsonНастройте тестовую команду в:

"scripts": {
    "test-jasmine": "jasmine --config=jasmine.json"
}

затем выполнитьnpm run test-jasmineЗатем результаты выходного теста выглядят следующим образом:

jasmine-执行脚本

хуки и асинхронность

Похож на Мокко.

Jest

Jest — это полнофункциональная среда тестирования с нулевой конфигурацией, которая объединяет различные инструменты и может использоваться без настройки.

Шуточная инсталляция

установка нпм:npm install --save-dev jest

синтаксис скрипта

Синтаксис Jest отличается от двух вышеупомянутых фреймворков:

const add = require("../src/add");

describe("加法函数测试", () => {
    test("1加1等于2", () => {
        expect(add(1, 1)).toBe(2);
    }); 
});

шутитьtestОпределите тестовый пример с его собственными утверждениямиexpect, библиотека утверждений мощная, но синтаксисshould.jsсложнее.

Синтаксис утверждения:

  • Нормальное совпадение:toBe, not.toBe
  • Пустое совпадение:toBeNull, toBeUndefined, toBeDefine, toBeTruthy, toBeFalsy
  • Размер номера:toBeGreaterThan, toBeGreaterThanOrEqual, toBeLessThan, toEqual, toBeCloseTo(для чисел с плавающей запятой)
  • Регулярный матч:toMatch
  • Запрос массива:toContain
  • Конструктивное совпадение:toEqual(expect.any(constructor))

инструкции

Создать каталог тестовых скриптовtest-jest, файл скрипта называется[模块名].test.js,существуетpackage.jsonНастройте тестовую команду в:

"scripts": {
    "test-jest": "jest test-jest/"
}

затем выполнитьnpm run test-jestЗатем результаты выходного теста выглядят следующим образом:

jest-执行脚本

hook

У шутки тоже четыре крючка,beforeAll/beforeEach/afterAll/afterEach.

BOM/DOM

Jest имеет встроенную поддержку интерфейсов DOM и BOM.

Статистика покрытия

Jest имеет встроенную статистику покрытия, для более удобной настройки мы можем создать конфигурационный файлjest.config.js:

module.exports = {
    // 开启覆盖统计功能
    collectCoverage: true,
    // 指定需要覆盖的文件
    collectCoverageFrom: [
        "src/*.js"
    ],
    // 指定输出覆盖统计结果的目录
    coverageDirectory: "test-jest/coverage/",
    // 指定测试脚本
    testMatch: [
    	"**/test-jest/*.test.js"
    ]
};

потомpackage.jsonИзмените наименование в:"test-jest": "jest", и после повторного запуска можно получить следующие результаты:

jest覆盖统计