unit-testing - 为什么不在单元测试中访问数据库?

标签 unit-testing nunit

我在博客中读到,当单元测试运行时,数据库不应该被击中。我理解这个理论,但是说我有复杂的存储过程,这是业务域操作的一部分。我想为与业务操作相关的代码编写一组单元测试,但是如果我模拟数据库,我感觉我没有“真正”测试作为操作一部分的所有部分。例如,有人可以在其中一个数据库代码中创建错误,并且测试仍然可以正常运行。

我想知道这个关于单元测试的指南在实践中是否很好。
我已经看到了“集成测试”的概念,但是我不确定使用什么工具来进行集成测试。例如 ¿ 是否可以使用 Nunit 之类的测试框架创建集成测试?

谢谢

雨果

最佳答案

您只是处于语义灰色区域。

  • 系统测试从端到端覆盖整个系统。
  • 单元测试可用于描述端到端循环的子部分。

  • 在这种情况下,您的应用程序代码的单元测试将/可能不会命中数据库,但您将/可能有涵盖数据库存储过程的单元测试......

    基本上将您的应用程序划分为沿着有意义的分区进行测试的事物。如果您选择了错误的分区线,您最终会遇到模拟对象和测试脚手架之类的大代码维护问题......

    Web 应用程序的一种常见方法是编写一系列单元测试来测试数据访问层......

    然后编写一系列单元测试,测试应用层(包括数据层)...

    最后写一些基于浏览器的系统测试......

    诀窍是仅通过 API 将信息输入和输出中间集(应用程序层),而不是钻入数据库以查看是否有效。这样,如果您更改数据架构,您的测试就不会中断。

    但有时(正如我在写这篇文章时实际所做的那样)你必须查看数据库来制作一个有意义且健壮的测试套件(我正在测试服务器-服务器传输协议(protocol))。

    专注于为您的应用程序获得最大代码覆盖率和稳定性的方式,同时编写最少数量的测试脚手架,并避免测试套件中的脆弱性。

    关于unit-testing - 为什么不在单元测试中访问数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1054989/

    相关文章:

    c# - 'await' 有效,但调用 task.Result 挂起/死锁

    javascript - 使用 Sinon stub get 方法

    .net - 在 NUnit 中动态创建测试

    unit-testing - 使用 NANT 并行运行 NUnit 测试

    angularjs - 单元测试,当 $http 没有被调用时等待 promise

    c# - 最好的 Nunit 测试运行器是什么?

    nunit - 使用 NAnt 中的 nunit2 任务发现

    unit-testing - 如何对数据结构的内部(组织)进行单元测试?

    android - 如何使用 Mockito 和 Robolectric 模拟 Context?

    javascript - Redux 表单 onSubmit 在测试中值空对象