SpecFlow 与数据库模式的集成测试

2023-11-25

我正在尝试设置 SpecFlow 进行集成/验收测试。我们的产品在 Sqlite 中有一个支持数据库(虽然不是很大)。

但这实际上被证明是一个有点棘手的问题;如何为测试建立数据库模型?

我想知道其他人使用什么模式来对支持数据库进行集成/验收测试。

我可以想到以下方法:

  1. 将数据库编译到包含测试的程序集中,然后为每个测试对其进行卷影复制。虽然看起来很慢。
  2. 我可以在内存中创建数据库并用预先确定的数据填充它。
  3. 我可以在内存中创建数据库,并以某种方式让吉文斯填充数据库。这看起来会让测试变得非常膨胀,但可能会给他们更多的控制权并使测试不那么脆弱。
  4. 我可以抽象每个数据库交互并使用模拟。不喜欢这个想法,因为我也想用它来测试数据库交互。
  5. 将数据库编译到测试中,并依靠清理代码将其返回到基本状态(这对我来说似乎很狡猾)。不想用事务来执行此操作,因为某些测试会进行多次交互(因此写入一个项目,然后尝试使用不同的权限读回它)。

在考虑之前How进行测试,我想您可能会发现它值得一看What你想测试。

从...开始什么数据,我发现采用单个元素或少量元素并想象围绕它们的一组事件确实很有帮助,以便为您提供正确的测试数据来运行测试。例如;

  • 如果您在医疗保健系统上工作,您可能会定义一个人“Bob”,然后生成他的生活事件。鲍勃出生于 37 年前的今天,小时候从自行车上摔下来,摔断了手臂,后来结了婚,并育有两个孩子。
  • 如果您正在开发金融交易系统,您可能会查看几支股票的开盘价和收盘价之间的一天,例如“MSFT”和“APPL”。在这一天,您可能会看到一个从低处开始攀登,另一个从高处开始下降。一个消息的传出,扭转了他们的命运。

现在您已经有了可以实际评估哪些场景真正适合您的数据的信息,例如“MSFT”和“APPL”全天可能会有数千次价格变化,因此生成 Givens 和 Mocks 将非常耗时。这些数据适合预先捕获。另一方面,“Bob”数据在使用生成的数据时效果特别好,因为数据总是可以更改,因此今天是他的生日。

您的问题似乎不需要考虑的一件事是更新您的数据。例如,您可能希望有一组在实体生命周期的各个阶段工作的测试,例如一些测试涉及“Baby Bob”,其他测试涉及“10yr old Bob”或“Married Bob”等。如果您的数据库是只读的,那么如果您可以编写测试以使它们不这样做,那么这不是问题see其他数据,但有时您想通过测试构建一个故事。如果您的测试确实更改了数据,那么您将无法确保测试按顺序运行(请参阅MSTest 有序测试或 mbUnit DependsOn),或者您可以分离您的测试,以便它们各自处理一个独立的数据实体(如果您的实体可以在单行中描述,这很好,但当您必须读取许多表才能获取它时,这会变得更困难) 。

您可能还想考虑什么代码当您正在测试时,您可以在不同的测试集中改变方法。我目前正在开发一个多层应用程序,该应用程序具有 UI 视图、视图模型、客户端模型、多个通信系统和服务器模型。我也对这些进行了不同的测试。我有一些在单层中工作的测试,模拟其他层以保持我的测试较小。其他测试启动本地服务器和本地客户端,并将两者直接连接起来。最后,我进行了一些测试,启动完整的服务器进程,通过 EMS 进行通信,并使用除 UI 视图之外的所有内容运行一些简单的客户端操作。

