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

Azure devops Azure Devops管道测试步骤失败-数据文件路径不正确,azure-devops,azure-pipelines,azure-pipelines-tasks,Azure Devops,Azure Pipelines,Azure Pipelines Tasks,我有一份包含三种解决方案的回购协议。每个解决方案都有多个项目,其中许多项目是共享的(包括测试项目) 我有一个沿着以下线路的构建管道 检索NuGet包 构建解决方案1 构建解决方案2 构建解决方案3 执行所有测试 执行所有测试的步骤如下: - task: VSTest@2 displayName: 'Test' inputs: testSelector: 'testAssemblies' testAssemblyVer2: | **\*test*.dll

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

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

  • 检索NuGet包
  • 构建解决方案1
  • 构建解决方案2
  • 构建解决方案3
  • 执行所有测试
执行所有测试的步骤如下:

- task: VSTest@2
  displayName: 'Test'
  inputs:
    testSelector: 'testAssemblies'
    testAssemblyVer2: |
      **\*test*.dll
      !**\*TestAdapter.dll
      !**\obj\**
    searchFolder: '$(System.DefaultWorkingDirectory)'
private const string RelativePath = @"..\..\A\B\TestData\";
...
var x = File.ReadAllText(RelativePath + "SomeFile.txt")
绝大多数测试都运行良好。然而,对于一些测试,我得到了奇怪且相当混乱的错误消息:

[错误]测试夹具TestProjectOne.A.B.GetSomethingTests的安装失败

[错误]安装程序:System.IO.DirectoryNotFoundException:找不到路径的一部分 'd:\a\1\s\Projects\TestProjectTwo\a\B\TestData\SomeFile.txt'

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

测试中的代码如下所示:

- task: VSTest@2
  displayName: 'Test'
  inputs:
    testSelector: 'testAssemblies'
    testAssemblyVer2: |
      **\*test*.dll
      !**\*TestAdapter.dll
      !**\obj\**
    searchFolder: '$(System.DefaultWorkingDirectory)'
private const string RelativePath = @"..\..\A\B\TestData\";
...
var x = File.ReadAllText(RelativePath + "SomeFile.txt")
不用说,使用VisualStudio2019并使用VisualStudio和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
文件中指定相对路径
。\..\A\B\TestData\
,它将无法获得正确的路径,因为当前的
*test*.dll
文件丢失了其完整路径

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

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


希望这能有所帮助。

另外一点信息是,我对所有14个测试项目都使用了一个任务。对于属性
testAssemblyVer2
I,我添加了每个DLL的路径,并用管道分隔符分隔。我花了一些时间才找到正确的路径,但它如下:
a\B.Test\bin\Release\B.Test.dll