gpt4 book ai didi

Symfony2 测试 : Why should I use fixtures instead of managing data directly in test?

转载 作者:行者123 更新时间:2023-11-28 20:06:01 24 4
gpt4 key购买 nike

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

创建适合我所有测试的稳健的 Fixture 类库似乎非常艰巨且不切实际。我正在使用 LiipFunctionalTestBundle所以我只加载我需要的 Fixtures,但这只会让事情稍微简单一些。

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

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

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

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

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

最佳答案

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

一个简单的例子:

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

一段时间后,您决定您确实需要 firstnamelastname字段而不仅仅是 name .您自然会更改模式并替换 getName/setName使用新的 get 和 set 方法,然后继续运行您的测试。测试到处都失败(任何设置 User 的地方),因为即使不使用 name 字段的测试也调用了 setName()在设置过程中,现在需要更改它们。

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

因此,最好尽可能使用 fixture 进行复杂的功能测试,但如果您的特定模式/测试需要真的很不方便,您可以在测试中手动设置实体,但我会尽力避免这样做所以除了你真正需要的地方。

关于Symfony2 测试 : Why should I use fixtures instead of managing data directly in test?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28699713/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com