如何将秘密从 VSTS 传递到测试执行上下文

How to pass secrets into the test execution context from VSTS

需要传递到测试的测试执行上下文中的值通常通过 VSTS 中的 "variables" 传递。这些通常显示为环境变量。

这些值可能需要保密(来自服务主体的客户端机密、密码等)。但是,如果您在 VSTS 变量 window 中单击给定变量的 "lock" 按钮,它 将不会 作为环境变量导出到测试执行上下文中(与非秘密变量不同),by design

如何在测试中传递和检索秘密变量?

秘密变量需要作为参数传入vstest.exe进程"test run parameters"。这些将在测试执行期间替换为 .runsettings 文件中的值。

高级步骤是:

  1. 将 .runsettings 文件添加到您的 Visual Studio 项目
  2. 在您的 C# 代码中获取秘密值
  3. 为您的秘密创建一个 VSTS 构建变量
  4. 将您的 VSTS 测试任务设置为使用您创建的 .runsettings 文件
  5. 使用与 .runsettings 文件的密钥相同的名称显式传入构建变量

添加 .runsettings 文件

  1. 创建一个扩展名为 "runsettings" (*.runsettings) 的 XML 文件并将其添加到您的项目中
  2. 将以下 XML 添加到文件中。请注意,将 "value" 设置为什么并不重要。它无论如何都会被 VSTS 测试任务覆盖。将其设置为虚拟值或将导致测试在本地成功的值。

    <?xml version="1.0" encoding="utf-8"?>
    <RunSettings>
        <TestRunParameters>
            <Parameter name="CLIENT_SECRET" value="secret" />
        </TestRunParameters>
    </RunSettings>
    

从您的测试代码中获取秘密值

  1. 将 "TestContext" public 属性 添加到您的测试 class。该值将由测试运行器在运行时设置。 请注意,此 属性 必须命名为 TestContext。

    public TestContext TestContext { get; set; }
    
  2. 从 TestContext 变量中检索您的秘密

    string clientSecret = TestContext.Properties["CLIENT_SECRET"].ToString();
    

为您的秘密创建一个 VSTS 构建变量

  1. 导航到您的构建定义
  2. 点击"Edit build definition"
  3. 点击"Variables"
  4. 点击"Add"
  5. 命名您的变量并设置其值
  6. 单击 "value" 字段末尾的锁图标将值设置为机密

将您的 VSTS 测试任务设置为使用您创建的 .runsettings 文件

  1. 导航到您的构建定义
  2. 点击"Edit build definition"
  3. 单击 "Tasks" 按钮
  4. Select 你的 "test" 任务(如果没有就加一个)
  5. 将 "Settings file" 设置为您的 .runsettings 文件

    $/project/unitTest.runsettings
    

使用与 .runsettings 文件的密钥相同的名称显式传入构建变量

  1. 导航到您的构建定义
  2. 点击"Edit build definition"
  3. 单击 "Tasks" 按钮
  4. Select 你的 "test" 任务
  5. 在 "Override test run parameters" 对话框中,添加以下内容(匹配您在 .runsettings 文件中为参数名称输入的键的 spelling/case 和 spelling/case 您添加到构建定义的测试变量的值):

    -CLIENT_SECRET $(CLIENT_SECRET)