由于缺少依赖项,.NET 应用程序测试在 GitHub Actions 上失败

Ste*_*son 5 c# .net-core github-actions

我在 .NET 解决方案中有一组 .NET 6.0 项目,其中一个是测试数据提供程序。我正在使用LiteDB来存储测试数据记录。该解决方案在本地构建良好并成功完成所有测试。我已经使用 GitHub Actions 在 GitHub 上设置了标准 CI 构建管道;构建完成时没有出现任何问题,并且不依赖于测试数据库的测试运行良好

但是依赖于 LiteDb 数据库的测试无法运行,因为构建服务器在查找 LiteDb 程序集时似乎存在问题:

源“/home/runner/work/MyProject.Core/MyProject.Core/test/MyProject.Testing.Data/bin/Release/net6.0/MyProject.Testing.Data.dll”的测试主机进程退出并出现错误:错误:找不到应用程序依赖项清单 (MyProject.Testing.Data.deps.json) 中指定的程序集:包:'LiteDB',版本:'5.0.16' 路径:'lib/netstandard2.0/LiteDB。 DLL'

大多数具有类似错误消息的文章都与 ASP.NET Core 相关,例如,未找到应用程序依赖项清单 (...) 中指定的程序集,但抓住了救命稻草,我尝试将以下内容添加到测试数据项目中:

<PublishWithAspNetCoreTargetManifest>false</PublishWithAspNetCoreTargetManifest>
Run Code Online (Sandbox Code Playgroud)

这没有什么区别。另一个SO答案(How do I get .NET Core items to copy NuGetreferences to the buildoutput?)建议将以下内容添加到.csproj:

<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
Run Code Online (Sandbox Code Playgroud)

这解决了缺少的依赖项,但引入了一个新的依赖项:

源“/home/runner/work/MyProject/MyProject/test/MyProject.Testing.Data/bin/Release/net6.0/MyProject.Testing.Data.dll”的测试主机进程退出并出现错误:错误:An找不到应用程序依赖项清单 (testhost.deps.json) 中指定的程序集:包:'Microsoft.TestPlatform.CommunicationUtilities',版本:'15.0.0.0' 路径:'Microsoft.TestPlatform.CommunicationUtilities.dll'

(当然,我尝试添加 Microsoft.TestPlatform 作为依赖项,但这没有任何区别。)

为了完整起见,我确认 Linux 上支持 LiteDb,因为 GitHub Actions 服务在 Ubuntu 上运行 - 看起来那里没有任何问题。应用程序和所有程序集(和测试)都以 .NET 6.0 为目标,并且所有项目都设置为构建 AnyCPU。这是我的ci.yml文件,如果有帮助的话:

name: CI

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

jobs:
  build:

    env:
      BUILD_CONFIG: 'Release'
      SOLUTION: 'MyProject.Core.sln'
      
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3
    
    - name: Setup .NET
      uses: actions/setup-dotnet@v3
      with:
        dotnet-version: 6.0.x
        
    - name: Restore dependencies
      run: dotnet restore
      
    - name: Build
      run: dotnet build $SOLUTION --configuration $BUILD_CONFIG --no-restore
      
    - name: Test
      run: dotnet test /p:Configuration=$BUILD_CONFIG --no-build --verbosity normal
Run Code Online (Sandbox Code Playgroud)

以下是我的 .csproj 的前 10 行(5.0.* 是解决该问题的另一种尝试;它也可以很容易地是 5.0.16):

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFrameworks>net6.0</TargetFrameworks>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>
    
  <ItemGroup>
    <PackageReference Include="LiteDB" Version="5.0.*" />
    <PackageReference Include="xunit" Version="2.4.2" />
  </ItemGroup>
Run Code Online (Sandbox Code Playgroud)

谁能看到我在这里可能出错的地方吗?

Dav*_*Net 4

您面临的问题很可能是由于dotnet test工作方式造成的。当您在解决方案中运行它而不指定目标项目时,它会搜索可能是测试项目的所有项目。无论出于何种原因,它已确定您的测试数据支持库包含测试,但无法运行它,因为它找不到依赖项。

假设是这种情况,您需要做的就是在dotnet test调用中更加具体。遗憾的是,dotnet test命令行不接受通配符,因此即使您的测试项目都具有文件名格式:

MyProject.SomeFunction.Tests

那么就没有办法选择性地运行它们。

我的建议是将 Bash 脚本添加到您的项目中(例如在 .github 文件夹中),如下所示:

#!/bin/bash

FAILURES=0
TEST_PROJECTS=$(find test -name "MyProject.*.Tests")

for PROJECT in $TEST_PROJECTS
do 
    (dotnet test ./$PROJECT --no-build --verbosity normal)
    if test "$?" != "0" 
    then ((FAILURES+=1)) 
    fi    
done

exit $FAILURES
Run Code Online (Sandbox Code Playgroud)

打电话说runtests.sh。然后,您可以将 .yaml 文件中的测试步骤替换为以下内容:

- name: Test
  run: bash .github/runtests.sh
Run Code Online (Sandbox Code Playgroud)

请注意,您的构建会变慢,因为运行测试时这里没有并行性,但至少该死的东西应该可以工作!