2014-12-13 120 views
3

所以我开始在我的应用程序的symfony 2中编写功能和单元测试。我应该怎样测试?我应该测试什么?

我将功能与单元测试分开。功能测试仅适用于控制器,其余单元测试。通过功能测试,我测试用户在我的应用程序中可以使用的所有场景的HTML输出。但它够了吗?我只测试响应/请求,而不是控制器中的代码本身,没有数据库查询等。

单元测试...我应该用它测试控制器吗?另外,如何测试存储库?我应该测试每个查询的输出吗?如果数据库缺少记录怎么办?

另外,测试在数据库中创建的混乱如何?有没有办法在测试之后恢复数据库到之前的状态?

对不起有多个问题,但是这整个单元测试题目对我来说真的是一团糟。

非常感谢!

回答

2

让我们分开两个:单元测试和功能测试。

单元测试

这些测试应该测试在你的程序的最小单位:功能(这是在班SF2)。单元测试应该很快,所以它们不用数据库或渲染任何东西就可以测试你的业务逻辑

您可以通过模仿依赖注入类中的服务来实现此目的。

功能测试

大多数Web应用程序从前端而不是后端建造的。我的意思是它有很大的树枝模板和几行控制器和数据库查询。你不能使用单元测试来测试它,但你想确保某些元素出现在浏览器中。

此外,您要测试一组功能。使用功能测试可以模拟手动测试的几个步骤。例如。加载登录页面,然后填写输入,提交表单,然后可以检查响应消息和身份验证状态。

但功能测试真的很贵。加载单个页面可能需要几秒钟的时间,这意味着在一个中型项目中进行一整套功能测试可能需要几个小时!因此,您不能一起使用TDD(Test Driven Development)和功能测试。

结论

  • 单元测试+业务逻辑可以在TDD中使用,但不能完全测试整个系统和输出。但它只能用于测试业务逻辑。
  • 功能测试+数据夹具可用于系统测试,确保元素出现在渲染页面上并测试完整的过程,但速度非常慢!
+0

如果在'dev'或'test'环境中加载页面需要几秒钟,请尝试将缓存移至[tmpfs](http://en.wikipedia.org/wiki/Tmpfs)或移至[SSD] (http://en.wikipedia.org/wiki/Solid-state_drive),你应该观察到明显的差异。 – 2014-12-13 22:49:41

+0

我不明白为什么TDD和功能测试不兼容。您可以配置phpunit以便一次仅测试一个组,类等。因此,如果您正确配置phpunit,TDD不会花费更多时间。 – 2014-12-13 22:52:15

+0

为了使用功能测试,您必须在每次运行一组测试时擦除数据库。这需要时间。另一个问题恰恰是执行测试的次数。你不执行所有这些,这意味着在重构一些代码之后,你不能确定_everything_是好的,只是它的一部分。使用单元测试你想检查整个代码的错误,因为没有它你不能确定你不会通过重构某些东西来破坏一些代码。 – 2014-12-15 07:35:29

0

另外,如何测试存储库?我应该测试每个查询的输出吗?如果数据库缺少记录怎么办?

我不知道它对你的情况是否有用,但你可以test Doctrine repositories

如果数据库缺少记录该怎么办?

另外,测试在数据库中创建的混乱如何?有没有办法在测试之后恢复数据库到之前的状态?

您可以configure a different database for testing

应用程序/配置/ config_test.yml

doctrine: 
    # ... 
    dbal: 
     host:  localhost 
     dbname: testdb 
     user:  testdb 
     password: testdb 

Symfony2中也有fixtures,这是自动填充数据库的一种方式。

注意:所有链接导致Symfony2官方文档。

相关问题