Ruby on rails 集成测试应该包含多少内容?在哪里测试副作用?

Ruby on rails 集成测试应该包含多少内容?在哪里测试副作用?,ruby-on-rails,rspec,cucumber,integration-testing,acceptance-testing,Ruby On Rails,Rspec,Cucumber,Integration Testing,Acceptance Testing,假设我有一个功能要求,当用户成功注册付费帐户时,会发生以下几种情况: 用户的帐户已创建 用户的信用卡将被记账,从而生成新的交易记录 收据通过电子邮件发送给用户 我见过的大多数rspec集成或cucumber测试都只关注屏幕上显示的内容,例如expect(第页)。要有文本(X)或,我应该看到X 集成测试应该覆盖多少 集成测试是否应该检查 是否创建了帐户记录 是否创建了一个事务 交易金额是否正确 收据邮件已经发送了吗 为什么?如果没有,这些类型的副作用应该在哪里/如何进行测试?如果由外而内开发,

假设我有一个功能要求,当用户成功注册付费帐户时,会发生以下几种情况:

  • 用户的帐户已创建
  • 用户的信用卡将被记账,从而生成新的交易记录
  • 收据通过电子邮件发送给用户
  • 我见过的大多数rspec集成或cucumber测试都只关注屏幕上显示的内容,例如
    expect(第页)。要有文本(X)
    ,我应该看到X

    集成测试应该覆盖多少

    集成测试是否应该检查

    • 是否创建了帐户记录
    • 是否创建了一个事务
    • 交易金额是否正确
    • 收据邮件已经发送了吗

    为什么?如果没有,这些类型的副作用应该在哪里/如何进行测试?

    如果由外而内开发,则大多数集成测试将是验收测试。这些是关于用户所看到的,因此他们从外部与系统交互。他们不会查看数据库,也不会走到幕后。他们不需要这样做:如果有理由在数据库中保存某些内容,如果它出现在屏幕上,我们就会知道它是否有效。他们确实需要测试是否发送了电子邮件或是否在第三方信用卡处理系统中创建了帐户,因为这些都是用户看到的内容的一部分

    在实现了所有验收测试之后,您可能会以工程师的身份看待系统,并确定系统中的类如何相互交互或与外部系统交互的某些方面没有得到充分的测试。首先,确定它们是否在告诉您验收测试中应该包含的需求(通常是这样),如果是,则改进验收测试

    您可能仍然觉得需要编写更多不是验收测试的集成测试,并且它们可能需要直接查看数据库或其他内容。根据我的经验,这些人是少数

    这就是说,有时在场景中间停止验收测试并只测试副作用是有实际意义的,因为另一个验收测试已经描述了场景的其余部分。(例如,可能有18种不同的方法在你的应用程序中创建一个帐户。可能在中间场景中,它们都会在数据库中产生相同的帐户。)同样,你可能希望伪造一些数据库状态,并在中间场景中开始,以避免重复;使用用户登录进行此操作很常见


    在应用程序实现所有验收测试并具有良好的集成覆盖率之后,使用单元测试测试细节,单元测试会测试副作用。但是,如果您的验收/集成测试已经对给定的代码进行了充分的测试,那么它就不需要单元测试,而且它的副作用可能永远也不会被直接测试——这很好。

    感谢您提供了全面的答案。要测试副作用,您是否建议导航到用户可见的位置并验证它是否存在?e、 g.在注册时处理付款后,导航到付款历史页面并查找付款?当它是一个外部服务时,你如何处理它——比如我在twitter上发帖;我的验收测试如何验证推特确实发布了?这样做的效果在产品中对用户来说是“可见”的,但我的测试不会真正发布到twitter上——它会被模拟出来。对于应用程序内部的副作用,正是您所说的。外部服务更加困难,技术也多种多样。举几个例子:Rails有一个邮件测试模式,它不发送邮件,但允许您检查邮件是否已发送。我最近使用的信用卡处理系统有一个测试服务器,可以对其运行集成测试。对于像Twitter这样的东西,你可以在真正的服务上使用一个测试帐户。有时没有好的方法来做,即使在集成测试中,您也必须进行存根或模拟。