我一直在疯狂地创建单元测试,并发现我经常不得不在一个测试中设置一些东西,而这些东西是我在以前的测试中刚刚拆除的。在一次测试(例如,插入测试)中创建一些东西(例如,数据库记录),然后将其用于后续测试(例如,删除测试),这是否合理?或者,每个测试都应该完全独立吗?
您甚至可以确定NUnit中测试的顺序,或者它们总是按字母顺序进行吗?
注意:我特别询问的是一个测试文件中测试的顺序。不是跨测试文件,也不是以任何更全局的方式。
更新:感谢每个回答的人-有很多好的答案,小组的感觉是相当一致的。我选择了John Nolan的答案,因为他提供了最完整的解释和大量的链接。正如您可能已经猜到的,我一直强烈地想要打破这个规则,尽管我认为它可能像John所说的那样有点“难闻”。还要感谢Fortyrunner添加了单元测试标签。
发布于 2009-01-30 23:58:03
依赖于测试的顺序表明您在多个测试之间保持状态。这是
一种更干净的测试方法是,您只需要依赖于您想要检查其行为的单个功能。通常,您需要对其他对象执行mock操作,以使被测方法正常工作。
考虑处理单元测试的一个好方法是Arrange, Act, Assert模式。
下面是Karl Seguin的优秀的免费eBook的一个片段。我已经注意到了安排,行动和断言。
[TestFixture] public class CarTest
{
[Test] public void SaveCarCallsUpdateWhenAlreadyExistingCar()
{
//Arrange
MockRepository mocks = new MockRepository();
IDataAccess dataAccess = mocks.CreateMock<IDataAccess>();
ObjectFactory.InjectStub(typeof(IDataAccess), dataAccess);
//Act
Car car = new Car();
Expect.Call(dataAccess.Save(car)).Return(389);
mocks.ReplayAll();
car.Save();
mocks.VerifyAll();
// Assert
Assert.AreEqual(389, car.Id);
ObjectFactory.ResetDefaults();
}
}
发布于 2009-01-30 23:40:24
查看test fixture setups,它允许您指定将在fixture中的任何测试之前执行的函数。这允许您执行一次通用设置,并且它将始终运行,无论您是运行一个测试,还是运行套件中的所有测试。
发布于 2009-01-30 23:41:42
单元测试旨在独立运行,而不是作为顺序脚本运行。如果您确实需要按顺序运行它们,请将它们收集到单个测试函数中。
如果您的单元测试受到expensive set-up的影响,那么当您认为您正在进行单元测试时,您可能正在进行集成测试。如果您正在访问大多数单元测试中的SQL数据库,那么您实际上是在与数据访问层进行集成测试。
https://stackoverflow.com/questions/497699
复制相似问题