现在要真正回答你的问题,

  1. 卷影复制您的数据库- 是的,我已经使用 SQLServer Developer 完成了一次此操作,并且在运行测试之前复制了一个 xxx.mdb。然而,一些现代测试框架将并行运行测试,例如NCrunch,所以这就打破了。
  2. 创建数据库并预填充- 没有完成这个,但我担心的是当测试将数据库更改为意外状态时会发生什么。当其他测试没有做错任何事情时,它们就会失败。
  3. 创建数据库并使用Gi​​vens- 我已经通过 NUnit 完成了这个[SetupFixture]在 Linq-to-sql DB 之上。您仍然担心并行测试运行,并且必须平衡给定的粒度(请参阅StackOverflow-BDD 场景何时变得过于具体),并且您遇到了数据更新顺序/数据隔离问题,但这可以很好地帮助您处理数据故事并在整个测试过程中增长数据。另一方面,如果一个测试失败并使数据处于不良状态,您可能会遇到很多失败,但至少您只需要查看第一个失败的测试。对于在工作站上的开发人员来说,这种测试也不会很好地发挥作用,因为他们不能只运行单个测试,特别是使用 NCrunch 等工具,它只能运行代码已更改的测试。
  4. 模拟数据库这就是我现在选择做事的方式。诀窍在于,如果您个人遵循相当严格的 TDD 流程,仅测试您正在使用的方法,那么您实际上最终会得到一些测试数据库交互的层,例如[Test]DALLayerTests.ShouldReadARowAndCreatePOCO(),但大多数其他人使用模拟数据来测试实际发生的情况,例如[Test]BusinessObjectPersonTests.ShouldGetBirthdayCongratulations().
  5. 使用清理代码- 从未尝试过,听起来很危险:-)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpecFlow 与数据库模式的集成测试 的相关文章

  • 重命名 MySQL 中的表

    重命名表在 MySQL 中不起作用 RENAME TABLE group TO member 错误信息是 1064 You have an error in your SQL syntax check the manual that cor
  • C# IEnumerator/yield 结构可能不好?

    背景 我从数据库中获取了一堆字符串 我想返回它们 传统上 它会是这样的 public List
  • 将对象存储在数据库中

    我有很多对象 每个对象都可以有许多不同类型的属性 许多属性重叠 例如 许多对象具有属性 名称 由于对象的类型很多 如果为每组具有相同属性的对象构建一个表 将需要很多表 目前我使用的是mysql 它是这样存储的 object id attri
  • 清理 couchdb 并重新启动

    清理命令是什么CouchDB请 如果我想disable and re start我的CouchDB命令是什么 Thanks CouchDB 可以从以下位置启动 停止 重新启动 etc init d couchdb or etc rc d c
  • 哪些 ORM 与 Scala 配合得很好? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 什么时候数据库被称为嵌入式数据库?

    术语 嵌入式数据库 与 数据库 具有不同的含义吗 我见过的嵌入式数据库有两种定义 嵌入式数据库就像专门为 嵌入式 空间 移动设备等 设计的数据库系统一样 这意味着它们在紧张的环境中 内存 CPU 方面 可以合理地执行 嵌入式数据库就像不需要
  • 在哪里可以下载可用作数据仓库的示例数据库? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 在哪里可以下载可用于创建数据仓库的示例数据库 它不应该是来自 Microsoft Northwind
  • Hibernate 乐观锁..它是如何工作的?

    我正在阅读下面关于休眠乐观锁定的博客 我打算将它与休眠一起使用 但是 我有一个担忧 我们有java代码和c 代码 都连接到一个数据库 虽然java代码可以使用hibernate来实现乐观锁定 但我想让c 代码做同样的事情 此外 C 代码正在
  • 我想在 Red Hat Linux 服务器中执行 .ps1 powershell 脚本

    我有一个在窗口中执行的 ps1 powershell 脚本 但我的整个数据都在 Linux 服务器中 有什么可能的方法可以让我在红帽服务器中执行 powershell 脚本 powershell脚本是 Clear Host path D D
  • 如何将两个django模型(表)合并为一个模型(表)

    我想合并两个 django 模型并创建单个模型 我们假设 我有第一个表表 A 其中包含一些列和数据 Table A col1 col2 col3 col4 x1 x2 x3 x4 y1 y2 y3 y4 我还有另一个表 Table B 其中
  • 非关系数据库设计[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有兴趣了解您使用过的设计策略非关系型 nosql 数据库 也就是说 不使用传统关系设计或 SQL 的 大多数是新的 数据存储类 例如
  • 数百个别名/同义词与数据库表的完全限定名称

    考虑到多个模式中的数百个数据库表 在创建存储过程和视图时 您是否建议使用别名 同义词或完全限定名称 给定一些 schema table 像这样 Orders OrderHeader Production LineThroughput Sal
  • Postgres - 如何在插入时自动调用 ST_SetSRID(ST_MakePoint(lng, lat), 4326)?

    我正在使用postGIS 并且我对SQL不是很熟悉 我可以成功插入到我的markers表只要我做这样的事情 伪代码 INSERT INTO markers created by title description lat lng geogr
  • 什么时候不应该使用 Cassandra? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 相关话题已经有很多讨论了卡桑德拉 http cassandra apache org lately Twitter Digg Facebook
  • 对于数据库来说,选择正确的数据类型会影响性能吗?

    如果是这样 为什么 我的意思是 tinyint 的搜索速度比 int 快吗 如果是这样 性能上的实际差异是什么 是的 根据数据类型 它确实有所不同 int vs tinyint不会在速度上产生明显的差异 但会在数据大小上产生差异 假设tin
  • PHP 中的 MongoDB - 如何将项目插入集合中的数组中?

    这必须很容易 但我似乎无法弄清楚 假设我有一个集合users这是集合中的第一项 id ObjectId 4d8653c027d02a6437bc89ca name Oscar Godson email email protected cdn
  • Neo4j Desktop DB 无法启动,状态为“KILLED”

    运行 Neo4j Desktop 版本 1 0 15 尝试启动DB导致启动失败 数据库启动失败 DB database f8950fdd 6b5f 4fea 8c9f e8457ee1da9a v3 3 1 退出 状态为 已杀 检查日志 主
  • 如何在 Visual Studio 中更改 Azure 数据库表的列顺序

    我整个下午都在寻找在 MS Visual Studio 2022 中重新排序 Azure 数据库表列的方法 没有运气 在其他应用程序中 可以通过拖动或剪切和粘贴轻松重新排列列 这里无能为力 此时 我什至不确定可以在 VS 中移动列 我只对
  • 将古吉拉特语文本插入 MySQL 表会产生垃圾字符和不可读的文本

    我有三个 MySQL 表 我正在向其中插入古吉拉特语内容 当我插入两个表时 它们插入得很好并且可读 但在一个表中 它显示垃圾字符 不可读的文本 我怎样才能解决这个问题 MySQL 有每个表的字符集设置 http dev mysql com
  • 将第三个表链接到多对多关联中的桥接表

    设计这个数据库的正确方法是什么 这是我设置表格的方式 我在名为 教师 的表和名为 仪器 的表之间存在多对多关系 然后我有一个连接两者的桥接表 我想将另一个表与 BRIDGE 表关联起来 意思是乐器 老师的组合 该表有 3 行 指定老师可以教

随机推荐