Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在VSTS中将KeyVault机密传递给.net core 2 xUnit/MsTest_C#_.net_Azure Devops_Mstest_Azure Keyvault - Fatal编程技术网

C# 在VSTS中将KeyVault机密传递给.net core 2 xUnit/MsTest

C# 在VSTS中将KeyVault机密传递给.net core 2 xUnit/MsTest,c#,.net,azure-devops,mstest,azure-keyvault,C#,.net,Azure Devops,Mstest,Azure Keyvault,我在Azure KeyVault中存储了几个秘密。不幸的是,我找不到通过VSTS(Visual Studio团队服务)将参数传递到.net Core 2.0测试运行的方法 文档中说,Keyvault机密只能通过VSTS变量提供—这很公平—但我实际上如何做到这一点?我能在网上找到的所有信息似乎都过时了或不起作用 例如考虑运行设置文件: <RunSettings> <TestRunParameters> <Parameter name="we

我在Azure KeyVault中存储了几个秘密。不幸的是,我找不到通过VSTS(Visual Studio团队服务)将参数传递到.net Core 2.0测试运行的方法

文档中说,Keyvault机密只能通过VSTS变量提供—这很公平—但我实际上如何做到这一点?我能在网上找到的所有信息似乎都过时了或不起作用

例如考虑运行设置文件:

<RunSettings>
    <TestRunParameters>  
        <Parameter name="webAppUrl" value="http://localhost" /> 
        <Parameter name="webAppUserName" />
        <Parameter name="webAppPassword" />
  </TestRunParameters> 
</RunSettings>
但是这没有效果-webAppUserName值仍然为null(我可以看到webAppUrl的值,所以我知道我的代码是正确的!)

我还尝试了VSTS“dotnet测试”任务以及VSTS 2017构建中的“VsTest”任务。VsTest提供了一个覆盖测试运行参数的设置,根据工具提示,我尝试了:

-webAppUserName user -webAppPassword somethingSecret
再次-没有效果

最初,我使用xUnit时遇到了完全相同的问题,即无法找到通过VST传递参数的方法,所以我尝试了MSTest,但问题相同

回到我最初的一期《注入钥匙库秘密》 通过VS Studio,我可以通过测试在本地执行以下操作:

var config = new ConfigurationBuilder()
                .AddJsonFile("appsettings.json", true, true)
                ...
                .AddAzureKeyVault(...)
不幸的是,当通过VSTS运行时,测试运行程序只是挂起(即,我必须在几分钟后停止它),如果我使用

.AddAzureKeyVault(…).AddEnvironmentVariables()

所以我尝试使用VSTS变量组,并将其链接到KeyVault。但是,不能通过环境变量(使用environment.GetEnvironmentVariable(…)直接从C#)访问keyvault机密,因此这是不好的。他们说你只能通过VSTS变量把这些传递给任务…所以我的问题就来了

旁白: 即使我可以使用环境变量,它也不是最优的,因为在使用.AddAzureKeyVault()时,我可以提供一个自定义的IKeyVaultSecretManager,例如,用“:”字符替换一个特殊的分隔符-这意味着我可以嵌套我的json配置值-例如,如果我在配置文件中有这样的值:

{ "A" : { "B" : "somevalue" } }  
然后,使用普通配置生成器,我可以通过配置[“A:B”]访问上述内容。不幸的是,KeyVault不喜欢“:”字符,因此必须将其替换为“-”,然后使用自定义IKeyVaultSecretManager将“—”替换为“:”(这非常有效,并确保根据在config builder中注册的提供程序的顺序正确重写变量)


请帮忙!圣诞节我只想不把我的钥匙库秘密放进Git。。。但是VSTS钥匙库格林奇破坏了我的乐趣。。。我肯定遗漏了什么???

覆盖测试运行参数的格式类似于
AppURL=$(DeployURL);端口=8080
而不是
-名称值

只是一个更新

我最近建立了一个新的xUnit.NETCore2.0项目。对于这个项目,我在将环境变量传递给Azure DevOps时没有遇到任何问题。基本上,你所做的就是:

  • 创建生成管道变量-例如
    ASPNETCORE\u环境
  • 创建VisualStudio测试任务
  • 在xUnit项目中,只需使用
    System.Environment.GetEnvironmentVariable(“ASPNETCORE\u环境”)
考虑到上述方法可以正常工作,
.AddEnvironmentVariables()
配置方法现在也可以正常工作。 此机制也可用于为每个测试环境加载不同的配置文件


对我来说,这就是我所需要的一切,因为我有一种非常简单的方法,可以将特定于环境的选项传递给集成测试

在Github上找到
AddAzureKeyVault
的存储库,并查看其源代码以了解其功能。也许它提供了一些关于你需要做什么来解决问题的提示。这听起来像是一个与依赖项紧密耦合的设计问题,这些依赖项很难模拟/存根/伪造以进行测试。@nkosi感谢您编辑/格式化我错过的一些代码位!azure密钥库代码有点像兔子洞——但本质上它执行https oauth调用以进行身份验证(我通过Env vars手动设置所有密钥,所以这很好)。我怀疑VSTS可能正在阻止https呼叫。无论如何,正如您应该知道的,我们不幸地生活在一个抽象泄漏的世界中,并不是所有的问题都可以通过纯单元测试来测试。现在,我已经使用了xUnit Trait属性来绕过我的一些集成测试,这是我看过的许多页面之一。不适合我,似乎过时了。键值由vsts vstest工具提示建议,如上所述。我怀疑这可能不是由.net core 2测试适配器实现的…我假设您使用的是Visual studio测试任务2。*并且覆盖参数格式为-key-value,通过此任务,它将在运行测试之前更新runsettings文件,如果在本地进行测试,是否可以在runsettings文件中获取原始值?对于Visual studio测试任务1。*,它可以很好地使用key=value等参数格式。(Core 2.0单元测试项目)感谢@starianchen MSFT不幸的是,测试任务2.*方法对我不起作用-测试继续使用原始值(这很奇怪,因为您说它应该在运行测试之前替换源设置文件中的值。如果我在本地运行'dotnet test/?',它显然表明我应该将'--webAppUserName=foo'添加为命令行parm',但同样,它不起作用!不幸的是,这个问题尚未在.net Core中得到解决-有在github中有很多关于这方面的公开问题,目前,我能给任何需要测试参数的人的最好建议是使用.net完整框架测试,而不是.net核心
{ "A" : { "B" : "somevalue" } }