问题描述
在使用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_token
和password
,并将它们的值设置为空。
然后,在.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来安全存储秘密。用户可以根据自己的需求选择适合的解决方案。
请注意,以上解决方案可能与用户的具体环境和要求有关,用户需要根据自己的情况进行调整和实施。