【问题标题】:Symfony2 testing: Why should I use fixtures instead of managing data directly in test?Symfony2 测试:为什么我应该使用夹具而不是直接在测试中管理数据?
【发布时间】:2015-04-26 07:22:24
【问题描述】:

我正在为 Symfony 中的 API 编写一些功能测试,这些测试依赖于数据库中的数据。似乎普遍接受的方法是使用Fixtures 并在测试前加载固定装置。

创建一个适合我所有测试的健壮的 Fixture 类库似乎非常令人生畏且不切实际。我使用的是LiipFunctionalTestBundle,所以我只加载我需要的灯具,但这只会让事情变得更容易。

例如,对于某些测试,我可能需要 1 个用户存在于数据库中,而其他测试我可能需要 3 个。除此之外,我可能需要每个用户具有稍微不同的属性,但这完全取决于测试。

我真的很想按需为每个测试创建我需要的数据。我不想用我不需要的任何数据污染数据库这可能是使用 Fixtures 的副作用。

我的解决方案是 use the container 访问 Doctrine 并在运行断言之前在每个测试中设置我的对象。

出于任何我无法预见的原因,这是一个糟糕的决定吗?这似乎是一个相当大的问题,并且让编写测试变得很痛苦。

另一种可能性是尝试使用this port of Factory Girl for PHP,但它似乎没有大量的追随者,尽管工厂女孩在 Ruby 社区中被广泛使用来解决同样的问题。

【问题讨论】:

  • 你的方法没有错。选择适合你的。如果你开始遇到@AlpineCoder 指出的一些问题,那么很容易改变。
  • 嗨@Brian 你已经看到this 了吗?你在想什么?
  • @Matteo 我不太喜欢这种方法。创建所有这些类有很多开销。我真的希望对每个特定测试用例的实体属性进行更细粒度的控制。

标签: symfony testing functional-testing fixtures


【解决方案1】:

将测试数据固定在一个地方(而不是根据需要在每个测试中)的最大原因是,它允许您将测试失败与 BC 破坏架构更改隔离到仅受更改直接影响的测试。

一个简单的例子:

假设您有一个User 类,其中有一个必填字段name,您为此提供getName()setName()。您编写没有固定装置的功能测试(每个测试都根据需要创建Users),一切都很好。

以后的某个时候,您决定您实际上需要firstnamelastname 字段,而不仅仅是name。自然地,您更改架构并用新的 get 和 set 方法替换 getName/setName,然后继续运行您的测试。整个地方的测试都失败了(任何设置User 的东西),因为即使是不使用名称字段的测试在设置过程中也调用了setName(),现在需要更改它们。

与使用夹具相比,测试所需的User 类都在一个夹具中创建。进行重大更改后,您更新夹具(在一个地方/类)以正确设置Users,并再次运行您的测试。现在,您得到的唯一失败应该直接与更改相关(即使用getName() 的测试,并且不关心name 字段的所有其他测试正常进行。

因此,在可能的情况下,最好使用固定装置进行复杂的功能测试,但如果您的特定架构/测试需求使其非常不方便,您可以在测试中手动设置实体,但我会尽量避免这样做所以除非你真的需要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    • 2011-05-14
    • 2018-04-25
    • 2012-09-24
    • 2011-02-20
    • 2020-02-17
    • 1970-01-01
    相关资源
    最近更新 更多