繁体   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