我正在尝试设置SpecFlow进行集成/验收测试。我们的产品在Sqlite中有一个支持数据库(虽然不是很大)。
这实际上证明是一个有点棘手的观点;如何为测试建模数据库?
我想知道其他人使用哪些模式与后备数据库进行集成/验收测试。
我可以想到以下方法:
答案 0 :(得分:4)
在考虑如何进行测试之前,我认为您可能会发现查看您要测试的内容很有价值。
从什么数据开始,我发现单个元素或一个小数字真的很有帮助,想象一下围绕它们的一组事件,以便为您提供正确的测试数据用你的测试。例如;
现在,您可以实际评估哪些方案实际上适用于您的数据,例如: “MSFT”和“APPL”全天可能会有1,000次价格变动,因此产生Givens和Mocks将非常耗时。该数据有助于预先捕获。另一方面,“Bob”数据在使用生成的数据时效果特别好,因为数据总是可以改变,所以今天是他的生日。
您的问题似乎不需要考虑的一件事是更新您的数据。例如,您可能希望在实体生命周期的不同阶段使用一组测试,例如:有些测试涉及“Baby Bob”,其他测试涉及“10yr old Bob”或“已婚Bob”等。如果您的数据库只读,那么如果您可以编写测试以便他们不这样做就不会有问题查看其他数据,但有时您希望通过测试构建故事。如果您的测试确实更改了数据,那么您将无法确保测试按顺序运行(请参阅MSTest OrderedTest或mbUnit DependsOn),或者您可以将测试分开,以便它们分别处理隔离的数据实体(如果您的实体可以在一行中描述,那么这很好,但是当您必须阅读许多表来获取它时会变得更难)。
您也可能想要考虑您正在测试的代码,您可以改变不同测试集中的方法。我目前正在开发一个多层应用程序,它具有UI视图,视图模型,客户端模型,多个通信系统和服务器模型。我也有不同的测试集。我有一些测试工作在单层,模拟其他层,以保持我的测试小。其他测试启动本地服务器和本地客户端,并直接连接两者。最后,我有一些测试可以启动完整的服务器进程,通过EMS进行通信,并使用除UI视图之外的所有内容运行一些简单的客户端操作。
现在实际回答你的问题,
[SetupFixture]
在Linq-to-sql DB上使用NUnit完成了这项工作。您仍然担心并行测试运行和你必须平衡你的数量的粒度(参见StackOverflow-When do BDD scenarios become too specific),并且你有数据更新排序/数据隔离问题,但这可以很好地让你可以处理你的数据故事并在整个过程中增长数据你的考试。另一方面,如果一个测试失败并使数据处于错误状态,您可能会遇到很多失败,但至少您只需要查看首先失败的那个。对于工作站上的开发人员来说,这种测试也不会很好,因为他们不能只运行一次测试,特别是使用NCrunch这样的工具,可以运行代码已经更改的测试。[Test]DALLayerTests.ShouldReadARowAndCreatePOCO()
,但大多数其他人使用模拟数据来测试实际发生的情况,例如[Test]BusinessObjectPersonTests.ShouldGetBirthdayCongratulations()
。