Jest
Как устроено тестирование в Lowcode Platform: unit-тесты, интеграционные тесты и e2e.
🎯 Зачем эта страница
Эта страница объясняет:
- почему используется Jest;
- где в монорепозитории находятся тесты;
- как настраивается Jest для TypeScript и NestJS;
- как писать unit-, integration- и e2e-тесты;
- как тестирование встроено в Turborepo и docker-compose.
1. Что такое Jest и зачем он нужен
Jest — это тестовый фреймворк для JavaScript/TypeScript, который предоставляет:
- запуск тестов с изоляцией;
- мокинг модулей и функций;
- снапшоты (snapshot testing);
- поддержку TypeScript через
ts-jestили Babel; - быстрый watch-режим.
Почему Jest хорошо подходит платформе:
- единая среда для всех пакетов (API, DSL, редактор);
- хорошая поддержка TypeScript;
- мощные mocking-инструменты (важно для NestJS);
- простая интеграция с Turborepo.
2. Где находятся тесты в проекте
Стандартные соглашения:
apps/api/src/**/*.spec.ts
packages/dsl-compiler/src/**/*.spec.ts
packages/shared-types/**/*.spec.ts
Тесты разделяются по типам:
Unit-тесты
- тестируют отдельные функции или классы;
- мокают зависимости (например, PrismaService);
- запускаются быстро.
Integration-тесты
- тестируют модули NestJS целиком;
- создают приложение через
Test.createTestingModule; - используют реальную валидацию/пайпы.
E2E-тесты
- запускаются в docker-compose окружении (
docker-compose.test.yml); - тестируют API как «чёрный ящик» через HTTP;
- используют чистую БД.
3. Настройки Jest в проекте
Примерный конфиг (jest.config.ts):
export default {
moduleFileExtensions: ['js', 'json', 'ts'],
rootDir: 'src',
testRegex: '.*\\.spec\\.ts$',
transform: {
'^.+\\.(t|j)s$': ['ts-jest', { tsconfig: '../tsconfig.json' }],
},
coverageDirectory: '../coverage',
testEnvironment: 'node',
};
Важные моменты:
- используется
ts-jestдля трансформации TypeScript → CommonJS; testEnvironmentвыбран какnode(Fastify/NestJS);- тесты ищутся по маске
*.spec.ts.
4. Тестирование NestJS (API)
NestJS предоставляет встроенные утилиты для тестов.
Пример unit-теста сервиса:
describe('ProjectsService', () => {
let service: ProjectsService;
let prisma: PrismaService;
beforeEach(async () => {
prisma = { project: { findMany: jest.fn() } } as any;
service = new ProjectsService(prisma);
});
it('should return projects', async () => {
prisma.project.findMany.mockResolvedValue([]);
expect(await service.findAll()).toEqual([]);
});
});
Пример integration-теста контроллера:
let app: INestApplication;
beforeAll(async () => {
const moduleRef = await Test.createTestingModule({
imports: [AppModule],
}).compile();
app = moduleRef.createNestApplication();
await app.init();
});
it('GET /projects returns 200', async () => {
await request(app.getHttpServer()).get('/projects').expect(200);
});
5. Тестирование DSL Compiler
DSL-компилятор активно тестируется unit-тестами:
- парсеры;
- валидаторы;
- генераторы AST;
- генерация финального JS.
Пример:
describe('validateComponent', () => {
it('should fail on unknown type', () => {
expect(() => validateComponent({ type: '???' } as any)).toThrow();
});
});
6. E2E-тесты с Docker
Для e2e-тестов используется отдельный compose:
docker compose -f docker-compose.test.yml up --abort-on-container-exit
В ходе тестов:
- поднимается чистая PostgreSQL;
- автоматически применяются миграции Prisma;
- запускается API в тестовом режиме;
- тесты обращаются к API через HTTP.
После завершения контейнеры выключаются.
7. Интеграция Jest с Turborepo
В turbo.json тесты регистрируются так:
"test": {
"dependsOn": ["^test"],
"outputs": []
}
Это означает:
- тесты пакета запускаются только если изменились его файлы;
- тесты зависимых пакетов выполняются автоматически.
Запуск тестов во всей монорепе:
pnpm test
Запуск тестов одного пакета:
pnpm --filter @lowcode/api test
8. Где искать конфигурацию тестов
| Компонент | Путь | Описание |
|---|---|---|
| Общий Jest config | jest.config.ts или apps/api/jest.config.ts | Конфигурация тестов |
| Unit-тесты API | apps/api/src/**/*.spec.ts | Модульные тесты |
| DSL-компилятор | packages/dsl-compiler/src/**/*.spec.ts | Unit-тесты компилятора |
| E2E окружение | apps/api/docker-compose.test.yml | Окружение тестовой БД |
9. Что должен знать разработчик
- Unit-тесты пишутся на Jest с использованием
ts-jest. - Integration-тесты используют NestJS testing module.
- E2E-тесты запускаются через docker-compose.
- Turborepo управляет тестами и кеширует результаты.
- Для каждого пакета тесты пишутся рядом с кодом по маске
*.spec.ts.
Этого достаточно, чтобы интегрироваться в существующую систему тестирования и создавать качественные тесты для новых модулей.