Rails测试《九》集成测试integration test

简介:

开场白

今天我们来熟悉一下rails的集成测试integration test。

 

简介

集成测试主要是测试多个controller之间的交互,以及测试应用中比较重要的工作流程,验证这些工作流程是否符合预期的设想。

 

不像单元测试和功能测试,是自动添加的。集成测试是需要我们手动添加的,rails提供了一个命令

rails generate integration_test

通过命令就可以在test/integration文件夹创建集成测试。

 
  1. $ rails generate integration_test user_flows 
  2.       exists  test/integration/ 
  3.       create  test/integration/user_flows_test.rb 

 

我们先来了解一些集成测试中常用的帮助方法。

 

 
  1. https? 

如果session正在模拟https请求,就返回true。

 

 
  1. https! 

允许你模拟https请求。

 

 
  1. host! 

允许你在下一次的请求中设置host name。

 

 
  1. redirect? 

如果上一次请求是一个跳转,就返回true。

 

 
  1. follow_redirect! 

紧跟着一个跳转的响应

 

 
  1. request_via_redirect(http_method, path, [parameters], [headers]) 

向指定的path发送http请求,可选parameters,可选headers,然后跟着一个跳转。

 

 
  1. post_via_redirect(path, [parameters], [headers]) 

向指定的path发送post请求,可选parameters,可选headers,然后跟着一个跳转。

 

 
  1. get_via_redirect(path, [parameters], [headers]) 

向指定的path发送get请求,可选parameters,可选headers,然后跟着一个跳转。

 

 
  1. put_via_redirect(path, [parameters], [headers]) 

向指定的path发送put请求,可选parameters,可选headers,然后跟着一个跳转。

 

 
  1. delete_via_redirect(path, [parameters], [headers]) 

向指定的path发送delete请求,可选parameters,可选headers,然后跟着一个跳转。

 

 
  1. open_session 

开启一个新的session

 

 

示例

