在Codeception中的测试之间保留DB

时间:2015-02-15 21:35:48

标签: php laravel-5 codeception

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

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

有没有办法在没有专门为测试专门编写数据库转储的情况下执行此操作?

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

  • 创建项目
  • 阅读项目
  • 更新项目
  • 删除项目

并检查每个阶段的数据库,以确保它成功。

非常感谢任何帮助。

干杯, Daryll

2 个答案:

答案 0 :(得分:5)

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

单个破坏的测试将让您更好地了解破损的位置,而不是多次破坏测试,因为您的所有其他测试依赖的测试已被破坏,这就是你所描述的方法适合自己。

如果您考虑一下,请说您正在进行测试驱动开发。您使用创建记录的正确数据编写破解测试。其他测试是读取,更新,再次读取,删除记录,更新不同的记录,创建另一个新记录,然后再次阅读。删除失败,创建和读取测试失败,因为您重新插入相同的索引。测试不会告诉你,然而,你只需要进行4次破坏测试,你必须检查所有被破坏的测试,以及哪一次导致其他测试中断,如果确实如此。你不会知道的。

如果您执行默认行为告诉您的操作,您将只有一个损坏的测试,并解决了问题。容易死。您只需添加到数据库中,因为测试用例可以适应它们。

如果要查看数据库中的内容,可以通过在同一测试中查询两次来完成。执行更新查询,然后对刚刚完成的操作运行选择查询,并执行和等于另一个断言。如果您正确设置并且没有错误,您可以相信数据库已经运行了您的查询,但您更了解您的应用程序。例如,也许你有触发器运行。

我相信你可以在配置中停止这种行为,但它不是你想要的!:

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

答案 1 :(得分:1)

我有大型应用程序的经验,在某些时候,决定是每个测试都要检查数据库的女佣。 2年后,世界的痛苦和无用,缓慢,无法管理的测试。从中吸取了教训:不要在单元测试中测试DB中的数据。

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

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

  1. DBAL Driver(Larvel)。
  2. PHP DB Driver(无论larvel使用什么)。
  3. DB本身(无论数据库)。
  4. 这会造成不必要的测试复杂性:

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

      结果: 测试越来越慢,测试环境的管理变得越来越困难。当你停止编写测试时,这就导致了这一点......

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

      如果你想确保你的DBAL正常运行它的单位测试。

      至于我所参与的项目,我们努力将所有测试从DB移到模拟中,并且对于已经改变的测试,速度改进是x 1000。