我一直在疯狂地创建单元测试,并发现我经常不得不在一个测试中设置一些我刚刚在上一个测试中拆除的东西。在一次测试(例如插入测试)中创建某些内容(例如数据库记录)然后将其用于以后的测试(例如删除测试)是否合理?或者每个测试都应该完全独立吗?
您甚至可以确定 NUnit 中测试的顺序还是它们总是按字母顺序完成?
注意:我特别询问内部测试的顺序one测试文件。Not跨测试文件或以任何更全局的方式。
Update:感谢所有回答的人 - 有一个lot好的答案和小组的感觉非常一致。我选择了约翰·诺兰的答案,因为他提供了最完整的解释和大量链接。正如您可能已经猜到的那样,尽管我认为它可能像约翰所说的那样有点“臭”,但我还是很想打破这条规则。也感谢 Fortyrunner 添加单元测试 tag.
依赖测试的顺序表明您正在跨测试保持状态。这是smelly http://en.wikipedia.org/wiki/Code_smell
一种更简洁的测试方法是仅依赖于要检查其行为的单个功能。通常你mock http://en.wikipedia.org/wiki/Mock_object使被测方法正常运行所需的其他对象。
考虑进行单元测试的一个好方法是安排、行动、断言 http://www.lostechies.com/blogs/jimmy_bogard/archive/2008/07/24/arrange-act-assert-and-bdd-specifications.aspx图案。
以下是 Karl Seguin 的优秀免费作品的片段eBook http://codebetter.com/blogs/karlseguin/archive/2008/06/24/foundations-of-programming-ebook.aspx。我已经注释了 Arrange、Act 和 Assert。
[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();
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)