XUnit 测试 - InMemory 与真实数据库
XUnit testing - InMemory vs Real Database
我正在努力决定在我的单元测试中使用我的数据库的最佳方法。我正在使用 XUnit 进行测试,我的数据库模型是 entity framework.
的代码优先
我的选项是 InMemory 和 Real Database,两者都由 entity framework 上下文搭建。
虽然两者似乎都有问题 -
InMemory - 很好,因为它可以启动数据库实例并在内存中快速销毁它们。不好,因为它找不到本机 SQL 错误并且无法测试 运行 原始 sql 命令的功能。
真实 - 很好,因为它可以找到本机 SQL 错误并测试 运行 原始 sql 命令的功能。不好,因为 DbContext 不是线程安全的,并且 xunit 运行s 测试是异步的,这意味着我需要为每个测试(及时且混乱)启动一个新的真实数据库。
这里哪个是首选解决方案?两者似乎都有利有弊,这里有我想念的最佳解决方案吗?
我推荐金字塔方法。金字塔的底部是单元测试,它们数量众多,是您获得对刚编写的代码的任何反馈的最快方式。最重要的是,您的集成测试要少得多。然后,最重要的是完整的回归测试,然后是冒烟测试,金字塔的每一片都越来越小。
说了这么多,何乐而不为呢?将 InMemory 视为单元测试,将 Real 视为集成测试。
至少我推荐使用 InMemory 数据库进行单元测试。是的,单元测试是孤立的,不会捕获所有错误,但这里的好处是您现在拥有坚实的测试基础。单元测试也可以 运行 作为构建的一部分,如果有人不小心破坏了某些东西,这将像安全网一样抓住它。
我正在努力决定在我的单元测试中使用我的数据库的最佳方法。我正在使用 XUnit 进行测试,我的数据库模型是 entity framework.
的代码优先我的选项是 InMemory 和 Real Database,两者都由 entity framework 上下文搭建。
虽然两者似乎都有问题 -
InMemory - 很好,因为它可以启动数据库实例并在内存中快速销毁它们。不好,因为它找不到本机 SQL 错误并且无法测试 运行 原始 sql 命令的功能。
真实 - 很好,因为它可以找到本机 SQL 错误并测试 运行 原始 sql 命令的功能。不好,因为 DbContext 不是线程安全的,并且 xunit 运行s 测试是异步的,这意味着我需要为每个测试(及时且混乱)启动一个新的真实数据库。
这里哪个是首选解决方案?两者似乎都有利有弊,这里有我想念的最佳解决方案吗?
我推荐金字塔方法。金字塔的底部是单元测试,它们数量众多,是您获得对刚编写的代码的任何反馈的最快方式。最重要的是,您的集成测试要少得多。然后,最重要的是完整的回归测试,然后是冒烟测试,金字塔的每一片都越来越小。
说了这么多,何乐而不为呢?将 InMemory 视为单元测试,将 Real 视为集成测试。
至少我推荐使用 InMemory 数据库进行单元测试。是的,单元测试是孤立的,不会捕获所有错误,但这里的好处是您现在拥有坚实的测试基础。单元测试也可以 运行 作为构建的一部分,如果有人不小心破坏了某些东西,这将像安全网一样抓住它。