В этой истории мы будем использовать TypeScript для модульного тестирования вместе с популярными фреймворками: Mocha / Chai, Jasmine или Jest. Вы определились с фреймворком и хотите писать модульные тесты на TypeScript, отлично! Мы рассмотрим изменения, необходимые для поддержки модульных тестов в TypeScript. В противном случае можно обратиться к документации по каждой из этих библиотек. Написание тестовых примеров в TypeScript во многом аналогично написанию тестовых примеров в JavaScript. Самая важная часть - это настроить так, чтобы тестовые примеры, написанные на TypeScript, можно было выполнять с использованием этих библиотек.
Исходный код доступен по адресу https://github.com/chiragrupani/TSUnitTestsSetup. Он содержит настройки и примеры для каждого из этих фреймворков.
Настройка очень проста, мы бы установили соответствующие тестовые фреймворки и их типы. Мы бы использовали ts-node (для Mocha и jasmine) и ts-jest (для Jest), чтобы добавить поддержку TypeScript. Мы бы использовали nyc для покрытия кода.
Мы следовали бы соглашениям: поместите исходные файлы JS / TS в папку src
, а файлы машинописного текста - в папку tests
.
По сути, это установка пакетов npm для TypeScript, Test framework (например, Jasmine / Mocha / Jest) и определение тестового сценария, необходимого для выполнения тестовых случаев, как описано далее. Наряду с выбранным пакетом фреймворка модульного тестирования, необходимо также установить соответствующие типы. Для выполнения тестов TS в Node нам нужно указать Scripts
для test
в package.json
. Файл package.json
находится в корне проекта и создается при выполнении npm init
.
Для отладки тестов TypeScript json, указанный в разделе «Отладка VS Code» ниже в истории, необходимо добавить в configurations
in launch.json
, который можно создать, перейдя в меню «Отладка» и затем «Добавить конфигурацию в VS Code». Ниже приведены команды npm, тестовый сценарий и рецепт отладки кода VS для каждого фреймворка:
Мокко / Чай
Команда установки NPM
npm i -D chai mocha nyc ts-node typescript npm i -D @types/chai @types/mocha
Тестовый сценарий
"scripts": { "test": "mocha -r ts-node/register tests/**/*.test.ts", "coverage": "nyc -r lcov -e .ts -x \"*.test.ts\" npm run test" }
Отладка кода VS
{ "type": "node", "request": "launch", "name": "Mocha Current File", "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha", "args": [ "--no-timeouts", "--colors", "${file}", "--require", "ts-node/register" ], "console": "integratedTerminal", "sourceMaps": true, "internalConsoleOptions": "neverOpen" }
Образец теста
describe('calculate', function() { it('add', function() { let result = Calculator.Sum(5, 2); expect(result).equal(7); }); });
Жасмин
Команда установки NPM
npm i -D jasmine nyc ts-node typescript npm i -D @types/jasmine
Тестовый сценарий
"scripts": { "test": "ts-node node_modules/jasmine/bin/jasmine --config=jasmine.json", "coverage": "nyc -r text -e .ts -x \"tests/*.test.ts\" npm run test" }
jasmine.json
в корневом каталоге указывает путь для тестов, как показано ниже:
{ "spec_dir": "tests", "spec_files": ["**/*[tT]est.ts"] }
Отладка кода VS
{ "type": "node", "request": "launch", "name": "Jasmine Current File", "program": "${workspaceFolder}/node_modules/jasmine/bin/jasmine", "args": [ "${workspaceFolder}/TSOutput/tests/${fileBasenameNoExtension}.js" ], "preLaunchTask": "tsc: build - tsconfig.json", "outFiles": ["${workspaceFolder}/TSOutput/**/*.js"], "console": "integratedTerminal", "internalConsoleOptions": "neverOpen" }
Образец теста
describe('calculate', function() { it('add', function() { let result = Calculator.Sum(5, 2); expect(result).toBe(7); }); });
Шутка
Команда установки NPM
npm i -D jest ts-jest typescript npm i -D @types/jest
Тестовый сценарий
"scripts": { "test": "jest", "coverage": "jest --coverage" }
Отладка кода VS
{ "type": "node", "request": "launch", "name": "Jest Current File", "program": "${workspaceFolder}/node_modules/.bin/jest", "args": ["${relativeFile}"], "console": "integratedTerminal", "internalConsoleOptions": "neverOpen", "windows": { "program": "${workspaceFolder}/node_modules/jest/bin/jest" } }
Примечание. Тестовый сценарий здесь просто «шутка». Чтобы использовать TypeScript, мы определяем преобразование в новом файле конфигурации jest.config.js
в том месте, где находится package.json
resides
module.exports = { transform: {'^.+\\.ts?$': 'ts-jest'}, testEnvironment: 'node', testRegex: '/tests/.*\\.(test|spec)?\\.(ts|tsx)$', moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'] };
Ключ testRegex
, где мы сопоставляем файлы ts / tsx, заканчивающиеся на test / spec в папке tests. Он будет обработан ts-jest
. Мы используем «узел» в «testEnvironment», поскольку мы выполняем тесты на узле (что делает его быстрее), иначе мы бы использовали значение «jsdom» по умолчанию.
Образец теста
describe('calculate', function() { it('add', function() { let result = Calculator.Sum(5, 2); expect(result).toBe(7); });
Это все, что нужно для настройки, тесты можно запустить, выполнив команду:
npm t
npm t
- это ярлык для npm run test
и получения результатов покрытия:
npm run coverage
Добавление тестового набора
Прежде чем добавлять модульные тесты, давайте сначала разберемся с Suite и Specs. Спецификация - это каждый отдельный тестовый пример, содержащий одно или несколько утверждений. Тестовый пример проходит, когда его ожидания верны. Обычно он определяется (на основе тестовой среды) с помощью it
functions. он содержит два параметра - один - это имя тестового примера, а другая функция, содержащая утверждение. Suite представляет собой группу связанных спецификаций и обычно определяется с помощью describe
, аналогичного it
, и содержит множество своих функций. В приведенном выше примере тестового примера показано, как он определяется для каждой платформы.
Выполнение некоторого кода до (инициализация теста) и после (очистка) каждого тестового примера, имитация внешних объектов / служб и т. Д. Зависит от фреймворка, документация по фреймворку будет содержать необходимую информацию.
Спасибо за чтение, не стесняйтесь поделиться и нажать кнопку хлопка, если вы сочтете это полезным, и, пожалуйста, добавьте комментарии, если вам нужна дополнительная помощь в настройке тестовых примеров TypeScript или если я что-то пропустил.