我正在尝试为我的grails应用程序添加单元测试和集成测试,但是我在如何区分这两者以及何时使用单元或集成来测试我的控制器操作和服务方面遇到了一些麻烦。
我在网上找到的教程不是很干净。我无法找到完整的示例来跟进。
您能否分享有用的主题?
答案 0 :(得分:0)
集成测试的一个问题是它们的速度。对我来说,集成测试需要15秒以上才能启动。在那段时间里,某些事情确实无法成为焦点。
我更喜欢使用不超过2秒开始的单元测试,并且可以在15秒内运行几次。
单元测试的另一个论点是它们会强制您解耦代码。集成测试总是诱使您只依赖于现有和初始化的其他组件。
重要链接: http://spockframework.org/spock/docs/1.0/interaction_based_testing.html http://docs.grails.org/latest/guide/testing.html
答案 1 :(得分:0)
不幸的是,这不仅仅是一个偏好或速度。这是一个很大的主题,但我可以根据自己的经验给你一些建议。
如果您希望通过使用单元测试来覆盖数据库访问代码(查询,事务行为),那么您就是在欺骗自己。您正在测试查询如何符合GORM的内存实现。不是休眠,不是你的数据库。
我通常有两种类型的测试。单元和功能测试。功能测试将执行完整测试,针对真实数据库运行,并像用户那样刺激系统(如果它是通过Geb的网站,如果它是REST API,则通过REST客户端)。
功能测试将首先通过执行某种夹具代码来设置启动状态。例如,这可以是注册用户并将其登录。然后运行测试,然后检查后置条件。在这里,您可以通过GORM API访问数据库,或使用生产API调用(覆盖其他错误的bug的危险)来检查后置条件。 有时,您的系统将与第三个系统进行交互。在这里,如果可以,您可以通过将模拟实现注入到被测系统中来模拟第三个系统的实现。 您还有像Spring Cloud Contract这样的工具,它们允许您为被测系统创建一个模拟服务器,以及第三方系统的规范。见https://cloud.spring.io/spring-cloud-contract/spring-cloud-contract.html
单元测试,我用来彻底测试给定类的所有执行路径。我将尝试触发所有异常状态,所有次要方案,以确保所有内容都被覆盖。我不认为通过使用功能测试或集成测试获得100%的覆盖率是切合实际的。
答案 2 :(得分:0)
我遵循以下准则:
尝试尽可能多地编写单元测试。它们可以为控制器,服务,域类或任何其他groovy类编写。这个想法是单元测试是开发人员的朋友。写足够的单元测试会 确保开发人员犯错误。当他们执行 很快,这意味着快速验证。但单元测试不能测试以下内容:
集成测试需要更长时间才能执行。编写集成测试通常需要引导数据。但它们确实有助于端到端地测试功能(不包括通过UI进行功能测试的实际用户交互)。因此,可以编写集成测试: