You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 14:15:35