node.js - 从 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 测试?
解决方案
推荐阅读
- javascript - 输入类型 =“数字”的最大长度 Parlsey.js
- python - 点冻结需要 26 秒
- c# - 在 ASP.NET Core Angular 应用程序中运行时更改主题很热门
- c - ESP32变量的多重定义
- r - R生存分析:coxph - 包括时间为零的个体
- java - 您能否在用户更新到 Google Play 商店中您的应用程序的最新版本之前向他们发出警告?
- cakephp - CakePHP 3 - 即使定义了关系,也无法使用分层数据进行跨数据库 ORM 查询
- c - C - 如何迭代文本文件并检查特定字符是否存在
- python - 如何在大型数据帧上优化 while 循环
- php - 在 laravel 中注册后保存到数据库不起作用