单元测试和隔离

时间:2016-07-20 19:39:37

标签: c# unit-testing

我知道单元测试应该完全相互独立,这意味着操作顺序永远不会很重要。

如何处理通过网络加载大型文档的测试场景,还需要其他测试来验证所述文档的信息?

我不希望为每个测试请求的文档必须检查这个或那个。

如果文档存储为测试类的静态成员,首先运行提取它的初始测试,它可以正常工作。然后随后的测试都可以用缓存的副本做自己的事情。

但是,再次,单元测试的操作顺序是错误的,因为它们应该是独立的。

在这种情况下,最佳做法是什么?我更喜欢将它们全部作为单独的测试,而不是集成到一个单独的大型测试中,该测试可以在文档被提取后断言各种各样的事情。

我目前的情况是Visual Studio 2015 Update 3和C#,但我想它可以应用于任何类似的设置。

在Visual Studio的测试运行器中,您可以设置“播放列表”,让您按顺序运行它们,但它仍然感觉不对。

编辑:我倾向于静态方法,在这种情况下,每个测试都必须通过单个方法获取文档。我猜一个单例类型的方法(如果为null,去获取它,否则返回它)。

但任何反馈都很好。

2 个答案:

答案 0 :(得分:3)

最好的选择是不要通过网络获取文档bundle it as part of the test payload.

话虽这么说,如果您需要在启动时发生一次逻辑,您可以在测试程序集加载时运行一次的测试中添加[AssemblyInitialize]。你可以在那里进行测试配置。

[TestClass]
public class GlobalTestData
{
    private static byte[] _document;

    public static byte[] Document
    {
        get
        {
            return (byte[])_document.Clone();
        }
    }

    [AssemblyInitialize()]
    public static void DownloadDocument(TestContext context)
    {
        _document = DownloadDocument();
    }

    private static byte[] DownloadDocument()
    {
        //...
    }
}

只需将上面的类放到项目中,然后任何测试都可以使用GlobalTestData.Document并获得字节[]的新的未更改的副本。

答案 1 :(得分:1)

单元测试单独测试事物。如果您通过网络连接获取文档,则不会将其隔离。尝试模拟文档的服务。

您也可以按照Brian在评论或[TestInitialize]静态方法中建议的[ClassInitialize]方法获取文档,并将其存储在局部变量中,区别在于{{1只有在第一次测试运行之前,才会在每次测试之前运行TestInitialize

更新:

如果您需要适当的测试文档,那么您正在研究集成测试。在我看来,如果多个系统必须协同工作,集成测试完全可以依赖于彼此,因为它们会检查正确的行为。只要确保它们与单元测试不在同一个类中,因为它们应该快速且独立于运行。