0

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

我有一个沿着以下几行的构建管道

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

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

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

绝大多数测试运行完美。但是,对于某些测试,我收到了奇怪且相当混乱的错误消息:

[错误] 测试夹具 TestProjectOne.ABGetSomethingTests 的设置失败

[错误]SetUp:System.IO.DirectoryNotFoundException:找不到路径“d:\a\1\s\Projects\TestProjectTwo\A\B\TestData\SomeFile.txt”的一部分。

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

测试中的代码如下:

private const string RelativePath = @"..\..\A\B\TestData\";
...
var x = File.ReadAllText(RelativePath + "SomeFile.txt")

不用说,这在 Visual Studio 2019 中使用 Visual Studio 和 ReSharper 测试运行程序完美运行。

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

4

1 回答 1

1

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

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

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

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

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

这就是为什么它从 执行测试 dll TestProjectOne.A.B.GetSomethingTests,但从TestProjectTwo.

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

希望这可以帮助。

于 2020-02-25T03:48:19.727 回答