簡體   English   中英

MSTest單元測試自行通過,在運行其他測試時失敗

[英]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);

當我自己運行這個測試時,它會通過。 當我將它與測試類中的所有其他測試一起運行時(對不同的屬性執行類似的檢查), actualnull並且測試失敗。 我注意到,對於類型為自定義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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM