GitLab CI中dotnet test无法识别测试用例,如何复用构建产物?
GitLab CI复用构建Artifacts时dotnet test无法找到测试用例的解决方案
问题描述
在GitLab CI的测试阶段复用构建阶段生成的artifacts时,dotnet test命令无法找到任何测试用例直接退出;同时dotnet restore和dotnet build在本地与CI环境的执行表现存在差异。对比本地与CI生成的文件后,发现本地多了部分NuGet相关文件,推测是artifacts遗漏了关键文件。当前.gitlab-ci.yml配置如下:
image: mcr.microsoft.com/dotnet/sdk:7.0 variables: CONFIGURATION: 'Release' MSBUILDDISABLENODEREUSE: "1" TEST_RESULT_DIRECTORY: '.test-results' default: tags: - .NET 6.0 - WPF stages: - Build - Test Build: stage: Build script: - dotnet restore --no-cache - dotnet build --no-restore --configuration $CONFIGURATION artifacts: paths: - ./**/bin/Release - ./**/obj/Release expire_in: 1 day Test: stage: Test needs: - job: Build artifacts: true script: - dotnet test --no-build --nologo --configuration $CONFIGURATION --test-adapter-path:. --logger:"junit;LogFilePath=../$TEST_RESULT_DIRECTORY/{assembly}.xml;MethodFormat=Class;FailureBodyFormat=Verbose" artifacts: when: always reports: junit: - ./$TEST_RESULT_DIRECTORY/*.xml
解决步骤
1. 补充NuGet关键文件到Artifacts
构建阶段的artifacts仅包含bin/Release和obj/Release,但dotnet test依赖obj/project.assets.json这类NuGet元数据文件来识别测试项目。修改Build阶段的artifacts配置:
Build: stage: Build script: - dotnet restore --no-cache - dotnet build --no-restore --configuration $CONFIGURATION artifacts: paths: - ./**/bin/Release - ./**/obj/Release - ./**/obj/project.assets.json # 新增:测试依赖的NuGet元数据文件 expire_in: 1 day
2. 调整Test阶段命令参数
移除多余的适配器路径参数,提前创建测试结果目录避免写入失败:
Test: stage: Test needs: - job: Build artifacts: true before_script: - mkdir -p $TEST_RESULT_DIRECTORY # 提前创建目录,防止日志写入报错 script: - dotnet test --no-build --nologo --configuration $CONFIGURATION --logger:"junit;LogFilePath=$TEST_RESULT_DIRECTORY/{assembly}.xml;MethodFormat=Class;FailureBodyFormat=Verbose" artifacts: when: always reports: junit: - ./$TEST_RESULT_DIRECTORY/*.xml
- 移除
--test-adapter-path:.:默认测试适配器会自动加载,指定路径可能导致无法识别测试项目
3. 统一.NET版本环境
CI镜像使用的是.NET 7.0 SDK,但默认标签标注为.NET 6.0,版本不匹配会导致构建/测试行为差异。二选一调整:
# 方案1:将镜像改为与标签匹配的.NET 6.0 SDK image: mcr.microsoft.com/dotnet/sdk:6.0 # 方案2:修改标签为.NET 7.0 default: tags: - .NET 7.0 - WPF
4. 验证构建产物完整性
在Build阶段添加检查步骤,确保测试项目的DLL已生成:
Build: stage: Build script: - dotnet restore --no-cache - dotnet build --no-restore --configuration $CONFIGURATION - ls -la ./**/bin/Release/*Test*.dll # 检查测试项目DLL是否存在 artifacts: paths: - ./**/bin/Release - ./**/obj/Release - ./**/obj/project.assets.json expire_in: 1 day
内容的提问来源于stack exchange,提问作者Hille
相关产品推荐
相关产品推荐

