【问题标题】:Order of execution of unit tests in Visual Studio 2008Visual Studio 2008 中单元测试的执行顺序
【发布时间】:2009-12-08 07:55:47
【问题描述】:

我为我的 Visual Studio 2008 解决方案定义了 unit tests。这些测试在多个方法和多个文件中的多个类中定义。

我在blog article 中读到,在使用MSTest 时,认为可以依赖于测试的执行顺序是错误的:

执行交错:由于测试类的每个实例都在不同的线程上单独实例化,因此无法保证 关于单个类中单元测试的执行顺序,或 跨班级。测试的执行可能会交叉执行 类,甚至可能是程序集,具体取决于您的选择 执行您的测试。这里的关键是——所有的测试都可以 以任何顺序执行,它是完全未定义的。

也就是说,在任何这些测试开始运行之前,我必须有一个预执行步骤。也就是说,我实际上想以某种方式定义执行顺序。例如,1)首先创建数据库; 2)测试它的创建;然后 3) 以任意顺序运行剩余的 50 个测试。

关于如何做到这一点的任何想法?

【问题讨论】:

    标签: visual-studio unit-testing mstest


    【解决方案1】:

    我不会测试数据库是否成功创建;我会假设所有后续测试都将失败,如果不是,并且感觉就像您正在测试测试代码一样。

    关于设置数据库的预测试步骤,您可以通过创建一个方法并使用ClassInitialize 属性对其进行修饰来实现。这将使测试框架在测试类中的任何其他方法之前执行该方法:

    [ClassInitialize()]
    public static void InitializeClass(TestContext testContext) 
    { 
        // your init code here
    }
    

    【讨论】:

    • 这个排序中最重要的部分是数据库的实际创建,而不是创建它的测试。正如您所指出的,所有其他单元测试都将对其进行测试:-) 正如我所提到的,我有多个测试类。我需要在执行任何测试类之前调用​​这个初始化逻辑。所以 ClassInitialize() 没有这样做。
    • 只需在它自己的类中创建数据库逻辑并在每个测试类中调用它使用类初始化。一个单元应该总是通过,无论如何,它不应该依赖于成为第一个或第三个,一旦你的项目增长肯定你会想要运行你的一些测试而不是全部。此外,我会考虑为您的数据库创建一个模拟并使用它,而不是实际对数据库进行调整!
    • 完全有道理。谢谢!
    【解决方案2】:

    单元测试都应该独立工作,并且不应该相互依赖,否则你不能单独运行单个测试。

    每个需要数据库的测试都应该按需创建(如果尚未创建 - 您可以使用单例/静态类来确保如果批量执行多个测试,则仅实际创建数据库一次)。

    那么先执行哪个测试就无关紧要了;它只会在测试第一次需要使用数据库时创建。

    【讨论】:

      【解决方案3】:

      理论上,测试应该相互独立并且能够独立运行是正确的。但在实践中,理论和实践之间存在差异,VS2010 的固定执行顺序(随机顺序始终相同)让我很难受。

      以下是一些示例:
      我有一个单元测试,它交叉检查一些表之间的日期并验证一切是否一致。显然,在空数据库上运行这个测试是没有用的,所以我想在插入数据的单元测试之后运行一些时间。抱歉 VS2010 不允许你这样做。
      好的,很酷,然后我将它添加到插入单元测试作为结语。但后来我想交叉检查其他 10 件事,而不是进行单元测试(“确保可以插入具有各种参数的实体而不会崩溃”)我最终进行了一次大型测试。

      然后是另一个案例。
      我的单元测试插入实体,只是插入,以确保这部分逻辑工作正常。然后我有一个多线程版本的测试,以确保没有死锁和东西。显然,我需要多线程测试在单线程测试之后运行一段时间,并且仅在单线程测试成功的情况下运行。抱歉,VS2010 做不到。

      另一个案例。我有一个单元测试,它删除数据库中给定类型的所有实体。这应该会导致一堆空表和其他表中的许多零。显然,在空数据库上运行它是没有用的,因此如果发现数据库为空,测试会插入 10.000 个实体。但是,如果它在多线程测试之后运行,它将找到 250.000 个实体,并且删除所有这些实体需要时间。抱歉,VS2010 不会让我做任何事情。

      有趣的是,由于这种情况,我的单元测试开始慢慢变成大型测试,完成(每个)需要 30 多分钟,然后 VS2010 会超时,因为默认的测试超时是 30 分钟。天哪,请帮忙! :-)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-17
        • 1970-01-01
        • 2010-09-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多