基于事件驱动架构构建微服务第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文件應如下所示:
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”我可以使用下列命令編輯測試結果文件
cat?UnitTestResultfile.trxdocker-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
docker-compose.override-unit-tests文件
這個文件覆蓋了docker-compose-unit-tests文件,所以我添加了一個ASPNETCORE_ENVIRONMENT和一個入口點來運行單元測試
構建單元測試項目
要構建單元測試項目,我可以運行以下命令:
docker-compose?-f?docker-compose-unit-tests.yml?-f?docker-compose.override-unit-tests.yml?build構建將創建一個鏡像logcorner-edusync-speech-domain-unit-test:latest。
讓我們使用以下命令以交互模式運行鏡像logcorner-edusync-speech-domain-unit-test:latest:
docker?run?–rm?-it?logcorner-edusync-speech-domain-unit-test:latestls?-la讓我們運行單元測試
dotnet?test?–logger?“trx;LogFileName=.\domain-tests\tests-results-domain.xml”ls?-lacd?TestResultsls?-lacd?domain-testsls我應該在名為tests-results-domain.xml的容器中看到一個文件
我可以使用以下命令編輯tests-results-domain.xml文件。
cat?tests-results-domain.xmlexit然后如果我再次啟動容器,tests-results-domain.xml文件應該消失。
docker?run?–rm?-it?logcorner-edusync-speech-domain-unit-test:latestls?-la發布測試結果
因為當容器停止運行時測試結果文件(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運行單元測試項目
要運行單元測試,我必須運行以下命令:
docker-compose?-f?docker-compose-unit-tests.yml?-f?docker-compose.override-unit-tests.yml?up我應該在主機上創建一個tests-results-domain文件夾,這個文件夾應該包含測試結果。
在我的CI/CD管道中,我將使用主機上的TestResults文件夾來發布測試結果
容器化其他UnitTest項目
為了容器化其他單元測試項目(infrastructure, presentation, application),我遵循與領域單元測試相同的場景
你可以在這里找到整個docker-compose-unit-tests.yml和docker-compose.override-unit-tests.yml文件
要構建和運行所有單元測試,我必須運行以下命令:
源代碼可在此處獲得:
https://github.com/logcorner/LogCorner.EduSync.Speech.Command/tree/Task/DockerUnitTesting
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的基于事件驱动架构构建微服务第10部分:在docker容器内运行单元测试的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 号称迄今为止最快,.NET6带来了什么?
- 下一篇: .NET6 如期⽽⾄
