我应该测试什么?

时间:2014-12-13 13:42:07

标签: unit-testing symfony

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

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

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

另外,测试在数据库中创建的混乱怎么样?有没有办法在测试后将数据库恢复到以前的状态?

很抱歉有多个问题,但这整个单元测试的主题对我来说真是一团糟。

非常感谢!

2 个答案:

答案 0 :(得分:2)

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

单元测试

这些测试应测试程序中的最小单位:函数(在SF2中的类中)。单元测试应该很快,因此它们可以在不使用数据库或渲染任何内容的情况下测试业务逻辑。

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

功能测试

大多数Web应用程序都是从前端而不是后端构建的。我的意思是它有大枝模板和几行控制器和数据库查询。您无法使用单元测试对其进行测试,但您希望确保某些元素出现在浏览器中。

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

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

<强>结论

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

答案 1 :(得分: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官方文档。