我在 .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>
这没有区别。另一个 SO 答案(How do I get .NET Core projects to copy NuGet references to the build output?)建议将以下内容添加到 .csproj:
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
这处理了缺失的依赖但引入了一个新的依赖:
源的测试主机进程 '/home/runner/work/MyProject/MyProject/test/MyProject.Testing.Data/bin/Release/net6.0/MyProject.Testing.Data.dll' 退出时出现错误:错误:应用程序中指定的程序集 未找到依赖项清单 (testhost.deps.json): 包:'Microsoft.TestPlatform.CommunicationUtilities',版本:'15.0.0.0' 路径:'Microsoft.TestPlatform.CommunicationUtilities.dll'
(当然,我尝试添加 Microsoft.TestPlatform 作为依赖项,但这没有任何区别。)
为了完整起见,我确认 LiteDb 在 Linux 上受支持,因为 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
这是我的 .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>
谁能看出我可能哪里出错了?
很可能,您面临的问题是由于
dotnet test
的工作方式。当您在未指定目标项目的解决方案中运行它时,它会搜索所有可能是 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
叫
runtests.sh
。然后,您可以将 .yaml 文件中的测试步骤替换为以下内容:
- name: Test
run: bash .github/runtests.sh
请注意,您的构建速度会变慢,因为在运行测试时这里没有并行性,但至少该死的东西应该可以工作!