前言
Nestjs作为当下对TypeScript支持最好的后端框架之一(可能没有之一),被越来越多的人使用.
最近自己也在学习和使用中,这其中也踩了不少坑,尤其是在和数据库连接的测试中.
这篇文章主要介绍如何使用Docker配合单元测试
测试的三种方法
- 使用mock,对返回值进行mock,不直接和数据库进行交互
- 使用内存数据库.例如Sqlite.
- 利用docker增加测试数据库,在测试是开启docker内的数据库服务
三种方式的优缺点
| 方法 | 优点 | 缺点 |
|---|---|---|
| 使用mock | 更加灵活,和数据库进行了隔离 | 写法麻烦且难维护;没有和数据库真实产生交互 |
| 使用内存数据库 | 和数据库产生真实交互,容易维护 | postgresql的很多特性,内存数据库其实并不支持 |
| 利用Docker | 对你实际使用的数据库类型进行测试 | 复杂度和开销比较大 |
利用Docker增加测试数据库
以上三种方式,在项目中都使用过,根据实际情况,我最终选择了第三种方法:利用Docker增加测试数据库
原理
每次在跑测试之前,开启Docker启动相应的数据库服务,并初始化数据库;单元测试结束之后,移除数据库,关闭Docker服务.
安装Docker
大家可以参考这个去安装 www.runoob.com/docker/ubun…
配置docerk-compose
version: "3"
services:
test-db:
image: postgres
restart: always
ports:
- "5433:5432"
environment:
POSTGRES_PASSWORD: xxx
volumes:
- ./test/init.sql:/docker-entrypoint-initdb.d/init.sql #初始化测试数据库
通过npm 启动
"posttest": "docker-compose stop test-db && docker-compose rm -f test-db", //测试结束后关闭docker并移除服务
"pretest": "docker-compose up -d test-db" //测试开始前开启dcoker和服务
配置jest
npm 启动的方式,无法在IDE内单独执行某个测试,所以我开始对jest进行配置
用setup和globalTeardown在测试开始前和结束后,启动/关闭 docker
//setup.ts
const { execSync } = require('child_process');
export default async function() {
execSync('docker-compose up -d test-db');
}
//globalTeardown.ts
const { execSync } = require('child_process');
export default async function() {
execSync('docker-compose stop test-db && docker-compose rm -f test-db');
}
//jest.json
"globalSetup": "./test/setup.ts",
"globalTeardown": "./test/globalTeardown.ts"
小结
以上就是最近对Nestjs测试的实践.这三种方式对其他Node项目应该也是一样的.
欢迎大家讨论.