Nestjs测试实践之使用Docker

1,447 阅读2分钟

前言

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项目应该也是一样的.

欢迎大家讨论.