Модульный тест (Unit test)
Модульный тест применяется для тестирования одной логически выделенной и изолированной единицы системы. Чаще всего это метод класса или простая функция (хотя я допускаю и весь класс). Изолированность тестируемой единицы достигается при помощи Заглушек (Stubs, Dummies) и Макетов (Mockups).
Системный тест (System test)
Это комплексный тест, который тестирует связку сразу нескольких компонентов. Можно сказать, что это модульный тест, где модуль — это связка компонентов. Связка объединена неким фасадом, который предоставляет соответствующий API к ней. Методы этого API — это как раз то, что нам и надо покрыть тестами. Изолированность связки достигается по средствам Заглушек (Stubs, Dummies) и Макетов (Mockups). Факт связанности компонентов и формат коммуникации между ними проверяется с помощью так называемых Шпионов (Spies).🤠
Используют сеть, БД, ФС
- Выполняются в памяти
- Предсказуемые
- Быстрые
- Assert - утверждение
- Spy - отслеживает вызовы
- Stub - возвращает что-либо
- Mock - все и сразу 🔥
- Подмена модулей в runtime 🔥💣💥
- Assert - утверждение
- Spy - отслеживает вызовы
Stub - возвращает что-либо
Mock - все и сразу 🔥
Подмена модулей в runtime 🔥💣💥
- Конструктор не должен делать какую-либо работу
- Глобальное состояние и синглтоны сложно тестировать
- ...Запахи кода
Обычный роутер
const express = require("express");
dbHelper = require("dbHelper"); //💩
const router = express.router();
router.get("/:id", (req, res, next) => {
return dbHelper.anyTable.getById(req.params.id)
.then(obj => res.json(obj))
.catch(() => {...});
});
module.exports = router;
Тестируемый роутер
const express = require("express");
module.exports = (app, dbHelper👍) => {
const router = express.Router();
app.use("/", router);
router.get("/:id", (req, res, next) => {
return dbHelper.anyTable.getById(req.params.id)
.then(obj => res.json(obj))
.catch(() => {...});
});
};
Unit test для роутера
const request = require("supertest");
const app = require("express")();
const dbHelperMock = {...mocks};
require("routes/index")(app, dbHelperMock);
describe("app", () => {
it("works", done => {
request(app).get("/1")
.expect(200, done);
});
it("fails", done => {
request(app).get("/2")
.expect(404, done);
});
});