当数据库架构和实体更改时,单元测试失败,但单元测试未更改

尼曼

以下是我的应用程序中的确切场景:

  • 代码库中有几个 C# 方法使用实体框架与 SQL 数据库对话。
  • 单元测试针对所有方法编写,并涵盖基于方法签名、输入要求和返回值的所有可能的排列和组合。
  • 单元测试工作正常,但在应该失败时却失败了(即,某些验证已更改或预期返回值已更改,但单元测试未反映相同的情况)。
  • 在某些情况下,开发人员会更改 SQL 架构并更新 C# 代码中的实体。在这种情况下,单元测试通过,这绝对没问题,因为它只是改变了底层逻辑,而不是输入、验证或返回值。
  • 但是,我希望在更改数据库架构和实体时某些单元测试失败,但不更改单元测试。这意味着,我希望开发人员在更改数据库架构和实体时修复单元测试。

任何人都可以请建议如何实现相同的目标?

对此的任何帮助将不胜感激。

谢谢

错误

我上移了最后一段,因为它出现在您的XY 问题的 X 上我确实建议阅读所有其他段落,因为您似乎误解了单元测试是什么以及它的用途是什么。

单元测试不会测试多个代码库!

我刚刚在你写的评论中注意到了这一点:

因此,如果一个项目的开发人员更改了数据库架构,我们希望提醒他们这种架构更改也应反映在其他项目中。

单元测试不应用作同步两个完全不相关的代码库的方法。

这是 DRY 与 WET 的简单应用程序:如果这些应用程序共享相同的数据库架构,则数据库架构(和相关的 EF 实体)应该位于两个应用程序都依赖单一来源中。
不要开发相同的东西两次,因为当另一个改变时,你最终不得不不断地同步一个(这就是你现在正在处理的)。

例如,您可以在 Nuget 服务器上托管“共享数据”项目,并使两个应用程序都引用自托管的 Nuget 包。正确配置后,无论何时构建应用程序,它都会获取“共享数据”项目的最新版本,从而确保两个应用程序始终使用最新版本的数据库模式。

第二种方法(如果您不想创建共享依赖项)是让您的颠覆系统观察某些文件(例如实体类文件夹),并在这些文件中进行任何更改时提醒您。当您收到警报时,您将注意检查此更改是否影响其他应用程序的代码库。
如果我理解正确的话,你真的只是想得到一个警报,对吧?

还有其他方法可以解决这个问题,决定取决于您的基础设施和您的团队使用的技术。但是绝对不应该通过手动编写脚本/伪造单元测试失败来完成。


不要忘记“单元测试”中的“单元”

当数据库架构和实体更改时,我希望某些单元测试失败

单元测试测试件事(因此是“单元”)。看起来您正在编写测试两件事的测试:业务逻辑和数据库。这是一个集成测试。作为一个经验法则:

  • 单元测试测试一个组件。
  • 集成测试测试多个组件之间的交互

不要测试外部依赖

如果您要专门为 EF 编写单元测试(您不应该这样做,但稍后会详细介绍),您实际上不会在测试中涉及实际的数据库。充其量,您会断言 EF 生成的 SQL,而不在数据库上运行该查询。

重复我的观点,单元测试测试一个组件。实体框架和数据库服务器是两个不同的东西。

使用外部组件(例如数据库服务器)时,您又要深入到集成测试领域。


只测试你自己的代码

如前所述,您不应该测试实体框架。对库进行单元测试基本上是在做库开发人员的工作。你不应该为图书馆的工作方式而烦恼。如果有的话,您使用的是专库,因为你并不想知道它是如何工作的内部。

考虑这个测试:

public void TestForAddition()
{
    var expectedValue = 2;
    var testValue = 1 + 1;

    Assert.AreEqual(testValue,expectedValue);
}

您在这里所做的是测试+由 C#.Net 框架提供运算符。那不是代码的一部分,因此您不应该测试它。这个想法与 EF 参数相同:它不是您的代码,也不由您来测试。您必须信任您使用的依赖项。

