2011-06-07 46 views
6

我在C#中使用Visual Studio 2008中的MSTest。我有一個特定的環境變量,我願意和我希望僅在運行特定測試期間執行的路徑修改,或者更好,但是在運行配置中進行所有測試。您可以爲MSTest運行配置設置臨時環境變量嗎?

我試過使用測試運行配置安裝腳本來做到這一點,但正如我預期的那樣,因爲它是一個批處理文件,一旦它退出,這些更改就會丟失,所以不會工作。

是否有任何其他方式來設置臨時系統環境變量,這些變量在所有正在運行的測試中都有效?

+0

您是否從命令行(Dos/PowerShell)運行MSTest?還是從Visual Studio? – Rob 2011-06-07 17:06:54

+0

如果不清楚,請在Visual Studio 2008中對不起。使用默認的測試運行器等。 – 2011-06-07 17:10:18

回答

4

雖然我對這個解決方案不滿意,但我能夠通過使用ClassInitializeAttribute作爲測試類,然後使用Environment.SetEnvironmentVariable來完成我需要的更改,然後清理乾淨在用ClassCleanupAttribute裝飾的方法中。

由於缺乏更好的答案,這是我能夠爲一組測試設置環境變量並在完成時清理它。不過,我會優先選擇在代碼外部進行處理,並以某種方式成爲測試配置的一部分。無論問題已經解決。

1

如果您相信您的測試套件不會在測試過程中「中止」,則可以使用FixtureSetup和FixtureTeardown方法來設置並刪除已更改的環境變量。

從評論發表編輯:我看到你來自哪裏,但正如在我的編輯中,UT框架被設計用於創建單元測試。單元測試的概念決定了它不應該依賴於任何外部資源,包括環境變量。這樣做的測試是集成測試,並且需要大量的基礎設施才能到位(通常比同等LOC的單元測試套件長很多倍)。

創建單元測試依賴於環境變量的代碼,考慮拆分直接實際檢查環境變量的代碼行。並將其放入另一個類的方法中,然後使用RhinoMocks或其他任何方法來模擬該類,以便在不檢查(或更改)實際環境變量的情況下爲測試提供「虛擬」值。

如果這真的是一個集成測試,並且您確實需要環境變量集(例如您正在更改路徑,以便您可以使用Process.Start調用您自己的notepad.exe而不是Windows),那就是FixtureSetup和FixtureTeardown方法/屬性適用於;執行測試應該成功的固定的可重複環境的複雜設置,然後將環境重置爲原來的方式,而不管測試中發生了什麼。通常,測試失敗會引發異常並立即終止該測試的執行,因此測試方法本身結束時的代碼不能保證運行。

+0

這似乎是一種更糟糕的情況。看起來單元測試框架工作應該支持CODE之外的一些方法來添加在測試或測試結束時將消失的臨時環境變量。如果分配給變量的數據發生變化,還需要更改大量代碼。 – 2011-06-07 17:09:15

+1

你如何提出一個單元測試框架,這個框架是圍繞單元測試不應該接觸或依靠外部資源修改外部資源的概念而設計的? – KeithS 2011-06-07 17:13:10

+0

我建議他們考慮到我們無法控制的東西。我們使用的第三方圖書館有時會做出愚蠢的東西,需要像這樣的廢話。單元測試不僅僅是一種方式或高速公路,它應該是可變的,「測試」框架不應該是「單元測試」從集成到連續的所有類型的測試的獨有,更應該由「測試「框架。 – 2011-06-07 17:34:37