在 Codeception 中的测试之间保留数据库

Persist DB between tests in Codeception

我正在使用 Codeception 验收测试来测试用 L5 编写的 CRUD 应用程序。我想知道你们是怎么做到的。

我原本以为我可以使用 CEST 并使用 @depends 属性 来指定顺序,但似乎每次测试后自动 DB 清理都是 运行 ,因此在我插入下一个测试后无法在数据库中找到该记录。

有没有一种方法可以做到这一点,而无需专门制作专门用于测试的数据库转储?

我希望能够按此顺序进行以下测试:

并在每个阶段检查数据库以确保其成功。

如有任何帮助,我们将不胜感激。

干杯, 达里尔

此处指定的默认行为绝对是您想要的。您希望测试能够独立执行。如果您想再次重新测试一个区域,因为它已损坏,您不必返回并再次 运行 之前的测试以使其处于正确状态以再次 运行 测试。

一个失败的测试会让你更好地了解失败的地方,而不是多个失败的测试,因为一个测试会影响你所有的其他测试依赖已损坏,这就是您所描述的方法适用于的情况。

如果你仔细想想,就说你在做测试驱动开发。您使用创建记录的正确数据编写了一个破坏性测试。其他测试是读取、更新、再次读取、删除记录、更新不同的记录、创建另一个新记录并再次读取。删除失败,创建和读取测试失败,因为您重新插入了相同的索引。但是,这些测试不会告诉您,您只会得到 4 个失败的测试,并且您将必须检查所有失败的测试,以及哪个测试导致其他测试失败,如果确实如此。你不会知道的。

如果您按照默认行为告诉您的去做,您将只有一个失败的测试,然后您就可以解决问题。死的容易。您只需在出现测试用例时将其添加到数据库中即可。

如果您想检查数据库中的内容,可以通过在同一个测试中查询两次来实现。执行您的更新查询,然后 运行 您的 select 查询您刚刚完成的操作,并将 do and equals 作为另一个断言。如果您正确设置并且没有错误,您可以相信数据库有 运行 您的查询,但您更了解您的应用程序。例如,也许您有触发器 运行ning。

我相信您可以在配置中用这种东西来阻止这种行为,但这不是您想要的!:

class_name: FunctionalTester
modules:
    enabled: [Filesystem, FunctionalHelper, Laravel4, Asserts]
    config:
        Laravel4:
            environment: 'testing'
            cleanup: false

我有一个大型应用程序的经验,在某个时候我决定在每次测试时检查数据库。 2 年后,世界充满了痛苦和无用、缓慢、难以管理的测试。所以从中吸取教训:不要在 unittest 上测试数据库中的数据。

单元测试的目的是测试写的代码!

当您测试正确的数据到达数据库时,您测试:

  1. DBAL 驱动程序(Larvel)。
  2. PHP 数据库驱动程序(无论 larvel 使用什么)。
  3. 数据库本身(任何数据库)。

这会造成不必要的测试复杂性:

  1. 每个测试环境都应该正确设置所有这些组件。
  2. 您需要确保测试之间的数据一致。最简单的方法是在每次测试后清理数据,并且每个测试都应该创建自己的数据(非常慢)。
  3. 然后你重复数据库创建者、驱动程序创建者和 Larvel 所做的工作...

结果: 测试越来越慢,测试环境的管理越来越难。这导致您停止编写测试...

所以解决方案是编写 类 以在测试中使用 DI 和 Mock DBAL。有一些库可以帮助进行数据库模拟。但最后你应该只测试你的代码。它使用正确的数据调用正确的函数并对来自数据库的数据做出正确的反应。

如果你想确保你的 DBAL 正常工作运行它是单元测试。

至于我从事的项目,我们正在努力将所有测试从数据库中移出到模拟中,并且对于已更改的测试,速度改进是 x 1000。