[英]How do environment variables know what environment I am running on and how do I set them in C#?
我正在阅读 c# 的 selenium 指南,他们展示了这一点:
class BaseTest
{
private static string VendorDirectory = System.IO.Directory.GetParent(
System.AppContext.BaseDirectory).
Parent.Parent.Parent.FullName
+ @"/vendor";
protected IWebDriver Driver;
public static string BaseUrl;
[SetUp]
protected void SetUp()
{
BaseUrl = System.Environment.GetEnvironmentVariable("BASE_URL") ??
"http://the-internet.herokuapp.com";
但这并没有显示他们实际上是如何设置环境变量的。 BASE_URL 是否来自 appsettings.json? 我不确定他们从哪里得到它。 现在,我有一个 class ,其中包含我在整个测试中使用的所有网址,如下所示:
public static class Urls
{
public static readonly string baseUrl = "https://localhost:5001/";
public static readonly string aboutUrl = $"{baseUrl}about";
public static readonly string citiesUrl = $"{baseUrl}cities";
public static readonly string countriesUrl = $"{baseUrl}countries";
}
我认为这不是最好的方法,我想尝试使用环境变量,但我不知道该怎么做。 当我从 localhost 更改为生产环境时,我现在拥有的方式显然会中断。 如何设置 baseUrl 以便它知道我所处的环境?
已编辑我的测试解决方案与我的项目解决方案位于单独的存储库中。 我的测试解决方案是 c# xunit 测试项目。 我在我的解决方案中添加了一个 appsettings.json 文件。 看起来像这样
{
"Base_Url": "https://testurl/",
"AllowedHosts": "*"
}
在我使用 url 的一项测试中,我正在这样做
public static IConfiguration InitConfiguration()
{
var config = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build();
return config;
}
[Fact]
public void LoadFaqs()
{
using IWebDriver driver = new ChromeDriver();
var config = InitConfiguration();
var faqurl = config["Base_Url"] + "faqs";
driver.Navigate().GoToUrl(faqurl);
}
当我运行我的测试时,它失败了,因为它找不到我的 appsettings.json 文件。 我也尝试将它放在我的测试文件夹中,但它仍然找不到它。 我不确定我做错了什么。
环境变量由 Windows 系统使用预定义值设置,最常见的 ENV 变量是 PATH,您可以在 cmd 上显示环境变量: echo %ENV_NAME% 例如echo %PATH%
为您提供:
C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;
环境变量是一种在父进程之间将参数传递给子进程的方法(在命令行上的参数有问题的情况下)然后环境上下文只有子进程知道并且一旦进程被杀死就会消失。 您的 selenium 启动器可能会使用 win api 设置其他变量,例如:
public static void SetEnvironmentVariable (string variable, string? value);
在您的示例中,我会说:不要关心 selenium 如何设置此环境变量,只需获取 BASE_URL 的内容(希望它不为空....)
在本地,他们必须使用项目配置(这是用于 Visual Studio)来设置它们:
Project properties -> Debug tab -> Environment variables
或者通过在构建事件上运行一些 MSBuild 脚本/任务来确保添加环境变量。 ( 快速搜索SO )。 或者在以某种方式构建测试主机时在代码中手动添加它们(我猜这是用于某些功能或集成测试)
在 CI/CD 管道中,它们的设置取决于您使用的平台(Github、Gitlab、Azure DevOps 等)
使用硬编码类进行配置的缺点是,每当配置更改时(例如,当您更改环境而不是指向本地 api 时,您需要指向生产环境),您需要更改/重新编译您的代码,像你说的。
所以,是的,我会说看看并探索这些选项。 配置可以使用多个配置提供程序。 在 asp.net 内核上,默认情况下,他们使用一个名为ChainedConfigurationSource的内核,其中包括从 appsettings.json 文件、环境变量等读取。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.