首页 > 解决方案 > 从 docker compose 运行 REST API 测试

问题描述

我正在尝试在我的 node.js 项目中实现测试。我决定使用 mocha / chai / chai-http 来测试我的 rest API。

我的测试文件夹中只有 1 个简单文件:

电影.ts:

import chai from 'chai';
import chaiHttp from 'chai-http';
let app = require('../app');
chai.should();
chai.use(chaiHttp);
declare var process : {
  env: {
    API_KEY: string
  }
}

describe('/GET movies', () => {
  it('it should GET all the movies', (done) => {
    chai.request(app)
        .get('/v1/movies')
        .set("Authorization", process.env.API_KEY)
        .end((err, res) => {
              res.should.have.status(200);
              res.body.should.be.a('array');
          done();
        });
  });
});

这是我的码头文件:

FROM node:latest
WORKDIR /app/
COPY package.json .
RUN npm install
COPY . .

码头工人组成:

version: '3.8'
services:
    mariadb:
        image: mariadb
        env_file: ./.env
        environment: 
            MYSQL_ROOT_PASSWORD: $MYSQL_ROOT_PASSWORD
            MYSQL_USER: $MYSQL_USER
            MYSQL_PASSWORD: $MYSQL_PASSWORD
            MYSQL_DATABASE: $MYSQL_DATABASE
        ports:
            - $MYSQL_LOCAL_PORT:$MYSQL_DOCKER_PORT
        volumes:
            - mysql:/var/lib/mysql
            - mysql_config:/etc/mysql
            - ./sql/:/docker-entrypoint-initdb.d/
    phpmyadmin:
        image: phpmyadmin
        restart: always
        ports:
        - 8080:80
        environment:
            PMA_HOSTS: mariadb
    web:
        build: .
        env_file: ./.env
        command: npm start
        volumes: 
            - .:/app/
            - /app/node_modules
        ports:
            - $NODE_LOCAL_PORT:$NODE_DOCKER_PORT
        depends_on: 
            - mariadb
        environment: 
            MYSQL_HOST: mariadb
    web-tests:
        image: hypescript_web
        command: npm test
        environment: 
            MYSQL_HOST: mariadb
        depends_on:
            - mariadb
            - web
volumes:
    mysql:
    mysql_config:

docker compose up此测试有效,但在cmd期间运行它时遇到 2 个问题。

如您所见,我为测试创建了另一个容器,我不确定这是否是测试我的 API 的最佳实践。web-tests容器使用我在 docker compose 中构建的 node.js 图像,所以如果我的机器中没有已经构建的图像,我必须注释我所有的 web-tests 服务,当构建图像时,我可以取消注释 web-tests 和我可以用它来运行 mocha 测试。

第二个问题是我需要设置一个超时来运行我的测试(例如 10 秒后),因为我同时构建了我的数据库,并且第一次我会得到数据库错误,因为测试正在运行并且数据库初始化是还没说完 我试图在 mocha 中添加超时,package.json但超时被忽略。

  "scripts": {
    "start": "nodemon -L app.ts",
    "debug": "export DEBUG=* && npm run start",
    "test": "mocha --timeout 10000 -r ts-node/register test/**/*.ts"
  }

我认为我做错了什么,因为运行我的 API 测试非常繁重。我想在第一次运行时运行我的测试而不加注释/取消注释并添加超时。你如何在 docker 中运行你的 API 测试?

标签: node.jsdockerunit-testingdocker-compose

解决方案


推荐阅读