gpt4 book ai didi

unit-testing - 从多阶段Docker构建(.NET Core 2.0)中提取单元测试结果

转载 作者:行者123 更新时间:2023-12-03 14:22:47 25 4
gpt4 key购买 nike

我正在构建.NET Core 2.0 Web API,并且正在创建Docker镜像。我对Docker很陌生,所以如果之前已经回答过这个问题,我深表歉意。

我有以下用于创建镜像的Docker文件。特别是,我在构建过程中运行单元测试,结果输出到./test/test_results.xml(我猜是在构建期间创建的临时容器中)。我的问题是,构建完成后如何访问这些测试结果?

FROM microsoft/aspnetcore-build:2.0 AS build-env

WORKDIR /app

# Copy main csproj file for DataService
COPY src/DataService.csproj ./src/
RUN dotnet restore ./src/DataService.csproj

# Copy test csproj file for DataService
COPY test/DataService.Tests.csproj ./test/
RUN dotnet restore ./test/DataService.Tests.csproj

# Copy everything else (excluding elements in dockerignore)
COPY . ./

# Run the unit tests
RUN dotnet test --results-directory ./ --logger "trx;LogFileName=test_results.xml" ./test/DataService.Tests.csproj

# Publish the app to the out directory
RUN dotnet publish ./src/DataService.csproj -c Release -o out

# Build the runtime image
FROM microsoft/aspnetcore:2.0
WORKDIR /app
EXPOSE 5001
COPY --from=build-env /app/src/out .

# Copy test results to the final image as well??
# COPY --from=build-env /app/test/test_results.xml .

ENTRYPOINT ["dotnet", "DataService.dll"]

我采用的一种方法是在 # COPY --from=build-env /app/test/test_results.xml .行中进行注释。这会将 test_results.xml放入我的最终图像中。然后,我可以使用以下powershell脚本提取这些结果,并从最终图像中删除 test_results.xml
$id=$(docker create dataservice)
docker cp ${id}:app/test_results.xml ./test/test_results.xml
docker start $id
docker exec $id rm -rf /app/test_results.xml
docker commit $id dataservice
docker rm -vf $id

但是,这看起来很丑陋,我想知道是否有更干净的方法可以做到这一点。

我希望有一种方法可以在 docker build期间挂载卷,但是官方Docker似乎不支持这种方式。

我现在正在考虑创建一个单独的图像,仅用于单元测试。

不知道是否有实现我想要的推荐方法。

最佳答案

感谢您的问题-我需要解决同样的问题。

我根据构建结果添加了一个单独的容器阶段。测试及其输出都在此处处理,因此它们永远不会到达最终容器。因此,使用build-env进行构建,然后基于该build-env镜像的中间测试容器,最后根据运行时容器复制了build-env的结果。

# ---- Test ----
# run tests and capture results for later use. This use the results of the build stage
FROM build AS test
#Use label so we can later obtain this container from the multi-stage build
LABEL test=true
WORKDIR /
#Store test results in a file that we will later extract
RUN dotnet test --results-directory ../../TestResults/ --logger "trx;LogFileName=test_results.xml" "./src/ProjectNameTests/ProjectNameTests.csproj"

我添加了一个Shell脚本作为下一步,然后将该图像标记为project-test。
#!bin/bash
id=`docker images --filter "label=test=true" -q`
docker tag $id projectname-test:latest

在那之后,我基本上要做的就是使用docker cp并取出文件。不同之处在于我的测试结果从未出现在最终图像中,因此我不会触摸最终图像。

总的来说,我认为处理测试的正确方法可能是创建一个测试镜像(基于构建镜像),并以装入的卷来运行以获取测试结果,并在容器启动时让其运行单元测试。拥有适当的图像/容器还可以使您运行集成测试等。本文较旧,但详细信息类似 https://blogs.infosupport.com/build-deploy-test-aspnetcore-docker-linux-tfs2015/

关于unit-testing - 从多阶段Docker构建(.NET Core 2.0)中提取单元测试结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46705781/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com