【问题标题】:How making tests which using database faster? [closed]如何使使用数据库的测试更快? [关闭]
【发布时间】:2020-03-06 08:55:24
【问题描述】:

我正在为我的公司制定一些概念。目标是使我们的集成测试更快。 特别是使用和/或操作数据库的集成测试。我将测试分为 2 个类别和目录:

  • 单元测试
  • Integration-Tests(这里是所有与数据库联系的测试类)

我们使用 Postgresql 9.3 版、Liquibase、Visualstudio 和 MSTest。

我们的测试执行是在这个步骤中的:

  1. 运行测试(正在使用的项目)
  2. 创建数据库
  3. 如果类中有一些需要数据库的方法,则填写数据库

问题:

  1. 在每个方法运行之前,我们都会使用 TestInitiliaze 填充数据库,如下所示: [TestInitiliaze] public void TestInit(){ Databaseclass.FillDatabase(); }

  2. 我们有 450 个测试正在使用数据库。近 50 个测试操作数据库。

  3. 其他使用数据库的测试,无需操作即可读取测试数据。

  4. 测试是混合的。这意味着我们在一个类中进行了操作数据的测试和一些只读取数据的测试。

目标: 使这个测试更快。我有一个在我们的项目中不起作用的概念。使用数据库快照。 我的想法:

  1. 运行测试
  2. 创建数据库
  3. 填充数据库
  4. 数据库快照
  5. [TestInitiliaze] public void testinitiliaze(){ DatabaseClass.revertToSnapshot() }
    1. 或类初始化:DatabaseClass.revertToSnapshot()

我尝试再提出一个概念。但它也不适用于我们的 Postgresql 版本。 嵌套事务。

还有其他可行的替代方案吗?

最好的问候 哈格姆

【问题讨论】:

    标签: c# performance testing integration-testing postgresql-9.3


    【解决方案1】:

    另一种方法是编写集成测试,这样您就不需要不断地重新初始化数据库。这就是我们所做的。不是每个测试都需要一个“新鲜”的数据库。随机化名称之类的东西(即客户名称必须是唯一的 - 添加随机数字),我们设法拥有 100% 独立的集成测试设置。如果这不可行,您可以分两个阶段运行集成测试(不是所有阶段)——首先是在开始时初始化 ONCE 的阶段,然后是根据需要重新初始化数据库的其他阶段。

    【讨论】:

    • 最重要的是,可以在合理和可能的情况下使用 Mocking。基本上,我们做同样的事情,只是为了“只读”测试,我们模拟数据(测试实际上并不测试数据库行为的正确性)。
    • 我的问题是我真的更喜欢完全测试到数据库 - 我们反复遇到很难模拟数据库之外的行为的问题。
    • 是的,正如我所说。在你需要测试实际数据库的地方,你需要一路走下去。我们只模拟那些情况,即“我需要这个和那个预期的数据”,另一个测试已经涵盖了 db fetch 是正确的。
    猜你喜欢
    • 2020-09-02
    • 2011-10-04
    • 2020-10-30
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 2010-09-24
    • 2011-04-11
    • 2021-10-16
    相关资源
    最近更新 更多