2015-02-24 47 views
2

我正在为Symfony中的API编写一些功能测试,这些测试依赖于数据库中的数据。看起来这样做的普遍接受的方法是使用Fixtures并在测试之前加载灯具。Symfony2测试:为什么我应该使用灯具而不是直接在测试中管理数据?

创建一个适合我所有测试的强大的Fixture类库似乎是相当艰巨和不切实际的。我使用的是LiipFunctionalTestBundle,所以我只加载我需要的灯具,但它只是让事情稍微容易一些。

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

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

我的解决办法是use the container以访问主义和运行断言之前设置我的对象在每个测试。

由于我无法预见的任何原因,这是一个可怕的决定吗?这似乎是一个相当大的问题,正在让写作测试变得很痛苦。

另一种尝试和使用this port of Factory Girl for PHP的可能性,但它似乎并没有很大的追随,即使Factory Girl在Ruby社区被广泛用于解决这个相同的问题。

+0

你的方法没有问题。去适合你的东西吧。如果开始遇到@AlpineCoder指出的一些问题,那么很容易就可以转换。 – Cerad 2015-02-24 17:02:33

+0

嗨@布莱恩你已经看到[这](http://stackoverflow.com/questions/28584393/independent-functional-tests-with-liipfunctionaltestbundle-and-fixtures/28585103#28585103)?你在想什么? – Matteo 2015-02-25 06:42:04

+0

@Matteo我不是那种方法的忠实粉丝。创建所有这些类有很多开销。我真的很喜欢对每个特定测试用例的实体属性进行更细粒度的控制。 – Brian 2015-02-25 13:42:56

回答

2

的最大原因支架,一个地方测试数据(而不是根据需要在每个测试)的是,它可以让你从公元前破架构更改为仅由变化直接影响测试隔离测试失败。

一个简单的例子:

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

某段时间,您决定实际上需要firstnamelastname字段,而不仅仅是name。当然你可以改变模式,并用新的获取和设置方法替换getName/setName,然后继续并运行测试。测试在所有地方都失败(任何设置User的东西),因为甚至在设置期间甚至不使用名称字段的测试都称为setName(),现在它们需要更改。

比较使用夹具,在需要的地方进行测试User类都在一个固定装置创建。完成改变后,您需要更新灯具(在一个地方/课程中)以正确设置User,然后再次运行测试。现在,你得到的唯一的失败应该是直接的改变有关使用getName()的东西(即测试,和所有其他的测试,不关心name场正​​常进行。

由于这个原因,如果可能的话,最好使用灯具进行复杂的功能测试,但是如果您的特定模式/测试需要真的很不方便,您可以在测试中手动设置实体,但我会尽我所能避免除非你真的需要这样做。