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

目录
相关文章
|
15天前
|
存储 关系型数据库 测试技术
玩转n8n测试自动化:核心节点详解与测试实战指南
n8n中节点是自动化测试的核心,涵盖触发器、数据操作、逻辑控制和工具节点。通过组合节点,测试工程师可构建高效、智能的测试流程,提升测试自动化能力。
|
2月前
|
Web App开发 人工智能 JavaScript
主流自动化测试框架的技术解析与实战指南
本内容深入解析主流测试框架Playwright、Selenium与Cypress的核心架构与适用场景,对比其在SPA测试、CI/CD、跨浏览器兼容性等方面的表现。同时探讨Playwright在AI增强测试、录制回放、企业部署等领域的实战优势,以及Selenium在老旧系统和IE兼容性中的坚守场景。结合六大典型场景,提供技术选型决策指南,并展望AI赋能下的未来测试体系。
|
2月前
|
存储 人工智能 算法
AI测试平台实战:深入解析自动化评分和多模型对比评测
在AI技术迅猛发展的今天,测试工程师面临着如何高效评估大模型性能的全新挑战。本文将深入探讨AI测试平台中自动化评分与多模型对比评测的关键技术与实践方法,为测试工程师提供可落地的解决方案。
|
2月前
|
人工智能 缓存 测试技术
Playwright进阶指南 (6) | 自动化测试实战
2025企业级测试解决方案全面解析:从单元测试到千级并发,构建高可用测试体系。结合Playwright智能工具,解决传统测试维护成本高、环境依赖强、执行效率低等痛点,提升测试成功率,内容从测试架构设计、电商系统实战框架、高级测试策略、Docker化部署、CI/CD集成及AI测试应用,助力测试工程师掌握前沿技术,打造高效稳定的测试流程。
Playwright进阶指南 (6) | 自动化测试实战
|
20天前
|
人工智能 数据可视化 测试技术
AI 时代 API 自动化测试实战:Postman 断言的核心技巧与实战应用
AI 时代 API 自动化测试实战:Postman 断言的核心技巧与实战应用
264 11
|
2月前
|
资源调度 前端开发 JavaScript
Jest 测试实战指南
本文系统讲解如何使用 Jest 进行高效的 JavaScript 函数测试,涵盖环境搭建、测试用例编写、模拟函数与快照测试等内容,帮助开发者提升代码质量与测试效率。
|
2月前
|
人工智能 缓存 监控
大模型性能测试实战指南:从原理到落地的全链路解析
本文系统解析大模型性能测试的核心方法,涵盖流式响应原理、五大关键指标(首Token延迟、吐字率等)及测试策略,提供基于Locust的压测实战方案,并深入性能瓶颈分析与优化技巧。针对多模态新挑战,探讨混合输入测试与资源优化
|
4月前
|
Java 测试技术 容器
Jmeter工具使用:HTTP接口性能测试实战
希望这篇文章能够帮助你初步理解如何使用JMeter进行HTTP接口性能测试,有兴趣的话,你可以研究更多关于JMeter的内容。记住,只有理解并掌握了这些工具,你才能充分利用它们发挥其应有的价值。+
747 23
|
9月前
|
数据可视化 前端开发 测试技术
接口测试新选择:Postman替代方案全解析
在软件开发中,接口测试工具至关重要。Postman长期占据主导地位,但随着国产工具的崛起,越来越多开发者转向更适合中国市场的替代方案——Apifox。它不仅支持中英文切换、完全免费不限人数,还具备强大的可视化操作、自动生成文档和API调试功能,极大简化了开发流程。
|
6月前
|
SQL 安全 测试技术
2025接口测试全攻略:高并发、安全防护与六大工具实战指南
本文探讨高并发稳定性验证、安全防护实战及六大工具(Postman、RunnerGo、Apipost、JMeter、SoapUI、Fiddler)选型指南,助力构建未来接口测试体系。接口测试旨在验证数据传输、参数合法性、错误处理能力及性能安全性,其重要性体现在早期发现问题、保障系统稳定和支撑持续集成。常用方法包括功能、性能、安全性及兼容性测试,典型场景涵盖前后端分离开发、第三方服务集成与数据一致性检查。选择合适的工具需综合考虑需求与团队协作等因素。
705 24