C# 通过多个代理在Azure管道中将变量从一个Visual Studio测试任务传递到另一个

C# 通过多个代理在Azure管道中将变量从一个Visual Studio测试任务传递到另一个,c#,azure-devops,azure-pipelines,vstest,testrunconfig,C#,Azure Devops,Azure Pipelines,Vstest,Testrunconfig,我在项目中有两个单元测试,它们相互依赖。在一个测试运行之后,我将捕获输出,等待它在另一个系统中同步,并使用第一个测试的输出执行另一个测试。我正在尝试使用azure管道来实现这一点。我创建了3个代理作业-,在作业A中,我运行单元Test1并创建一个输出变量,该变量传递给作业C中的一个变量,作业B是一个无代理服务器,在这两个代理之间延迟1分钟。我已经使用overrideTestrunParameters:'-sauce2$(sauce5)'来覆盖第二个测试的参数,但在将参数传递给第二个代理任务时,我

我在项目中有两个单元测试,它们相互依赖。在一个测试运行之后,我将捕获输出,等待它在另一个系统中同步,并使用第一个测试的输出执行另一个测试。我正在尝试使用azure管道来实现这一点。我创建了3个代理作业-,在作业A中,我运行单元Test1并创建一个输出变量,该变量传递给作业C中的一个变量,作业B是一个无代理服务器,在这两个代理之间延迟1分钟。我已经使用overrideTestrunParameters:'-sauce2$(sauce5)'来覆盖第二个测试的参数,但在将参数传递给第二个代理任务时,我遇到了以下错误

[警告]无法分析覆盖运行参数字符串:-sauce2 [错误]SetupPhase.Run:更新运行设置期间发生异常:System.FormatException:重写测试运行参数时遇到错误。请检查提供的测试运行参数。 位于Microsoft.VisualStudio.TestService.SettingsManager.OverrideParamAssettingsProcessor.GetOverrideParameters(字符串OverrideParametersString) 位于Microsoft.VisualStudio.TestService.SettingsManager.OverrideParamAssettingsProcessor.UpdateSettingsWithParameters(XDocument设置) 位于Microsoft.VisualStudio.TestService.SettingsManager.CommonSettingsManager.UpdateCommonSettings(InputDataContract InputDataContract,SettingsModifier SettingsModifier) 在Microsoft.VisualStudio.TestService.SettingsManager.SettingsManager.UpdateSettingsAsRequired(InputDataContract InputDataContract) 位于MS.VS.TestService.VstestConsoleAdapter.SetupPhase.Run(VstestConsoleRunContext testRunContext,CancellationToken CancellationToken)

[错误]设置更新失败,错误:重写测试运行参数时遇到错误。请检查提供的测试运行参数。 TestRunParameters:

 <RunSettings>
 <TestRunParameters>
    <Parameter name="sauce" value="chilly" />
    <Parameter name="sauce1" value="chilly1" />
    <Parameter name="sauce2" value="chilly2" />
</TestRunParameters>
[Test]
    public void UnitTest1()
    {
        string sauce = TestContext.Parameters["sauce"];
        string sauce1 = TestContext.Parameters["sauce1"];
        TestContext.Progress.WriteLine(sauce);
        TestContext.Progress.WriteLine(sauce1);
        //creating outpute variable in azure
        TestContext.Progress.WriteLine("##vso[task.setvariable variable=sauce4;Secret=false;isOutput=true;]crushed tomatoes");
    }

    [Test]
    public void UnitTest2()
    {
        string sauce2 = TestContext.Parameters["sauce2"];
        TestContext.Progress.WriteLine($"sauce2: {sauce2}");
    }
Azure.yaml管道:

jobs:


- job: A
pool:
  name: New Agent Pool
  demands: 
  - msbuild
  - visualstudio
  - vstest

variables:
  solution: '**/*.sln'
  buildPlatform: 'Any CPU'
  buildConfiguration: 'Debug'
  sauce: 'tomato'
  sauce1: 'pepper'

