基于事件驱动架构构建微服务第10部分:在docker容器内运行单元测试

原文链接:https://logcorner.com/building-microservices-through-event-driven-architecture-part11-run-unit-tests-inside-a-docker-container/

在本教程中,我将展示如何在docker容器中运行单元测试。

因为我将使用kubernetes在容器中运行微服务,所以单元测试、集成测试、持续集成和持续交付将使用docker镜像和容器来完成。

LogCorner.EduSync.Speech.Domain.UnitTest

让我们继续打开LogCorner.EduSync.Speech.Domain.UnitTest项目并创建一个这样的docker文件(你可以通过右键单击项目名称并选择Docker Support来生成 docker 文件)

Docker文件

Docker文件应如下所示:

c06effde8558bacf4090731a53c5f91f.png

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build

使用 mcr.microsoft.com/dotnet/core/sdk:3.1-buster 作为基础镜像

WORKDIR /src

在docker镜像中创建/src目录。

COPY [“LogCorner.EduSync.Speech/LogCorner.EduSync.Speech.Domain.UnitTest/LogCorner.EduSync.Speech.Domain.UnitTest.csproj”, “LogCorner.EduSync.Speech/LogCorner.EduSync.Speech.Domain.UnitTest/”]
COPY [“LogCorner.EduSync.Speech/LogCorner.EduSync.Speech.Domain/LogCorner.EduSync.Speech.Domain.csproj”, “LogCorner.EduSync.Speech/LogCorner.EduSync.Speech.Domain/”]

复制当前文件夹(src)上的LogCorner.EduSync.Speech.Domain.UnitTest.csproj文件和LogCorner.EduSync.Speech.Domain.csproj文件

请注意,应复制引用的.csproj项目文件,以便以后能够恢复包。

RUN dotnet restore “LogCorner.EduSync.Speech/LogCorner.EduSync.Speech.Domain.UnitTest/LogCorner.EduSync.Speech.Domain.UnitTest.csproj”:

为Log Corner.EduSync.Speech.Domain.UnitTest项目和引用的项目恢复包。

COPY . .

将所有内容(除了.dockerignore文件中包含的文件/目录)复制到docker镜像中的/src目录。

WORKDIR “/src/LogCorner.EduSync.Speech/LogCorner.EduSync.Speech.Domain.UnitTest”

将当前文件夹更改为LogCorner.EduSync.Speech.Domain.UnitTest 项目。

要对其进行测试,请移至\LogCorner.EduSync.Command\src文件夹并运行以下命令以使用unite test Docker文件构建和创建名为unittest-image的镜像:

docker build -t unittest-image -f LogCorner.EduSync.Speech\LogCorner.EduSync.Speech.Domain.UnitTest\Dockerfile .

然后,使用unittest-image作为镜像以交互模式启动容器

docker run -it unittest-image

最后使用以下命令运行单元测试:

dotnet test –logger “trx;LogFileName=UnitTestResultfile.trx”

971df3b7a12f26a9c211a897c230c1a8.png

我可以使用下列命令编辑测试结果文件

cat UnitTestResultfile.trx

docker-compose文件

Compose是一个用于定义和运行多容器Docker应用程序的工具。借助Compose,你可以使用YAML文件来配置应用程序的服务。然后,使用单个命令,从配置中创建并启动所有服务。https://docs.docker.com/compose/

所以让我们创建一个docker-compose-unit-tests文件

docker-compose-unit-tests文件

该文件用于构建和运行镜像logcorner-edusync-speech-domain-unit-test,它使用单元测试Dockerfile。

然后创建并启动镜像logcorner.edusync.speech.domain.unittest

e1480c2d37f233113cc2fb174e3f363f.png

docker-compose.override-unit-tests文件

这个文件覆盖了docker-compose-unit-tests文件,所以我添加了一个ASPNETCORE_ENVIRONMENT和一个入口点来运行单元测试

c5e6a81a137708614645b5a774d2120e.png

构建单元测试项目

要构建单元测试项目,我可以运行以下命令:

docker-compose -f docker-compose-unit-tests.yml -f docker-compose.override-unit-tests.yml build

a97931d05c853e7244ce8e5647fe1535.png

构建将创建一个镜像logcorner-edusync-speech-domain-unit-test:latest。

让我们使用以下命令以交互模式运行镜像logcorner-edusync-speech-domain-unit-test:latest:

docker run –rm -it logcorner-edusync-speech-domain-unit-test:latest

ls -la

71362bc5085002762665790f4203fa1a.png

让我们运行单元测试

dotnet test –logger “trx;LogFileName=.\domain-tests\tests-results-domain.xml”

7a3a0769ab4d3a5ffdacc85da323e650.png

ls -la

cd TestResults

ls -la

cd domain-tests

ls

a1f99938fc519262f92df48ebaec1ecb.png

我应该在名为tests-results-domain.xml的容器中看到一个文件

我可以使用以下命令编辑tests-results-domain.xml文件。

cat tests-results-domain.xml

exit

然后如果我再次启动容器,tests-results-domain.xml文件应该消失。

docker run –rm -it logcorner-edusync-speech-domain-unit-test:latest

ls -la

9414a5be4724d6f1de1bbd3c4bd51919.png

发布测试结果

因为当容器停止运行时测试结果文件(tests-results-domain.xml)消失了,所以我必须在docker容器和主机之间共享tests-results-domain.xml文件。

因此,我将在主机上创建一个文件夹,并将其映射到docker容器内包含测试结果的文件夹。

我必须在docker-compose文件中添加这样的卷:

volumes:
    – ./TestResults/tests-results-domain:/domain-tests

并且,我在容器的domain-tests和主机的tests-results-domain之间创建了一个卷映射。

volumes:
– ./tests-results-domain:/domain-tests

6fb42077e92bb91dcc191cd6d1856163.png

运行单元测试项目

要运行单元测试,我必须运行以下命令:

docker-compose -f docker-compose-unit-tests.yml -f docker-compose.override-unit-tests.yml up

ff53b6b32b99d7b0e44a24115def03b0.png

6d440e26bd83df5b9d77bbeedb63fcab.png

我应该在主机上创建一个tests-results-domain文件夹,这个文件夹应该包含测试结果。

在我的CI/CD管道中,我将使用主机上的TestResults文件夹来发布测试结果

容器化其他UnitTest项目

为了容器化其他单元测试项目(infrastructure, presentation, application),我遵循与领域单元测试相同的场景

你可以在这里找到整个docker-compose-unit-tests.yml和docker-compose.override-unit-tests.yml文件

88b937f3917894c7689b1717039ef649.png

8a46f80269c05be6f94e3984f5f4a177.png

要构建和运行所有单元测试,我必须运行以下命令:

docker-compose -f docker-compose-unit-tests.yml -f docker-compose.override-unit-tests.yml build

docker-compose -f docker-compose-unit-tests.yml -f docker-compose.override-unit-tests.yml up

8be81ac8ff8ffdfbdef25153f204ee0f.png

源代码可在此处获得:

https://github.com/logcorner/LogCorner.EduSync.Speech.Command/tree/Task/DockerUnitTesting

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值