мой блог:Фреймворк модульного тестирования 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
Затем результаты выходного теста выглядят следующим образом:
Библиотека утверждений
Поддержка мокко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
Затем результаты выходного теста выглядят следующим образом:
хуки и асинхронность
Похож на Мокко.
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
Затем результаты выходного теста выглядят следующим образом:
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"
, и после повторного запуска можно получить следующие результаты: