2010-08-12 84 views
1

我是单元测试新手。我创建了各种测试,当我逐个运行测试时,所有测试都通过了。但是,当我将整个批处理运行时,一些测试失败。为什么?我该如何纠正?批量运行时单元测试失败

回答

3

要解决此问题,编写单元测试时遵循特定规则很重要。有些规则易于遵循和应用,而其他规则可能需要根据您的情况作进一步考虑。

每个测试都应该设置一组独特的数据。当您使用持久数据时,这一点尤其重要,例如在数据库中。当测试创建具有特定用户标识的用户时,请编写测试,以便每次使用不同的用户标识。例如(C#):

var user = new User(Guid.NewGuid()); 

在每次测试结束时,清除测试创建的数据。例如,在拆卸方法中,删除您创建的数据(C#,NUnit):

[TearDown] 
public void TheTearDownMethod() { 
    _repository.Delete(_user); 
} 

可能有变化,例如,当您针对数据库进行测试时,您可以选择在运行测试套件之前加载备份。如果您仔细制作测试,则不必在每次测试(或测试子集)后清理数据库。

要从您现在的位置(每个测试通过单独运行时)开始,依次运行前两个测试,让它们通过。然后按顺序运行三次,让它们通过等。在每次迭代中,确定之前的测试会导致添加的测试失败。解决该依赖关系。通过这种方式,您可以了解更多关于测试的知识,同时也知道如何避免编写相互依赖的测试。

一旦套件通过一个修补程序就会频繁运行,以便尽早检测到依赖关系。

这并不包括所有的情况和变化,但希望给你一个建立在你已有的指导方针。

+0

非常感谢您的解释。我已经写了5个测试,所有的测试都通过了,当我写下最后一个测试时,就会让其他人失败。我怎样才能让它作为最后一次测试运行? – learning 2010-08-12 09:42:45

+0

从概念上说,他们应该能够以任何顺序运行。在你的评论中回答:有些单元测试框架允许你在测试中指定一个命令,或者在另一个测试上设置一个测试的依赖关系。在某些情况下,它有助于在测试夹具(=测试类)内改变测试方法的位置。 – Manfred 2010-08-12 10:00:22

+0

我正在使用NUnit和NCoverExplorer,有没有一种方法来指定这两个中的任何一个的顺序?如果你使用过它们? – learning 2010-08-12 10:40:04

1

有时一个测试的最终条件会影响下一个测试的初始条件。

手动运行和批处理运行可能会有不同的行为,如何设置每个测试的初始条件。

2

可能有些测试依赖于机器以前的状态。单元测试不应该依赖于过程/机器的先前状态,因此您应该查看失败的测试并确定它们依赖于的内容。

1

你显然有一些测试会产生意想不到的依赖性的副作用。调试。

良好的单元测试是原子性的,对其他测试(重要)没有依赖关系。一个好的做法是每个测试在运行测试之前创建(移除)它所依赖的所有东西。事后清理也是一种很好的做法,它确实有帮助,并且是推荐的,但不是100%必要的。

相关问题