Azure DevOps中.NET Core 2.2测试项目执行失败求助
我来帮你一步步拆解并解决这些问题,先从当前MSTest找不到测试程序集的问题入手,再回头排查之前xUnit测试的异常情况。
一、先搞定MSTest找不到测试程序集的问题
从你贴出的日志来看,VSTest任务完全没匹配到任何测试dll,问题主要出在测试程序集的匹配规则和任务配置上:
1. 修正测试程序集的匹配路径
你当前的testAssemblyVer2配置里的通配符有冗余,而且没精准指向构建后的dll位置:
**\$(BuildConfiguration)\*\*unittests.dll这里多了一层不必要的**,应该改成**\$(BuildConfiguration)\*unittests.dll- 更关键的是,.NET Core项目构建后的测试dll默认在
bin目录下,所以最好直接指定到bin目录下的对应框架文件夹,比如**\bin\$(BuildConfiguration)\netcoreapp2.2\*test*.dll,这样能精准定位到.NET Core 2.2的测试程序集
修正后的匹配规则建议改成这样:
testAssemblyVer2: | **\bin\$(BuildConfiguration)\netcoreapp2.2\*test*.dll !**\*TestAdapter.dll !**\obj\** !**\*Microsoft.VisualStudio.TestPlatform*
2. 删掉手动指定的vstestLocation
你手动指定了2017版Visual Studio的TestPlatform路径,但Azure DevOps的托管代理已经预装了适配.NET Core的测试平台工具,手动指定旧版本路径反而会导致工具不兼容,直接删掉vstestLocationMethod和vstestLocation这两行配置就好。
3. 确认构建任务已经生成了测试程序集
一定要确保在VSTest任务之前,已经通过.NET Core任务执行了dotnet build命令编译测试项目,而且$(BuildConfiguration)变量的值(比如Release)和构建时的配置完全一致,不然测试dll根本没生成,自然找不到。
二、回头排查xUnit测试的无限执行和断言错误问题
你之前提到xUnit测试任务陷入无限执行,超时后出现Assert.Equal() Failure(预期OK,实际0),大概率是测试代码本身的问题:
1. 检查异步测试是否正确处理了await
如果你的测试里有异步方法,但没使用async/await,或者存在未完成的Task,很容易导致测试卡住无限执行。比如这种错误写法:
[Fact] public void TestApiResponse() { var client = new HttpClient(); var responseTask = client.GetAsync("/api/test"); // 直接用Result会阻塞,还可能导致死锁 Assert.Equal("OK", responseTask.Result.StatusCode.ToString()); }
改成正确的异步写法:
[Fact] public async Task TestApiResponse() { var client = new HttpClient(); var response = await client.GetAsync("/api/test"); Assert.Equal(HttpStatusCode.OK, response.StatusCode); }
2. 定位断言错误的根源
Assert.Equal("OK", 0)这种类型不匹配的错误,说明你在某个测试里把数值0和字符串"OK"做了比较,仔细检查对应测试方法的断言逻辑,确认预期值和实际值的类型一致,比如是不是把响应状态码的数值和字符串"OK"搞混了。
3. 推荐用dotnet test代替VSTest任务
对于.NET Core项目,其实更推荐直接用DotNetCoreCLI@2任务执行dotnet test命令,它比VSTest任务更适配.NET Core的测试框架,配置也更简单:
steps: - task: DotNetCoreCLI@2 displayName: 'Build Test Projects' inputs: command: 'build' projects: '**/*test*.csproj' arguments: '--configuration $(BuildConfiguration)' - task: DotNetCoreCLI@2 displayName: 'Run xUnit Tests' inputs: command: 'test' projects: '**/*test*.csproj' arguments: '--configuration $(BuildConfiguration) --logger "console;verbosity=normal"' publishTestResults: true
这个配置会自动找到所有测试项目,先编译再执行测试,还能自动把测试结果发布到Azure DevOps里,不用手动指定dll路径。
三、最后给你几个总结建议
- 优先使用
DotNetCoreCLI@2的test命令来执行.NET Core测试,比VSTest任务更省心 - 所有异步测试方法必须用
async Task修饰,并且在异步操作前加await,避免测试卡住 - 测试程序集的匹配路径一定要指向
bin目录下构建后的dll,不要瞎写通配符 - 确保构建任务和测试任务使用相同的
$(BuildConfiguration)配置,比如都是Release或者Debug
内容的提问来源于stack exchange,提问作者Frazer

