我是单元测试的新手。我创建了各种测试,当我逐个测试时,所有测试都通过了。但是,当我作为批处理运行整体运行时,一些测试失败了。为什么会这样?我该如何纠正?
答案 0 :(得分:3)
要解决此问题,在编写单元测试时遵循某些规则很重要。有些规则很容易遵循和适用,而其他规则可能需要根据您的具体情况进行进一步考虑。
每个测试都应该设置一组唯一的数据。当您使用持久数据时,这一点尤其重要,例如:在数据库中。当测试创建具有特定用户标识的用户时,请编写测试,以便每次使用不同的用户标识。例如(C#):
var user = new User(Guid.NewGuid());
在每次测试结束时,清理测试已创建的数据。例如,在拆卸方法中删除您创建的数据(C#,NUnit):
[TearDown]
public void TheTearDownMethod() {
_repository.Delete(_user);
}
可能存在变化,例如当您对数据库进行测试时,您可以选择在运行测试套件之前加载备份。如果仔细制作测试,则无需在每次测试(或测试子集)后清理数据库。
要从现在的位置(每个测试在隔离运行时通过)到达您希望开始按顺序运行前两个测试的位置,请将它们传递给它。然后按顺序运行三个,使它们通过等。在每次迭代中,确定先前的测试导致添加的测试失败。解决这种依赖性。通过这种方式,您可以了解很多关于测试的知识,以及如何避免编写相互依赖的测试。
一旦套件通过一个补丁,就会经常运行它,以便您尽早检测到依赖关系。
这并不涵盖所有情景和变化,但希望能为您提供基于已有内容的指南。
答案 1 :(得分:2)
您的某些测试可能取决于机器的先前状态。单元测试不应该依赖于过程/机器的先前状态,因此您应该查看失败的测试并找出它们所依赖的内容。
答案 2 :(得分:1)
有时,一次测试的最终条件会对下一次测试的初始条件产生影响。
手动运行和批量运行可能在设置每个测试的初始条件方面有不同的行为。
答案 3 :(得分:1)
您显然会从某些创建非预期依赖项的测试中产生副作用。调试。
良好的单元测试是原子的,对其他测试没有依赖性(重要)。一个好的做法是每个测试在运行测试之前创建(删除)它所依赖的所有内容。之后进行清理也是一种很好的做法,它确实有帮助并且是推荐的,但不是100%必要的。