簡體   English   中英

通過多個代理將變量從一個 Visual Studio 測試任務傳遞到 Azure Pipeline 中的另一個

[英]Pass Variables from one Visual Studio Test Task to Another in Azure Pipeline through multiple agents

我在項目中有幾個單元測試,它們相互依賴。 一個測試運行后,我將捕獲輸出,等待它在另一個系統中同步並使用第一個測試的輸出執行另一個測試。 我正在嘗試使用 azure 管道來實現這一點。 我創建了 3 個代理作業 - 在作業 A 中,我正在運行單元測試 1 並創建一個輸出變量,該變量將傳遞給作業 C 中的一個變量,作業 B 是一個無代理服務器,在這兩個代理之間延遲 1 分鍾。 我已經使用 overrideTestrunParameters: '-sauce2 $(sauce5)' 來覆蓋第二個測試的參數,但在將參數傳遞給第二個代理任務時出現以下錯誤。

[警告] 無法解析覆蓋運行參數字符串:-sauce2 碎番茄

[錯誤]SetupPhase.Run:運行設置更新期間發生異常:System.FormatException:覆蓋測試運行參數時遇到錯誤。 請檢查提供的測試運行參數。

在 Microsoft.VisualStudio.TestService.SettingsManager.OverrideParamsSettingsProcessor.GetOverrideParameters(String overrdeParametersString) 在 Microsoft.VisualStudio.TestService.SettingsManager.OverrideParamsSettingsProcessor.UpdateSettingsWithParameters(XDocument settings) 在 Microsoft.VisualStudio.TestService.SettingsManager.CommonSettingsManager.UpdateCommonSettings(InputDataContract inputDataifierd ) 在 Microsoft.VisualStudio.TestService.SettingsManager.SettingsManager.UpdateSettingsAsRequired(InputDataContract inputDataContract) 在 MS.VS.TestService.VstestConsoleAdapter.SetupPhase.Run(VstestConsoleRunContext testRunContext, CancellationToken cancelationToken)

[錯誤]設置更新失敗,錯誤:覆蓋測試運行參數時遇到錯誤。 請檢查提供的測試運行參數。

測試運行參數:

 <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 任務的overrideTestrunParameters: '-sauce2 $(sauce2)'$(sauce2)被評估為沒有引號“”的crushed tomatoes

請嘗試將$(sauce2)用雙引號括起來:

overrideTestrunParameters: '-sauce2 "$(sauce2)"'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM