Azure Devops管道测试步骤失败-数据文件的路径不正确



我有一个包含三个解决方案的Repo。每个解决方案都有多个项目,其中许多项目是共享的(包括测试项目(。

我有一个沿着以下线路的构建管道

  • 检索NuGet包
  • 构建解决方案1
  • 构建解决方案2
  • 构建解决方案3
  • 执行所有测试

执行所有测试的步骤如下:

- task: VSTest@2
displayName: 'Test'
inputs:
testSelector: 'testAssemblies'
testAssemblyVer2: |
***test*.dll
!***TestAdapter.dll
!**obj**
searchFolder: '$(System.DefaultWorkingDirectory)'

绝大多数测试运行良好。然而,对于一些测试,我收到了一条奇怪且相当令人困惑的错误消息:

[error]测试夹具TestProjectOne.A.B.GetSomethingTests 的设置失败

[error]设置:System.IO.DirectoryNotFoundException:找不到路径的一部分"d:\a\1\s\Projects\TestProjectTwo\a\B\TestData\SomeFile.txt".

因此,它目前正在处理TestProjectOne,但随后表示在TestProjectTwo的路径下找不到文件。

测试中的代码如下:

private const string RelativePath = @"....ABTestData";
...
var x = File.ReadAllText(RelativePath + "SomeFile.txt")

不用说,这在使用Visual Studio 2019的同时使用Visual Studio和ReSharper测试运行程序时非常有效。

为什么Azure DevOps管道会遇到这个问题?

为什么Azure DevOps管道会出现此问题?

因为我们在VS测试任务中使用通配符:

- task: VSTest@2
displayName: 'Test'
inputs:
testSelector: 'testAssemblies'
testAssemblyVer2: |
***test*.dll

它将抓取$(System.DefaultWorkingDirectory)文件夹中的所有*test*.dll文件,包括子文件夹。

显然,这种方法带来的巨大便利是,我们不必从文件夹中一个接一个地抓取*test*.dll但它的一个问题是,由于我们使用通配符,它将丢失每个*test*.dll文件的完整路径。在这种情况下,如果我们在*test*.dll文件中指定相对路径....ABTestData,它将无法获得正确的路径,因为当前*test*.dll文件丢失了完整路径。

这就是为什么它从TestProjectOne.A.B.GetSomethingTests执行测试dll,但从TestProjectTwo获取路径的原因。

为了解决这个问题,我们可以在*test*.dll文件中指定完整路径,而不是相对路径。

希望这能有所帮助。