Symfony2测试:为什么我应该使用fixture而不是直接在测试中管理数据?

时间:2015-02-24 15:26:53

标签: symfony testing functional-testing fixtures

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

创建一个适合我所有测试的强大的Fixture类库似乎相当令人生畏和不切实际。我正在使用LiipFunctionalTestBundle所以我只加载我需要的灯具,但它只会让事情变得更容易。

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

我真的很想在我需要的时候按需创建每个测试所需的数据。我不想用任何数据污染数据库我不需要这可能是使用灯具的副作用。

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

对于我无法预见的任何理由,这是一个可怕的决定吗?这似乎是一个非常大的问题,并且使编写测试成为一种痛苦。

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

1 个答案:

答案 0 :(得分:3)

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

一个简单的例子:

假设您有一个User课程,其中您有一个必填字段name,您提供了getName()setName()。你编写没有灯具的功能测试(每个测试根据需要创建User),一切都很好。

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

与使用夹具相比,其中测试所需的User类都在一个夹具中创建。在进行更改后,更新夹具(在一个位置/类中)以正确设置User,然后再次运行测试。现在唯一的失败应该是直接与变更相关(即使用getName()进行测试的测试,以及其他不关心{{1}的测试}字段正常进行。

出于这个原因,在可能的情况下使用夹具进行复杂的功能测试是非常优选的,但是如果您的特定架构/测试需求使其非常不方便,您可以在测试中手动设置实体,但是我可以尽力避免这样做,除非你真正需要。