基于事件驱动架构构建微服务第10部分:在docker容器内运行单元测试
原文鏈接:https://logcorner.com/building-microservices-through-event-driven-architecture-part11-run-unit-tests-inside-a-docker-container/
在本教程中,我將展示如何在docker容器中運(yùn)行單元測試。
因為我將使用kubernetes在容器中運(yùn)行微服務(wù),所以單元測試、集成測試、持續(xù)集成和持續(xù)交付將使用docker鏡像和容器來完成。
LogCorner.EduSync.Speech.Domain.UnitTest
讓我們繼續(xù)打開LogCorner.EduSync.Speech.Domain.UnitTest項目并創(chuàng)建一個這樣的docker文件(你可以通過右鍵單擊項目名稱并選擇Docker Support來生成 docker 文件)
Docker文件
Docker文件應(yīng)如下所示:
FROM?mcr.microsoft.com/dotnet/core/sdk:3.1-buster?AS?build使用 mcr.microsoft.com/dotnet/core/sdk:3.1-buster 作為基礎(chǔ)鏡像
WORKDIR?/src在docker鏡像中創(chuàng)建/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/”]復(fù)制當(dāng)前文件夾(src)上的LogCorner.EduSync.Speech.Domain.UnitTest.csproj文件和LogCorner.EduSync.Speech.Domain.csproj文件
請注意,應(yīng)復(fù)制引用的.csproj項目文件,以便以后能夠恢復(fù)包。
RUN?dotnet?restore?“LogCorner.EduSync.Speech/LogCorner.EduSync.Speech.Domain.UnitTest/LogCorner.EduSync.Speech.Domain.UnitTest.csproj”:為Log Corner.EduSync.Speech.Domain.UnitTest項目和引用的項目恢復(fù)包。
COPY?.?.將所有內(nèi)容(除了.dockerignore文件中包含的文件/目錄)復(fù)制到docker鏡像中的/src目錄。
WORKDIR?“/src/LogCorner.EduSync.Speech/LogCorner.EduSync.Speech.Domain.UnitTest”將當(dāng)前文件夾更改為LogCorner.EduSync.Speech.Domain.UnitTest 項目。
要對其進(jìn)行測試,請移至\LogCorner.EduSync.Command\src文件夾并運(yùn)行以下命令以使用unite test Docker文件構(gòu)建和創(chuàng)建名為unittest-image的鏡像:
docker?build?-t?unittest-image?-f?LogCorner.EduSync.Speech\LogCorner.EduSync.Speech.Domain.UnitTest\Dockerfile?.然后,使用unittest-image作為鏡像以交互模式啟動容器
docker?run?-it?unittest-image最后使用以下命令運(yùn)行單元測試:
dotnet?test?–logger?“trx;LogFileName=UnitTestResultfile.trx”我可以使用下列命令編輯測試結(jié)果文件
cat?UnitTestResultfile.trxdocker-compose文件
Compose是一個用于定義和運(yùn)行多容器Docker應(yīng)用程序的工具。借助Compose,你可以使用YAML文件來配置應(yīng)用程序的服務(wù)。然后,使用單個命令,從配置中創(chuàng)建并啟動所有服務(wù)。https://docs.docker.com/compose/
所以讓我們創(chuàng)建一個docker-compose-unit-tests文件
docker-compose-unit-tests文件
該文件用于構(gòu)建和運(yùn)行鏡像logcorner-edusync-speech-domain-unit-test,它使用單元測試Dockerfile。
然后創(chuàng)建并啟動鏡像logcorner.edusync.speech.domain.unittest
docker-compose.override-unit-tests文件
這個文件覆蓋了docker-compose-unit-tests文件,所以我添加了一個ASPNETCORE_ENVIRONMENT和一個入口點(diǎn)來運(yùn)行單元測試
構(gòu)建單元測試項目
要構(gòu)建單元測試項目,我可以運(yùn)行以下命令:
docker-compose?-f?docker-compose-unit-tests.yml?-f?docker-compose.override-unit-tests.yml?build構(gòu)建將創(chuàng)建一個鏡像logcorner-edusync-speech-domain-unit-test:latest。
讓我們使用以下命令以交互模式運(yùn)行鏡像logcorner-edusync-speech-domain-unit-test:latest:
docker?run?–rm?-it?logcorner-edusync-speech-domain-unit-test:latestls?-la讓我們運(yùn)行單元測試
dotnet?test?–logger?“trx;LogFileName=.\domain-tests\tests-results-domain.xml”ls?-lacd?TestResultsls?-lacd?domain-testsls我應(yīng)該在名為tests-results-domain.xml的容器中看到一個文件
我可以使用以下命令編輯tests-results-domain.xml文件。
cat?tests-results-domain.xmlexit然后如果我再次啟動容器,tests-results-domain.xml文件應(yīng)該消失。
docker?run?–rm?-it?logcorner-edusync-speech-domain-unit-test:latestls?-la發(fā)布測試結(jié)果
因為當(dāng)容器停止運(yùn)行時測試結(jié)果文件(tests-results-domain.xml)消失了,所以我必須在docker容器和主機(jī)之間共享tests-results-domain.xml文件。
因此,我將在主機(jī)上創(chuàng)建一個文件夾,并將其映射到docker容器內(nèi)包含測試結(jié)果的文件夾。
我必須在docker-compose文件中添加這樣的卷:
volumes:–?./TestResults/tests-results-domain:/domain-tests并且,我在容器的domain-tests和主機(jī)的tests-results-domain之間創(chuàng)建了一個卷映射。
volumes: –?./tests-results-domain:/domain-tests運(yùn)行單元測試項目
要運(yùn)行單元測試,我必須運(yùn)行以下命令:
docker-compose?-f?docker-compose-unit-tests.yml?-f?docker-compose.override-unit-tests.yml?up我應(yīng)該在主機(jī)上創(chuàng)建一個tests-results-domain文件夾,這個文件夾應(yīng)該包含測試結(jié)果。
在我的CI/CD管道中,我將使用主機(jī)上的TestResults文件夾來發(fā)布測試結(jié)果
容器化其他UnitTest項目
為了容器化其他單元測試項目(infrastructure, presentation, application),我遵循與領(lǐng)域單元測試相同的場景
你可以在這里找到整個docker-compose-unit-tests.yml和docker-compose.override-unit-tests.yml文件
要構(gòu)建和運(yùn)行所有單元測試,我必須運(yùn)行以下命令:
源代碼可在此處獲得:
https://github.com/logcorner/LogCorner.EduSync.Speech.Command/tree/Task/DockerUnitTesting
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的基于事件驱动架构构建微服务第10部分:在docker容器内运行单元测试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 号称迄今为止最快,.NET6带来了什么?
- 下一篇: nameof() 到底是编译时还是运行时