steps:
- task: NuGetCommand@2
  displayName: 'NuGet restore'
  inputs:
    restoreSolution: '$(solution)'

- task: VSBuild@1
  inputs:
    solution: '$(solution)'
    msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactStagingDirectory)"'
    platform: '$(buildPlatform)'
    configuration: '$(buildConfiguration)'      

- task: VSTest@2
  displayName: 'Unit Test1'
  inputs:
    testAssemblyVer2: |
      **\$(BuildConfiguration)\*Test*.dll
      !**\obj\**
    testFiltercriteria: 'Name=UnitTest1'
    runSettingsFile: SeleniumTest.ABC/Test.runsettings
    platform: '$(buildPlatform)'
    configuration: '$(buildConfiguration)'
    overrideTestrunParameters: '-sauce $(sauce)'
  name: 'OutputVar'

  - job: B
dependsOn: 
  - A 
pool: server
steps:
- task: Delay@1
  inputs:
    delayForMinutes: '1'

  - job: C
dependsOn: 
  - A 
  - B
pool:
  name: New Agent Pool
  demands: 
  - msbuild
  - visualstudio
  - vstest

variables:
  solution: '**/*.sln'
  buildPlatform: 'Any CPU'
  buildConfiguration: 'Debug'
  sauce2: $[dependencies.A.outputs['outputVar.sauce4']]

steps:
- task: NuGetCommand@2
  displayName: 'NuGet restore'
  inputs:
    restoreSolution: '$(solution)'

- task: VSBuild@1
  inputs:
    solution: '$(solution)'
    msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactStagingDirectory)"'
    platform: '$(buildPlatform)'
    configuration: '$(buildConfiguration)'
  
- task: PowerShell@2
  inputs:
    targetType: 'inline'
    script: |
      # Write your PowerShell commands here.      
      Write-Host run time value
      Write-Host sauce2 = $(sauce2)

- task: VSTest@2
  displayName: 'Unit Test2'
  inputs:
    testAssemblyVer2: |
      **\$(BuildConfiguration)\*Test*.dll
      !**\obj\**
    testFiltercriteria: 'Name=UnitTest2'
    runSettingsFile: SeleniumTest.ABC/Test.runsettings
    platform: '$(buildPlatform)'
    configuration: '$(buildConfiguration)'
    overrideTestrunParameters: '-sauce2 $(sauce2)'
  condition: succeededOrFailed()
屏幕截图:

我可以看到在Powershell任务中打印了新的运行时参数,但在VS测试任务中它失败了。
有人能告诉我如何在VSTest任务中捕获运行时变量并传递到Azure管道中的另一个VSTest任务。

输出变量已成功从作业A传递到作业C,因为powershell任务可以打印出新变量
$(source2)

问题来自作业C中vstest任务的
重写了strunParameters:'-sauce2$(sauce2)
$(sauce2)
计算为
压碎的西红柿
,不带引号“”

请尝试将
$(sauce2)
用双引号括起来:


overrideTestrunParameters:'-sauce2“$(sauce2)”

输出变量已成功从作业A传递到作业C,因为powershell任务可以打印出新变量
$(source2)

问题来自作业C中vstest任务的
重写了strunParameters:'-sauce2$(sauce2)
$(sauce2)
计算为
压碎的西红柿
,不带引号“”

请尝试将
$(sauce2)
用双引号括起来:


覆盖了结构参数:'-sauce2“$(sauce2)”

谢谢Levi。它在包装参数后工作。我只能将变量从一个VS测试任务转移到管道中的另一个,通过YAML。我可以使用Classic Editor实现这一点吗?您对此有什么想法吗?多个作业输出变量仅适用于yaml管道。请检查文件,谢谢李维。它在包装参数后工作。我只能将变量从一个VS测试任务转移到管道中的另一个,通过YAML。我可以使用Classic Editor实现这一点吗?您对此有什么想法吗?多个作业输出变量仅适用于yaml管道。请检查一下文件