【问题标题】:Docker compose run tests against containerDocker 编写针对容器的运行测试
【发布时间】:2018-07-08 21:18:13
【问题描述】:

是否可以在推送映像之前验证容器(针对它运行测试)?例如,我有一个 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 是否正确。

【问题讨论】:

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


    【解决方案1】:

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

    另一方面,集成测试系统测试倾向于回答您的最后一个问题,“验证正在运行的 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 文件中,尤其是在运行容器需要大量参数的情况下。

    【讨论】:

    • 嗯,对了,我可以有另一个 docker 文件来创建一个正在运行的容器。然后我可以调用 dotnet 测试吗?我不太了解 ./integration_tests 位。那是另一个项目文件吗?
    • 这就是实际运行测试、调用 API 服务器并检查是否返回正确的结果。它几乎可以是任何东西。如果您还有一个客户端库,这可能是一个使用它的好地方。但是,是的,它是模糊的和开放式的。
    • 根据你的回答,我需要把 docker 工具拉得太对吗?
    【解决方案2】:

    是的,有一个 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
    

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

    【讨论】:

      猜你喜欢
      • 2020-04-22
      • 1970-01-01
      • 2018-09-21
      • 2015-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多