![](/img/trans.png)
[英]MSTest unit test passes when in “debug” mode, but fails final assertion in “run” mode
[英]MSTest unit test passes by itself, fails when other tests are run
我遇到了一些MSTest單元測試的麻煩,當我單獨運行它們時會通過,但是當我運行整個單元測試類時會失敗。 測試測試了一些SLaks早先幫助我的代碼,他警告我,我在做什么並不是線程安全的。 但是,現在我的代碼更復雜,我不知道如何使其成為線程安全的。 這就是我所擁有的:
public static class DLLConfig
{
private static string _domain;
public static string Domain
{
get
{
return _domain = AlwaysReadFromFile
? readCredentialFromFile(DOMAIN_TAG)
: _domain ?? readCredentialFromFile(DOMAIN_TAG);
}
}
}
我的測試很簡單:
string expected = "the value I know exists in the file";
string actual = DLLConfig.Domain;
Assert.AreEqual(expected, actual);
當我自己運行這個測試時,它會通過。 當我將它與測試類中的所有其他測試一起運行時(對不同的屬性執行類似的檢查), actual
為null
並且測試失敗。 我注意到,對於類型為自定義Enum
類型的屬性,這不是問題。 也許我對Domain
屬性有這個問題,因為它是一個string
? 或者這可能是MSTest如何工作的多線程問題?
我懷疑其他測試正在修改DLLConfig
類中的一些值,導致getter的結果發生變化。 單元測試應始終從已知的初始狀態運行,因此您應該在測試方法本身或在每個測試之前運行的TestInitialize
屬性標記的方法中TestInitialize
它。
您的測試取決於外部文件。 而不是調用直接訪問該文件的函數,您應該讓DLLConfig.Domain調用另一個類中的方法。
public static string Domain
{
get
{
return _domain = AlwaysReadFromFile
? CredentialReader.Read(DOMAIN_TAG)
: _domain ?? CredentialReader.Read(DOMAIN_TAG);
}
}
然后,您可以使用mock / fake / stub CredentialReader初始化DllConfig,您可以在其中控制其返回值。 請記住,您正在測試DLLConfig.Domain是否根據AlwaysReadFromFile
條件返回正確的值。 您不應該同時測試該值的來源(或者甚至是否存在)。
使您的DLLConfig類更“可測試”具有分離問題的額外好處。 當你在考慮一個類時,不得不說“這個類做了這個 和 那個 ”(抽象配置數據並從文件中讀取數據),這是一個很好的選擇,這個類混合了關注點並試圖做很多事情。 如果DLLConfig是配置數據的抽象,它應該只關注它,並將數據從哪里留到另一個類。
如果上面的答案都不適合你,我通過在失敗的測試中斷言之前添加Thread.Sleep(1)
來解決這個問題...
看起來在某處錯過了測試同步...請注意我的測試不依賴於順序,我沒有任何靜態成員也沒有外部依賴。
對我來說,問題是使用非線程安全的集合。 當我切換到使用BlockingCollection(而不是List)時,一切都落到了原位。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.