让我们在创建好的集成测试文件test/integration/user_flows_test.rb中添加一些代码。

 

 
  1. require 'test_helper' 
  2.  
  3. class UserFlowsTest < ActionDispatch::IntegrationTest 
  4.   include FactoryGirl::Syntax::Methods 
  5.  
  6.   def test_admin_login_and_browse_posts 
  7.     user = FactoryGirl.create(:user_valid
  8.  
  9.     get "/signin" 
  10.     assert_response(200) 
  11.  
  12.     post_via_redirect("sessions", {:user=>{:email=> user.email, :password => user.password}}) 
  13.     assert_equal "/", path 
  14.     assert_equal "sign in successfully", flash[:notice
  15.  
  16.     get "admin/posts" 
  17.     assert_response(200) 
  18.     assert assigns(:posts
  19.    
  20.   end 
  21.  
  22. end 

上面的代码中,我们先是在users表中添加了一条记录。然后访问signin,然后断言是否返回200.

然后向sessions提交刚才添加的用户邮箱和密码,sessionscontroller是负责验证用户信息的controller。然后断言是否跳转到了根目录,是否出现了正确的flash提示信息。

最后访问admin/posts,断言是否返回200,并且返回posts变量。

 

上面的测试涉及了多个controller,测试覆盖从数据库到controller的调度分配。

 

我们可以同时模拟多个session,并且用extend扩展这些session,创建一些强大的测试用的DSL(Domain-Specific Language 领域描述语言)。

我们把上面的测试改成下面的样子。

 
  1. require 'test_helper' 
  2.  
  3. class UserFlowsTest < ActionDispatch::IntegrationTest 
  4.   include FactoryGirl::Syntax::Methods 
  5.  
  6.   def test_admin_login_and_browse_posts 
  7.     user = FactoryGirl.create(:user_valid
  8.     guest = FactoryGirl.create(:user_valid_too
  9.   
  10.     user_session = signin(user) 
  11.     guest_session = signin(guest) 
  12.  
  13.     assert_equal("sign in successfully", user_session.flash[:notice]) 
  14.     assert_equal("sign in successfully", guest_session.flash[:notice]) 
  15.  
  16.     user_session.browse_site 
  17.     guest_session.browse_site 
  18.    
  19.   end 
  20.  
  21.   private 
  22.  
  23.   module CustomDSL 
  24.     def browse_site 
  25.       get "admin/posts" 
  26.       assert_response(200) 
  27.       assert assigns(:posts
  28.     end 
  29.   end 
  30.  
  31.   def signin(user) 
  32.     open_session do |sess| 
  33.       sess.extend(CustomDSL) 
  34.       sess.post_via_redirect("sessions", {:user => {:email => user.email, :password => user.password}}) 
  35.        
  36.     end 
  37.   end 
  38.  
  39. end 

 

什么是DSL(领域描述语言)呢?

我理解就是业务描述语言。我们的应用一般是面向一个行业,或者说面向一个领域的,业务的语言就是领域描述语言。

 

如果能用这个领域的业务语言描述测试过程,那么这个测试就更加贴近业务,具有了很强的沟通能力。也就是说这个测试可以拿来和业务进行沟通,看看是不是他们想要的业务过程。

 

 




本文转自 virusswb 51CTO博客,原文链接:http://blog.51cto.com/virusswb/1079120,如需转载请自行联系原作者

目录
相关文章
|
7天前
|
敏捷开发 Devops 测试技术
探索自动化测试在持续集成中的关键作用
【5月更文挑战第29天】 本文深入探讨了自动化测试在现代软件开发实践中,尤其是在持续集成(CI)环境中的重要性和影响。通过分析自动化测试的核心优势,我们揭示了其在提高软件交付速度、降低人工成本以及提升产品质量方面所发挥的至关重要的作用。文章不仅强调了自动化测试在持续集成流程中不可或缺的地位,还提出了实施高效自动化测试策略的关键因素。
|
9天前
|
敏捷开发 人工智能 数据管理
探索自动化测试在持续集成环境中的应用与挑战
【5月更文挑战第27天】随着敏捷开发和持续集成(CI)的普及,自动化测试已成为确保软件质量和加速交付的关键工具。本文将深入探讨自动化测试在持续集成环境中的实施策略、面临的挑战以及优化实践。通过分析自动化测试框架的选择、脚本维护、数据管理等关键要素,旨在为读者提供一种系统化的视角,以理解和改进其自动化测试流程。同时,文章还将分享一些前沿的测试自动化趋势,包括人工智能(AI)在测试用例生成和执行中的潜在应用。
|
5天前
|
敏捷开发 Devops 测试技术
探索软件测试中的自动化与持续集成
【5月更文挑战第31天】在软件开发的生命周期中,测试是确保产品质量和用户体验的关键环节。随着敏捷开发和DevOps实践的普及,自动化测试和持续集成(CI)已成为提升效率和质量的重要工具。本文将探讨自动化测试的策略、工具选择以及如何有效地整合到持续集成流程中,以实现更快的迭代和更高的部署频率。
|
6天前
|
敏捷开发 监控 测试技术
探索自动化测试在持续集成中的关键角色
【5月更文挑战第30天】 随着敏捷开发和持续集成(CI)的普及,软件测试领域面临着提升效率和质量的双重挑战。本文将深入探讨自动化测试作为持续集成不可或缺组成部分的重要性,分析其在缩短反馈周期、提高测试覆盖率以及确保产品质量方面所发挥的关键作用。通过实例分析与最新行业趋势的结合,我们将展示如何有效整合自动化测试到CI流程中,并讨论面临的挑战及应对策略。
|
6天前
|
人工智能 自然语言处理 安全
构建未来:AI驱动的自适应网络安全防御系统提升软件测试效率:自动化与持续集成的实践之路
【5月更文挑战第30天】 在数字化时代,网络安全已成为维护信息完整性、保障用户隐私和企业持续运营的关键。传统的安全防御手段,如防火墙和入侵检测系统,面对日益复杂的网络攻击已显得力不从心。本文提出了一种基于人工智能(AI)技术的自适应网络安全防御系统,该系统能够实时分析网络流量,自动识别潜在威胁,并动态调整防御策略以应对未知攻击。通过深度学习算法和自然语言处理技术的结合,系统不仅能够提高检测速度和准确性,还能自主学习和适应新型攻击模式,从而显著提升网络安全防御的效率和智能化水平。 【5月更文挑战第30天】 在快速迭代的软件开发周期中,传统的手动测试方法已不再适应现代高效交付的要求。本文探讨了如
|
6天前
|
敏捷开发 机器学习/深度学习 监控
探索自动化测试在持续集成中的应用与挑战
【5月更文挑战第30天】 随着敏捷开发和持续集成(CI)实践的日益普及,自动化测试已成为确保软件质量和加速交付的关键工具。本文旨在分析自动化测试在持续集成环境中的作用,探讨其带来的优势及面临的挑战,并提出了相应的应对策略。通过实际案例分析和最新技术趋势的梳理,文章为软件开发团队如何高效实施自动化测试提供了参考和指导。
|
6天前
|
Dart 前端开发 测试技术
移动应用开发的未来:跨平台框架与原生系统的融合深入理解软件测试中的持续集成与持续部署(CI/CD)
【5月更文挑战第30天】 在本文中,我们将深入探讨移动应用开发领域的最新趋势:跨平台开发框架与原生操作系统的融合。随着移动设备成为日常生活的核心,高效、灵活且性能卓越的应用程序需求日益增长。文章分析了当前主流的跨平台工具如React Native和Flutter,并探讨了它们如何与iOS和Android等原生系统相互作用,以及这种融合对开发者、用户和整个移动生态系统意味着什么。我们还将预测未来可能的技术发展,并提出相应的策略建议。
|
7天前
|
敏捷开发 运维 监控
探索自动化测试在持续集成中的应用与挑战
【5月更文挑战第29天】 随着敏捷开发和持续集成(CI)实践的普及,自动化测试已成为确保软件质量和加快交付速度的关键因素。本文将探讨自动化测试在持续集成流程中的实施策略、面临的挑战以及解决方案。通过分析自动化测试的优势和局限,我们旨在为软件开发团队提供实用的指导和最佳实践,帮助他们在不断变化的技术环境中维持高效和稳定的软件发布周期。
|
7天前
|
敏捷开发 监控 Devops
深入理解与实施软件测试中的持续集成策略
【5月更文挑战第29天】 在快速迭代的软件开发过程中,持续集成(CI)策略是确保产品质量和加速市场交付的关键实践。本文将探讨持续集成在软件测试中的应用,分析其对提高测试效率、降低缺陷率以及优化资源分配的影响,并讨论如何在现有的测试框架中有效地实施CI策略。通过案例分析和最佳实践分享,旨在为读者提供一套系统的方法论,以便更好地融入现代敏捷开发流程,实现软件测试工作的自动化和高效化。
|
7天前
|
监控 测试技术 持续交付
探索自动化测试在持续集成中的关键作用
【5月更文挑战第29天】 随着软件开发周期的加速和市场对质量要求的不断提高,持续集成(CI)已成为现代软件开发不可或缺的实践之一。本文聚焦于自动化测试在持续集成环境中的核心地位,分析其在维护软件质量和加速反馈循环中的双重作用。通过深入探讨自动化测试的最佳实践、工具选择以及面临的挑战,旨在为读者提供一套实现高效自动化测试的策略框架。