在SpecFlow测试中访问Azure DevOps环境变量

25次阅读
没有评论

问题描述

在使用SpecFlow测试套件运行一些Selenium UI测试时,需要访问一些敏感信息以便能够登录到各个位置。这些信息目前存储在普通的环境变量中,因此以明文形式存储并且很容易被访问,但这种方式太不安全(目前是在开发环境中的测试用户,但当测试准备投入生产时,情况将发生变化)。

Azure DevOps(ADO)的秘密环境变量不能自动设置为可由可执行文件访问的方式,并且似乎无法通过vstest.exe将参数传递给各个测试。

用户提出了使用Azure Key Vault的建议,但这不是一个选项。用户还尝试在本地使用dotnet user-secrets,但显然无法在所有代理上设置它。

用户认为秘密环境变量应该是解决方案的正确方式,但他使用的是.NET Framework 4.6.1,而所有的文档都是针对v5+或Core的。如果有人有处理这个问题的经验,任何想法都会有所帮助!

更新:用户发现可以使用一个空参数的.runsettings文件,并在ADO中进行设置,但设置MSTest属性似乎与一些用户需要的SpecFlow功能冲突。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

用户可以使用.runsettings文件来设置环境变量,并在测试中访问它们。以下是具体步骤:
1. 在解决方案目录中创建一个.runsettings文件。
2. 在该文件中定义需要的环境变量,并将其值设置为空。
3. 在.csproj文件中添加一个属性组,指定.runsettings文件的路径。
4. 在ADO中编辑“Visual Studio Test”任务,设置新的参数。

下面是一个示例.runsettings文件:

<RunSettings>
  <TestRunParameters>
    <Parameter name="api_token" value="" />
    <Parameter name="password" value="" />
  </TestRunParameters>
</RunSettings>

在上面的示例中,我们定义了两个环境变量api_tokenpassword,并将它们的值设置为空。

然后,在.csproj文件中添加以下内容:

<PropertyGroup>
  <RunSettingsFilePath>$(MSBuildProjectDirectory)\..\.runsettings</RunSettingsFilePath>
</PropertyGroup>

这将指定.runsettings文件的路径。

在ADO中,编辑“Visual Studio Test”任务,并在“Execution options > Override test run parameters”中设置新的参数:

-api_token: $(token) -password: $(password)

这将使用ADO中设置的值覆盖.runsettings文件中的空值。

最后,用户可以编写一个C#类来获取这些值:

using Microsoft.VisualStudo.TestTools.UnitTesting;
using TechTalk.SpecFlow;

namespace UITests
{
    [Binding]
    public class Context
    {
        private static TestContext testContext;

        [BeforeScenario]
        private static void SetContext(ScenarioContext scenarioContext)
        {
            testContext = scenarioContext.ScenarioContainer.Resolve<TestContext>();
        }

        public static string GetSecret(string key)
        {
            if (testContext.Properties.Contains(key))
            {
                return testContext.Properties[key].ToString();
            }
            return null;
        }
    }
}

使用这个类,用户可以从testContext.Properties字典中获取DevOps的秘密。

请注意,这个解决方案可能与SpecFlow的一些功能冲突,因为编译器只允许一个初始化,而SpecFlow在幕后使用了一个初始化。用户可以根据自己的需求进行调整。

方案2

另一种方法是使用Azure App Configuration来安全存储秘密。用户可以将敏感信息存储在Azure App Configuration中,并在测试中访问它们。这种方法的具体步骤如下:
1. 在Azure中创建一个Azure App Configuration实例。
2. 在实例中添加一个配置项,将敏感信息存储为键值对。
3. 在测试中使用Azure App Configuration的客户端库来获取敏感信息。

这种方法可以提供更高的安全性,因为敏感信息将存储在Azure中,并且可以进行更好的访问控制。

请注意,用户需要确保他们的Azure订阅中已启用了Azure App Configuration服务。

总结

在SpecFlow测试中访问Azure DevOps环境变量有多种解决方案。用户可以使用.runsettings文件来设置环境变量,并在测试中访问它们。另一种方法是使用Azure App Configuration来安全存储秘密。用户可以根据自己的需求选择适合的解决方案。

请注意,以上解决方案可能与用户的具体环境和要求有关,用户需要根据自己的情况进行调整和实施。

正文完