使用Docker compose运行测试容器

3

在推送镜像之前,是否可以验证容器(针对其运行测试)?例如,我有一个Docker Compose文件:

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

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

我的Docker Compose文件:

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推送到注册表之前验证正在运行的API是否正确。

2个回答

1

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 test 吗?我不太明白 ./integration_tests 是什么意思。它是另一个项目文件吗? - Dr Schizo
那就是实际运行测试的任何东西,调用API服务器并检查正确的结果返回。 它可以是几乎任何东西。 如果您还拥有客户端库,那么这可能是使用它的好地方。 但是,是的,它含糊且开放式的。 - David Maze
根据您的回答,我需要拉取Docker工具是吗? - Dr Schizo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接