Php 在Codeception中的测试之间持久化数据库

Php 在Codeception中的测试之间持久化数据库,php,laravel-5,codeception,Php,Laravel 5,Codeception,我正在使用Codeception验收测试测试一个用L5编写的CRUD应用程序。我想知道你们是怎么做的 我原本以为可以使用CEST并使用@dependens属性来指定顺序,但似乎在每次测试后都会运行自动数据库清理,因此在插入后,下一次测试无法在数据库中找到该记录 是否有一种方法可以做到这一点,而无需专门为测试创建DB转储 我希望能够按此顺序进行以下测试: 创建项目 阅读项目 更新项目 删除项目 并检查每个阶段的DB,确保其成功 任何帮助都将不胜感激 干杯, Daryll这里指定的默认行为肯定是

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

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

是否有一种方法可以做到这一点,而无需专门为测试创建DB转储

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

  • 创建项目
  • 阅读项目
  • 更新项目
  • 删除项目
并检查每个阶段的DB,确保其成功

任何帮助都将不胜感激

干杯,
Daryll

这里指定的默认行为肯定是您想要的。您希望测试能够单独执行。如果要重新测试某个区域,因为该区域已损坏,则不必返回并再次运行以前的测试,以使其处于正确状态,从而再次运行测试

单个中断测试将让您更好地了解中断的位置,而不是进行多个中断测试,因为您所有其他测试所依赖的测试都中断了
,这正是您描述的方法所适用的

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

如果您按照默认行为的指示进行操作,那么您将只有一个中断的测试,并且您可以修复该问题。非常容易。您只需在出现测试用例时将其添加到数据库中即可

如果要检查数据库中的内容,可以在同一测试中查询两次。执行更新查询,然后对刚刚完成的操作运行select查询,并作为另一个断言执行and equals。如果数据库设置正确并且没有错误,那么您可以相信数据库已经运行了您的查询,但是您更了解您的应用程序。例如,你可能有触发器在运行

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

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

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

单元测试的目的是测试您编写的代码

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

  • DBAL驱动程序(Larvel)
  • PHP数据库驱动程序(不管larvel使用什么)
  • DB本身(无论DB是什么)
  • 这会造成不必要的测试复杂性:

  • 每个测试环境都应该正确设置所有这些组件
  • 您需要确保测试之间的数据是一致的。所以最简单的方法是在每次测试之后清理数据,每个测试都应该创建自己的数据(非常慢)
  • 你重复DB创建者、驱动程序创建者和Larvel所做的工作
  • 因此: 测试变得越来越慢,测试环境的管理变得越来越困难。这就导致了当你停止编写测试时

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

    如果您想确保DBAL正常工作,请运行它的unittest


    至于我所从事的项目,有一项工作是将所有测试从DB移到Mock,对于更改后的测试,速度提高是x 1000。

    我也在寻找类似的东西,但特别是对于某些测试,例如,我希望测试2依赖于测试1,而不在一个函数中进行测试。我的意思是我想把测试1的更改持久化到测试2。检查DB是一个可怕的想法。我在一个项目上工作过。不是测试代码,而是测试。DB本身、PHP驱动程序、DBLA以及所有这些都是这些组件的创建者的责任。。。以及绑定到DB的测试都非常非常慢,所以您的测试在某个点上会花费很长时间。作为之前评论的休整,请使用DI和模拟DBAL,以便确保调用正确的方法。不要检查数据。我遵循您的逻辑,但是在一个复杂的应用程序中隔离每个测试是非常困难的。假设您重构了一个影响数据库的组件和10个其他测试,您现在必须修改所有这些测试的所有装置,这可能是一个乏味的过程!你是如何管理的?好问题:我猜你必须处理一个模拟出来的数据库及其相应的装置,这很繁琐,而且要复杂一个数量级。如果你的模拟测试失败了,但是你的代码是正确的:你的模拟还没有被重构来“模仿”你的新代码。重写模拟代码是乏味的。更新数据库装置并不是,只需使用gui更新数据并导出到git即可。如果您的数据库测试中断,那么您的代码实际上已经中断。每次模拟代码发生更改时,模拟都会中断,重写模拟是数据库测试中不需要执行的步骤。