簡體   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