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,如需转载请自行联系原作者

目录
相关文章
|
29天前
|
敏捷开发 测试技术 持续交付
探索软件测试中的自动化与持续集成
在快速迭代的软件开发环境中,自动化测试和持续集成(CI)已成为确保产品质量和加速交付的关键策略。本文将深入探讨自动化测试的基本原理、实施步骤以及它如何与持续集成流程相结合,以提高软件开发的效率和可靠性。我们将通过实际案例分析,展示自动化测试和CI的最佳实践,以及它们如何帮助企业实现更快的市场响应时间和更高的客户满意度。
56 16
|
1月前
|
jenkins 测试技术 持续交付
软件测试中的自动化与持续集成:提升效率与质量的关键
在快节奏的软件开发环境中,自动化测试和持续集成已经成为不可或缺的部分。本文将探讨自动化测试和持续集成的重要性,以及它们如何协同工作以提高软件开发的效率和质量。通过分析自动化测试的策略、工具选择以及持续集成的实践,我们将揭示这些技术如何帮助开发团队快速响应变化,减少错误,并加速产品上市时间。
|
1月前
|
机器学习/深度学习 人工智能 jenkins
软件测试中的自动化与持续集成实践
在快速迭代的软件开发过程中,自动化测试和持续集成(CI)是确保代码质量和加速产品上市的关键。本文探讨了自动化测试的重要性、常见的自动化测试工具以及如何将自动化测试整合到持续集成流程中,以提高软件测试的效率和可靠性。通过案例分析,展示了自动化测试和持续集成在实际项目中的应用效果,并提供了实施建议。
|
1月前
|
前端开发 JavaScript 测试技术
前端测试技术中,如何提高集成测试的效率?
前端测试技术中,如何提高集成测试的效率?
|
2月前
|
缓存 Devops jenkins
专家视角:构建可维护的测试架构与持续集成
【10月更文挑战第14天】在现代软件开发过程中,构建一个可维护且易于扩展的测试架构对于确保产品质量至关重要。本文将探讨如何设计这样的测试架构,并将单元测试无缝地融入持续集成(CI)流程之中。我们将讨论最佳实践、自动化测试部署、性能优化技巧以及如何管理和扩展日益增长的测试套件规模。
53 3
|
2天前
|
机器学习/深度学习 人工智能 jenkins
探索软件测试中的自动化与持续集成
【10月更文挑战第21天】 在软件开发的生命周期中,软件测试扮演着至关重要的角色。随着技术的进步和开发模式的转变,自动化测试和持续集成已经成为提高软件质量和效率的关键手段。本文将深入探讨自动化测试和持续集成的概念、实施策略以及它们如何相互配合以优化软件开发流程。我们将通过分析实际案例,展示这些技术如何在实际项目中发挥作用,以及面临的挑战和解决方案。此外,文章还将讨论未来趋势,包括人工智能在测试领域的应用前景。
35 17
|
15天前
|
jenkins 测试技术 持续交付
软件测试中的自动化与持续集成
在现代软件开发过程中,自动化测试和持续集成已成为不可或缺的组成部分。本文将深入探讨自动化测试和持续集成的重要性、优势以及如何有效实施它们以提升软件质量和开发效率。通过具体案例分析,我们将展示这些技术如何在实际项目中发挥作用,并讨论其面临的挑战及应对策略。
35 3
|
29天前
|
jenkins 测试技术 持续交付
探索自动化测试在持续集成中的应用与挑战
本文深入探讨了自动化测试在现代软件开发流程,特别是持续集成(CI)环境中的关键作用。通过分析自动化测试的优势、实施策略以及面临的主要挑战,旨在为开发团队提供实用的指导和建议。文章不仅概述了自动化测试的基本原理和最佳实践,还详细讨论了如何克服实施过程中遇到的技术难题和管理障碍,以实现更高效、更可靠的软件交付。
|
20天前
|
监控 jenkins 测试技术
探索软件测试中的自动化与持续集成####
本文旨在探讨软件测试中自动化测试与持续集成(CI)的融合实践,分析其对提升软件开发效率和质量的重要性。通过深入剖析自动化测试的优势、持续集成的核心概念以及两者结合的最佳实践案例,揭示这一技术趋势如何重塑现代软件开发流程。文章还将讨论实施过程中的挑战和应对策略,为读者提供一套实用的方法论指导。 ####
|
1月前
|
敏捷开发 Devops 测试技术
自动化测试中的持续集成与持续部署
在现代软件开发实践中,自动化测试是确保软件质量和快速迭代的关键。本文将探讨自动化测试如何与持续集成(CI)和持续部署(CD)流程相结合,以提高开发效率和软件质量。我们将分析CI/CD管道中自动化测试的最佳实践,以及如何克服实施过程中的挑战。
38 6