Visual Studio 2008中单元测试的执行顺序

时间:2009-12-08 07:55:47

标签: visual-studio unit-testing mstest

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

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

  

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

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

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

3 个答案:

答案 0 :(得分:2)

我不会测试数据库是否已成功创建;我会假设所有后续测试都会失败,如果不是,并且感觉你将测试测试代码。

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

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

答案 1 :(得分:1)

单元测试应该是独立的,并且不应该相互依赖,否则你不能孤立地运行单个测试。

每个需要数据库的测试都应该按需创建它(如果它还没有被创建 - 你可以使用单例/静态类来确保如果批量执行多个测试,那么实际上只创建了数据库一次)。

然后首先执行哪个测试无关紧要;它只是在测试需要数据库第一次使用时创建。

答案 2 :(得分:0)

理论上,测试应该彼此独立并且能够独立运行是正确的。但在实践中,理论与实践之间存在差异,VS2010给我带来了固定执行顺序(随机顺序始终相同)的困难时期。

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

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

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

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