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