Docker针对容器编写运行测试

时间:2018-07-08 21:18:13

标签: docker asp.net-core docker-compose dockerfile

是否可以在推送图像之前验证容器(对其进行测试)?例如,我有一个docker compose:

构建>运行单元测试>发布应用

但是,我还想验证已发布的应用程序并对其进行一些过程外测试。简而言之,我想运行容器,然后运行dotnet test Example.Api.FullstackTests

我的docker撰写文件

version: '3'

services:
  api:
    build: .
    ports: 
      - "80:80"
    depends_on:
      - "building"
      - "run-fullstack-tests"
  building:
    build:
      context: .
      dockerfile: Dockerfile.Build
  run-fullstack-tests:
    build:
      context: .
      dockerfile: Dockerfile.FullstackTests

这有可能吗?最终,我想在将运行的API推送到注册表之前验证其是否正确。

2 个答案:

答案 0 :(得分:0)

有不同类型的测试。我倾向于将单元测试视为仅依赖于代码库,并且理想情况下取决于系统内最小的代码块,因此您可以并且应该在构建之前在开发系统上运行它们容器。这些通常很难在容器中运行,因为通常您不会在应用程序中附带这种测试代码,但是在代码和测试之间存在非常紧密的代码级连接。

另一方面,集成测试系统测试往往会用真实的或至少是测试数据库来回答您的最后一个问题,“验证正在运行的API是否正确”。 。对于这些,您通常会有一个单独的测试驱动程序来联系您的服务,提出请求并验证结果。然后,您可以执行您的建议:

docker build -t myimage .
docker run -d --name test -p 12345:8080 myimage
./integration_tests http://localhost:12345
docker stop test
docker rm test
docker push myimage

在此示例中,服务在端口8080上侦听;我们将其映射到主机上的端口12345; integration_tests是连接到正在运行的服务的测试运行程序,我们将其指向容器。您可以将这些步骤中的许多步骤打包到Docker Compose YAML文件中,特别是在运行容器需要大量参数的情况下。

答案 1 :(得分:0)

是的,有一个Docker命令可让您在使用docker-compose up时捕获退出代码。 https://docs.docker.com/compose/reference/up/

如果您从这里开始我的基本示例项目: https://github.com/djangofan/karate-test-prime-example

然后使用

docker-compose up --exit-code-from e2e-tests

我认为应该这样做,对吧?