- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的应用程序中,我有多个小型 Entity Framework dbcontexts,它们共享同一个数据库,例如:
public class Context1 : DbContext {
public Context1()
: base("DemoDb") {
}
}
public class Context2 : DbContext {
public Context2()
: base("DemoDb") {
}
}
所有数据库更新都是通过脚本完成的,不依赖于迁移(以后也不会)。问题是 - 您将如何针对这些上下文进行集成测试?
我相信这里有三个选项(可能还有更多我只是不知道)
选项 1 - super 上下文 - 包含设置数据库所需的所有模型和配置的上下文:
public class SuperContext : DbContext
{
public SuperContext()
: base("DemoDb") {
}
}
在此选项中,测试数据库将针对 super 上下文进行设置,所有后续测试将通过较小的上下文完成。我不喜欢这个选项的原因是我将复制我已经构建的所有配置和实体模型。
选项 2 - 为集成测试创建自定义初始化程序,它将运行所有适当的数据库初始化脚本:
public class IntegrationTestInitializer : IDatabaseInitializer<DbContext> {
public void InitializeDatabase(DbContext context) {
/* run scripts to set up database here */
}
}
此选项允许针对真实的数据库结构进行测试,但每次添加新的数据库脚本时也需要更新
选项 3 - 仅测试各个上下文:
在此选项中,您只需让 EF 根据上下文创建测试数据库,所有测试都将在其自己的“沙箱”中运行。我不喜欢它的原因是,它不会让人觉得您会针对数据库的真实表示进行测试。
我目前倾向于选项 2。你们怎么看?有没有更好的方法?
最佳答案
我经常使用集成测试,因为我仍然认为它是涉及数据相关流程时最可靠的测试方法。我也有几个不同的上下文,以及用于数据库升级的 DDL 脚本,所以我们的情况非常相似。
我最终得到的是选项 4:通过常规用户界面维护单元测试数据库内容。当然,大多数集成测试临时修改数据库内容,作为测试“行动”阶段的一部分(稍后将详细介绍这个“临时”),但内容是测试 session 开始时未设置。
这就是原因。
在某个阶段,我们还在测试 session 开始时通过代码或通过反序列化 XML 文件生成数据库内容。 (我们还没有 EF,否则我们可能会在数据库初始化程序中使用一些 Seed
方法)。渐渐地,我开始对这种做法产生疑虑。当数据模型或业务逻辑发生变化时,维护代码/XML 是一项艰巨的工作,尤其是。当必须设计新的用例时。有时我允许自己对这些测试数据进行轻微损坏,因为我知道这不会影响测试。
此外,数据必须有意义,因为它们必须与来自实际应用程序的数据一样有效和连贯。确保这一点的一种方法是通过应用程序本身生成数据,否则您将不可避免地以某种方式在种子方法中复制业务逻辑。 模拟真实世界的数据实际上非常困难。这是我发现的最重要的事情。测试不代表真实用例的数据群不仅是浪费时间,而且是虚假的安全措施。
因此,我发现自己通过应用程序的前端创建测试数据,然后煞费苦心地将此内容序列化为 XML 或编写生成完全相同的代码。直到有一天我突然想到,我在这个数据库中有现成的数据,为什么不直接使用它呢?
现在您可能会问如何使测试独立?
集成测试,就像单元测试一样,应该是独立执行的。它们不应依赖于其他测试,也不应受其影响。我假设您的问题的背景是您为每个集成测试创建并播种了一个数据库。这是实现独立测试的一种方式。
但是如果只有一个数据库,没有种子脚本怎么办?您可以为每个测试恢复备份。我们选择了不同的方法。每个集成测试都在从未提交的 TransactionScope
中运行。这是很容易实现的。每个测试夹具都继承自具有这些方法 (NUnit) 的基类:
[SetUp]
public void InitTestEnvironment()
{
SetupTeardown.PerTestSetup();
}
[TearDown]
public void CleanTestEnvironment()
{
SetupTeardown.PerTestTearDown();
}
在 SetupTeardown
中:
public static void PerTestSetup()
{
_tranactionScope = new TransactionScope();
}
public static void PerTestTearDown()
{
if (_tranactionScope != null)
{
_tranactionScope.Dispose(); // Rollback any changes made in a test.
_tranactionScope = null;
}
}
其中 _tranactionScope
是一个静态成员变量。
关于c# - 集成测试共享数据库的多个 Entity Framework dbcontexts,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26257366/
Windows 集成 (NTLM) 身份验证和 Windows 集成 (Kerberos) 之间有什么区别? 如何在IIS6中实现这些 w.r.t. MSDN 最佳答案 Kerberos 和 NTLM
Keycloak是一个用 Java 编写的开源身份验证和身份管理解决方案。它提供了一个nodejs适配器,使用它我能够成功地与express集成。这是有效的路由文件: 'use strict'
这是我关于 Bamboo 的第二个问题 ( My First One )。阅读建议信息后我的理解是,我需要一个构建工具,例如 nAnt 或 MSbuild 来编写一个获取源代码并构建它的脚本(我正在开
可用于将第三方应用程序与 jira 4.3 集成的身份验证方案有哪些?显然,从客户那里获取用户名和密码听起来很荒谬。另外,我知道 oauth 身份验证仅适用于版本 5。请告诉我。谢谢。 附注。我不是在
我有一个使用 DDS 的旧版 C++ 应用程序用于异步通信/消息传递。我需要将此应用程序集成到使用 JMS 进行消息传递的 JavaEE 环境中。除了构建独立的 JMS/DDS 桥接模块之外,我还有其
我正在尝试使用 Whatsapp 发送测试消息,但收到此错误消息: "error":{"code":27,"description":"Recipient not available on chann
我想将 photologue 与我的 Django 应用程序集成,并使用它在车辆库存中显示照片......有点像 Boost Motor Group Inc. 提供的内容。我已经集成了该应用程序,所以
我目前正在尝试弄清楚如何与 fujitsu scansnap 扫描仪集成,但没有从 fujitsu 找到有关 fujitsu scansnap 管理器如何调用您的应用程序并将文件发送到您的应用程序的详
在我的项目中,我使用了 9 个(九个)int-ip:udp-inbound-channel-adapter 和一个 jms:inbound-channel-adapter。 Jms 适配器从服务器接收
在我们当前的原型(prototype)中,大多数标准 HTML 控件都被小程序取代,最重要的是表单提交由小程序触发。 有没有一种方法可以像 一样在服务器端调用关联的操作 ? 本文Applet and
是否可以使用 twilio 号码从 whatsapp 发送/接收短信?有人用whatsapp试过twilio吗?我问过客服,如果可能的话,他说,不确定,但很多人都问过这个问题。 最佳答案 万一其他人来
我们办公室中几乎不存在版本控制,这显然导致了很多麻烦。我们想使用SVN和Notepad++进行设置...任何人都对如何实现此目标有任何想法?我已经开始研究并浏览了这个网站: http://www.sw
曾经有提供这种集成的 spring-modules 项目;但是,该项目现已弃用。现在有没有人继续支持这种集成?谢谢。 最佳答案 工作正在进行中。 http://blog.athico.com/sear
我的理解是,根据 http://wiki.dbpedia.org/Datasets,DBpedia 从 YAGO 获取类层次结构,而不是实体。 .但是,类似 http://dbpedia.org/cl
任何人都可以帮助我如何将 OpenCMS 与 Java Spring Web 应用程序集成。已经用谷歌搜索并浏览了很多网站但没有用。所以,请帮助我。 最佳答案 我认为将 SpringMVC 与 Ope
我正在尝试使用新的 migs getaway (MPGS) 我遵循了下一个 url 中的代码 https://ap-gateway.mastercard.com/api/documentation/i
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 4年前关闭。 Improve thi
我有一个 cmake 项目。我想轻松完成以下操作 搜索光标下任何变量、函数等的声明、定义和引用,这些可能在外部头文件中声明,其路径是在CMakeLists.txt中使用INCLUDE_DIRECTOR
有人能给我指点一下 Objective-C(或 c/c++)库的方向,或者教通过 FTP 上传或下载的教程(Objective-C)吗?最好能展示如何将文件下载到临时目录,然后稍后上传?我不介意针对
集成()给出了非常错误的答案: integrate(function (x) dnorm(x, -5, 0.07), -Inf, Inf, subdivisions = 10000L) # 2.127
我是一名优秀的程序员,十分优秀!