但是,如果您重载了+运算符,则应该对其进行测试(因为这是您的代码)

public static Person operator+ (Person a, Person b) 
{
   return new Person() { Name = a.Name + " " + b.Name };
}

public void TestForPersonAddition()
{
    var expectedValue = "Billie Jean";

    var billie = new Person() { Name = "Billie" };
    var jean = new Person() { Name = "Jean" };

    Assert.AreEqual(billie + jean,expectedValue);
}

对于以 EF 为中心的示例,这意味着您不应该对 Entity Framework 进行单元测试您应该只对代码进行单元测试,而不应该对 EF 进行单元测试。
但是,您可以为此编写集成测试。这可以实现您想要的:您针对现有数据库运行集成测试。如果集成测试通过,您就会知道新代码库与现有数据库兼容。如果他们不这样做,那么您就知道发生了值得开发人员注意的问题。


单元测试测试行为!

但是,我希望在更改数据库架构和实体时某些单元测试失败,但不更改单元测试。这意味着,我希望开发人员在更改数据库架构和实体时修复单元测试

因此,您希望您的开发人员首先修复从未被破坏的单元测试吗?

你的意图对我来说毫无意义。您更改了一些代码并且单元测试没有失败。这是一件好事。但是你想使他们失败了,所以你的开发者则被迫“修复”单元测试(即未在首位打破)。

如果单元测试通过,但您仍然声称应用程序的行为有问题,那么您的单元测试没有完成它们应该做的工作

你在滥用单元测试。问题不是试图弄清楚如何强制单元测试失败;问题是您期望单元测试的结果告诉您什么。
不应使用单元测试来测试内部系统是否已更改。单元测试测试应用程序是否仍然以相同的方式运行(即使某些代码已更改)。

如果我从头开始重写您的代码库,然后在我的新代码库上运行相同的(未修改的)单元测试,并且所有单元测试都通过了,这意味着我的代码的行为方式与您的相同,并且我们的代码库在功能上是等效的(至少关于您为其编写测试的行为)


本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

涉及数据库的单元测试

来自分类Dev

单元测试VueJS和VueResource时状态未更改

来自分类Dev

symfony中的单元测试实体何时使用测试数据库?

来自分类Dev

单元测试失败

来自分类Dev

当大多数项目都访问了我无法更改的不良架构的数据库时,该如何对项目进行单元测试?

来自分类Dev

从数据库返回单元测试和数据

来自分类Dev

需要空数据库的实体框架代码第一个单元测试

来自分类Dev

JDBC /数据库单元测试的最佳实践

来自分类Dev

用于数据库服务的AngularJS单元测试

来自分类Dev

如何对Django数据库迁移进行单元测试?

来自分类Dev

连接到数据库的单元测试异步功能

来自分类Dev

单元测试异步数据库方法

来自分类Dev

如何对Django数据库迁移进行单元测试?

来自分类Dev

单元测试数据库调用

来自分类Dev

rspec rails:单元测试数据库查询

来自分类Dev

根据附加功能更改单元测试

来自分类Dev

模拟请求时,单元测试期间未保存数据库条目

来自分类Dev

Umbraco单元测试失败

来自分类Dev

验证单元测试失败

来自分类Dev

“单元测试失败”的BeautifulSoup

来自分类Dev

Umbraco单元测试失败

来自分类Dev

Rails单元测试失败

来自分类Dev

使用Spock和Robospock进行单元测试以创建SQLite数据库

来自分类Dev

AngularFireDatabase,Jest和单元测试firebase实时数据库

来自分类Dev

neo4j功能和单元测试-重置数据库

来自分类Dev

在 Node.js 中单元测试和模拟 mySQL 数据库

来自分类Dev

使用实体框架进行单元测试的单元测试

来自分类Dev

单元测试未执行时,鼻子测试失败

来自分类Dev

单元测试未运行