如何安全地对Symfony 2中的写操作进行单元测试?

时间:2011-07-16 21:04:01

标签: database unit-testing tdd phpunit symfony

我想为我的所有CRUD创建测试。但是如何为它们设置单独的数据库?这是最好的方式吗?

这是另一个问题,但它是相关的:我是否应该在生产服务器中运行测试?有时在不同的环境中事情会出错,所以我想我应该这样做。但后来我需要提到的单独的数据库,对吗?

有什么建议吗?

3 个答案:

答案 0 :(得分:10)

在生产服务器上运行任何类型的测试通常都是一个坏主意(除非它只是尚未进行调试的生产硬件)。

单元测试未命中数据库(或任何其他外部系统)。因此,为了创建单元测试,您需要删除对数据库的依赖。

你所谓的'单元测试'可能是一个集成测试。任何利用外部系统(例如数据库,文件系统等)的测试都是集成测试。

您的问题的两个常见解决方案是:

  1. 在测试开始时,恢复包含的数据库备份 已知数据到单独的测试数据库,然后执行测试 反对它。

  2. 在每次测试开始时使用“已修复”的已知测试数据库 一个事务,执行测试,然后回滚事务 让数据库处于相同的已知状态。

  3. (通常优选1号,因为(2)中的数据库可能变为“污染”)。

答案 1 :(得分:3)

我同意米奇的观点。我想补充一点,你应该决定你是要进行集成测试还是单元测试(或两者兼而有之,但不是在同一个测试中)。事实上,如果您确实想要进行单元测试,请实现:

  1. 您的代码对外部数据库具有“依赖性”。
  2. 进行单元测试时,您必须找到一种“伪造”数据库的方法。您想要测试一个“单位”,这意味着一件事,而不是两件或更多件事(即您的CRUD代码和您与数据库的连接以及数据库本身)。
  3. 通常,您需要使用依赖注入等内容重构代码,以便在进行单元测试时可以伪造代码所依赖的内容。
  4. 单元测试不只是测试您的代码。这实际上很容易。更难的部分是使你的代码可以测试

    我建议前往http://artofunittesting.com/并观看右侧“单元测试视频”标题下的免费视频。忘记他在.NET工作的事实,因为它是重要的原则。

    然后观看Misko Hevery的GoogleTechTalks,他解释了为什么要进行依赖注入。

    Design Tech Talk Series Presents: OO Design for Testability

    The Clean Code Talks -- Unit Testing

    (他也有更多。有一个series of six GoogleTechTalks。)

答案 2 :(得分:3)

我今天遇到了类似的问题,我认为我找到了一个很好的解决方案。

  • 制作数据库的副本(创建新的空数据库也可以。)
  • 编辑config_test.yml以更改数据库名称。

我的测试配置示例(可能会有所不同,具体取决于您是否有多个db-s等)

doctrine:
    dbal:
        dbname: test_db
  • 通过调用php app/console doctrine:schema:update --force --env=test更新数据库以反映应用程序中的实体(如果您刚刚创建新数据库以及每次更改应用程序模型时都需要)。

您的应用程序现在应该在单元测试期间使用测试数据库。 NB!在搞乱实时数据库之前,请务必备份数据库。

然而,如前所述,这些不再是单元测试,而是集成测试。