Rails测试《七》实战功能测试functional test

简介:

之前我们介绍过,rails的功能测试针对的是controller,测试controller的action是否正确的执行。

测试的内容主要是:

  • 测试请求是否正确。
  • 测试用户是否跳转到正确的页面。
  • 测试用户是否验证成功。
  • 测试响应中是否包含了正确的对象。
  • 测试在view中是否给用户显示了适当的信息。

 

常用的断言函数

1.assert_response(type, message = nil

断言响应是否成功,是否是指定的状态码。

assert_response :success代表200,assert_response :redirect代表300-399,assert_response :missing代表404,assert_response :error代表500-599。

assert_response :success

assert_response(200)

 

 

2.assert_redirected_to(options = {}, message=nil

验证跳转是否正确,是否跳转到指定的controller的action。

assert_redirected_to(:controller => "posts", :action => "index")

assert_redirected_to(:controller => "posts", :action => "show")

 

3.assert_template(expected = nil, message=nil

断言请求是否呈现了正确的页面。

 

assert_template "new"
是否呈现了new页面。 assert_template :partial = > '_customer', :locals = > { :customer = > @customer } 是否呈现了customer这个partial,并且加载了变量@customer
assert_template :partial => false 是否没有呈现任何的partial。

 

4.assert_tag  

断言响应的body中是否了指定条件的tag标签。

assert_tag :tag => "div", :attributes => { :id => "div-header" }验证响应的body中是否包含id=d"iv-header"的div标签。

 

5.assert_no_tag

和assert_tag相反,断言响应的body中是否不包含指定条件的tag。

 

6.assert_routing

断言route映射是否正确。

 

 
  1. def test_should_route_from_signout_to_destroy 
  2.     
  3.   assert_routing( {:path =>"signout", :method => :delete} , {:controller =>"sessions", :action =>"destroy", :method => :delete} )
  4.   
  5.  end 
  6.   

 

7.assert_select

断言view中的tag。

assert_select "form"

assert_select "title", "Welcome to my site!"

 

 

示例

我们还是拿我的blog项目做示例。

下面是针对sessionscontroller的new这个action的两个简单测试,测试这个action是否返回成功,并且加载了变量user。

 
  1. require 'test_helper' 
  2.  
  3. class SessionsControllerTest < ActionController::TestCase 
  4.   include FactoryGirl::Syntax::Methods  
  5.   def test_should_be_get_new 
  6.     get :new 
  7.     assert_response :success 
  8.     assert_not_nil assigns(@user
  9.   end 
  10.  
  11.   def test_should_be_get_new_status_code 
  12.     get :new 
  13.     assert_response(200)
  14.     assert_not_nil assigns(:user
  15.   end 
  16.  
  17.    
  18. end 

 

再来一个post的,这次我们测试signin这个过程,我们传入不存在的email和password,然后看看结果是不是我们想要的,因为不匹配,所以界面还是new template,同时输出flash信息。

 
  1. def test_should_be_render_new_template_after_email_do_not_match_password 
  2.   post :create,{:user=>{:email=>"",:password=>""}} 
  3.   assert_template :new 
  4. assert_equal("email and password do not match" , flash[:notice] )
  5. end 

 

再来添加一个用户验证成功的测试,看看成功之后是否符合我们的定义。验证flash信息,验证@controller的current_user是否可以获取到用户信息,@controller变量的signed_in?方法返回是否正确,正确登录之后应该返回true。

 
  1. def test_should_be_200_after_signin_success 
  2.     user = FactoryGirl.create(:user_valid
  3.  
  4.     post :create ,{:user=> {:email=>user.email,:password=>user.password}} 
  5.   
  6.     assert_equal( "sign in successfully", flash[:notice]
  7.     assert_not_nil @controller.current_user 
  8.     assert @controller.signed_in? 
  9.  
  10.  end 

 

再来添加一个针对userscontroller的测试,测试用户注册过程。

 
  1. require 'test_helper' 
  2.  
  3. class UsersControllerTest < ActionController::TestCase 
  4.   include FactoryGirl::Syntax::Methods 
  5.  
  6.   def test_should_be_200 
  7.     get :new 
  8.     assert_response(200) 
  9.   end 
  10.  
  11.   def test_should_be_stay_new_template_when_you_submit_invalid_signup_user 
  12.     user=FactoryGirl.build(:user_invalid_without_email
  13.     post :create, user 
  14.      
  15.     assert_template :new 
  16.     assert_equal "sign up failed!", flash[:notice
  17.   end 
  18.  
  19.   def test_should_be_successful_when_you_submit_valid_signup_user 
  20.  
  21.  
  22.     user =FactoryGirl.build(:user_valid
  23.     post :create, {:user=>{:email=>user.email,:nickname=>user.nickname, 
  24.                            :password=>user.password, 
  25.                            :password_confirmation => user.password_confirmation}} 
  26.     assert_equal  "sign up successfully!",flash[:notice
  27.     assert @controller.signed_in? 
  28.  
  29.   end 
  30.  
  31. end 

 

如果我们想要测试view中的tag是否和我们预期的相同,可以使用assert_select。

 
  1. def test_should_have_form_in_the_signin_page 
  2.     get :new 
  3.     assert_select "form" 
  4.     assert_select "h1""Sign up" 
  5.     assert_select "title""Sign up | Blog" 
  6.   end 

 




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

目录
相关文章
|
27天前
|
测试技术 持续交付 UED
软件测试的艺术:确保质量的实战策略
在软件开发的舞台上,测试是那把确保每个功能如交响乐般和谐奏响的指挥棒。本文将深入探讨软件测试的重要性、基本类型以及如何设计高效的测试策略。我们将通过一个实际的代码示例,展示如何运用这些策略来提升软件质量和用户体验。
|
1月前
|
JSON Java 测试技术
SpringCloud2023实战之接口服务测试工具SpringBootTest
SpringBootTest同时集成了JUnit Jupiter、AssertJ、Hamcrest测试辅助库,使得更容易编写但愿测试代码。
60 3
|
1月前
|
缓存 测试技术 Apache
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
52 1
|
1月前
|
前端开发 数据管理 测试技术
前端自动化测试:Jest与Cypress的实战应用与最佳实践
【10月更文挑战第27天】本文介绍了前端自动化测试中Jest和Cypress的实战应用与最佳实践。Jest适合React应用的单元测试和快照测试,Cypress则擅长端到端测试,模拟用户交互。通过结合使用这两种工具,可以有效提升代码质量和开发效率。最佳实践包括单元测试与集成测试结合、快照测试、并行执行、代码覆盖率分析、测试环境管理和测试数据管理。
57 2
|
1月前
|
前端开发 JavaScript 数据可视化
前端自动化测试:Jest与Cypress的实战应用与最佳实践
【10月更文挑战第26天】前端自动化测试在现代软件开发中至关重要,Jest和Cypress分别是单元测试和端到端测试的流行工具。本文通过解答一系列问题,介绍Jest与Cypress的实战应用与最佳实践,帮助开发者提高测试效率和代码质量。
42 2
|
2月前
|
机器学习/深度学习 监控 计算机视觉
目标检测实战(八): 使用YOLOv7完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
本文介绍了如何使用YOLOv7进行目标检测,包括环境搭建、数据集准备、模型训练、验证、测试以及常见错误的解决方法。YOLOv7以其高效性能和准确率在目标检测领域受到关注,适用于自动驾驶、安防监控等场景。文中提供了源码和论文链接,以及详细的步骤说明,适合深度学习实践者参考。
521 0
目标检测实战(八): 使用YOLOv7完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
|
2月前
|
机器学习/深度学习 XML 并行计算
目标检测实战(七): 使用YOLOX完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
这篇文章介绍了如何使用YOLOX完成图像目标检测任务的完整流程,包括数据准备、模型训练、验证和测试。
229 0
目标检测实战(七): 使用YOLOX完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
|
1天前
|
监控 JavaScript 测试技术
postman接口测试工具详解
Postman是一个功能强大且易于使用的API测试工具。通过详细的介绍和实际示例,本文展示了Postman在API测试中的各种应用。无论是简单的请求发送,还是复杂的自动化测试和持续集成,Postman都提供了丰富的功能来满足用户的需求。希望本文能帮助您更好地理解和使用Postman,提高API测试的效率和质量。
23 11
|
2月前
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
74 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
|
3月前
|
移动开发 JSON Java
Jmeter实现WebSocket协议的接口测试方法
WebSocket协议是HTML5的一种新协议,实现了浏览器与服务器之间的全双工通信。通过简单的握手动作,双方可直接传输数据。其优势包括极小的头部开销和服务器推送功能。使用JMeter进行WebSocket接口和性能测试时,需安装特定插件并配置相关参数,如服务器地址、端口号等,还可通过CSV文件实现参数化,以满足不同测试需求。
260 7
Jmeter实现WebSocket协议的接口测试方法