繁体   English   中英

环境变量如何知道我在什么环境上运行以及如何在 C# 中设置它们?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM