我们这里谈到的性能测试包括性能度量和性能优化两部分,此篇主要关注性能的度量。将来会有单独一篇专题来讲述rails web应用程序的性能优化。
为什么要做性能测试
显而易见,对于一个web应用来讲,性能是重中之重。这直接关系到产品上线之后产品能否满足现实环境对性能的需求。而对于一个交付产品而言,客户对性能提出的实实在在的”数据要求“,是性能测试以及优化的目标。
什么时候做性能测试
很多人以为性能测试是项目的最后一步,这其实是不正确的想法。
如果有条件,性能测试应该尽早做,并且持续地做。
尽早做
在项目的早期就建立起对产品性能的标准,这会指导我们在做任何决策的时候都会把性能需求考虑进去。
到最后才做性能测试的代价是很大的,很可能意味着架构设计的巨大改变,而在这时候再来做改变的难度较之早期已经不仅仅是量级的增加。
在最后做一些巨大的改变,也意味着风险的急剧增加,以及其它一些工作量的重新投入,比如功能的重新测试等等。
持续做
性能测试应该持续不断地做。个人觉得,理想中它应该是持续集成的一部分,但又不应该具有和其它持续集成部分比如单元测试一样苛刻的pass策略,因为性能跟环境的相关性比较高。但让它成为持续集成的一部分,以跟踪性能的变化,同时也是性能改进的一个重要帮助数据。
但基于每个iteration做一次严格的性能度量和性能优化是必要的。在迭代后期做性能度量,发现那些不能满足性能需求的地方;同时,对两个迭代之间的性能做一个环比比较,研究并改进性能下降的地方。
性能测试之分类
一般我们所说的性能测试是load test(负载测试),但性能测试还有其它分类,包括stress test(压力测试),endurance test(耐力测试),spike test(尖峰测试),scalibility test(可伸缩性测试)等。各种测试的目的都不同,但都可以理解为是负载测试之衍生。
负载测试,是用来测试系统是否能在一定的负载之下正常运作。负载可以是在一定数量的并发以及指定的时间内,执行设定的一系列操作。通过负载测试,我们可以得到系统的性能结果,并发现系统的性能瓶颈。
再来看一下其它各种测试的测试目的。
我们不仅需要关心系统在正常负载之下的运行情况,还需要关心系统是否能承受高压,在什么样的高压之下,系统会break?测试系统的健壮性,这就是压力测试的目的。
有可能在很短的时间内,系统可以支撑起目前的负载,但我们并不知道长期运行时,系统会否出现问题,比如内存泄露等。所以,我们需要耐力测试。
同时,性能系统的运行期间,负载肯定不会是平稳的。在某些时候,系统的负载会出现一些巨大的变化,达到峰值。这就是尖峰测试的目的。
系统目前的性能可能已经满足了当前的需求,但随着用户数的增加,访问量的增长,系统需要继续保持良好的性能。这时候,我们往往会通过增加一些服务器等手段来进行扩展。但系统的性能是否会随着服务器的增多而线性提升呢?所以,我们需要可伸缩性测试来帮助我们进行分析。可伸缩性测试,通过线性地增加负载,得到测试结果数据;并分析测试结果是否也是线性增长。如果是,则说明系统具有良好的可伸缩性;如果不是,则说明系统具有较差的可伸缩性,甚者没有可伸缩性。
性能测试的结果
单于负载测试而言,我们需要的主要结果包括:吞吐量和平均响应时间。吞吐量指的是系统在一定的时间内可以处理的请求数量;平均响应时间指的是请求的响应时间平均值。而这两个结果是互相影响的,要增加吞吐量,也意味着响应时间会增长。
如果是一个交付项目,我们从客户处得到的数据一般是:系统的访问量,系统每个页面的响应时间。从这两个数据,我们可以计算出系统所需满足的吞吐量和平均响应时间。在设定好吞吐量之后(一定时间内多少并发数),通过性能测试我们就可以得到平均响应时间。通过持续不断地改进,缩短平均响应时间以满足系统的性能指标。
怎么做性能测试
最后,让我们看一下如何做性能测试。
这里讲的怎么做,不是具体的操作,而是在做性能测试时需要把握的原则和应该注意的问题。
对于性能测试而言,不同的环境,不同的测试方法可能会导致截然不同的结果。我们要得到对我们真实有用的数据,必须保证:
1. 被测系统的环境和产品环境要尽量保持一致。这里的环境指的是被测系统部署环境的服务器数量,服务器性能等。
2. 保持和产品数据库一致的数据规模。不同的数据规模,会导致测试结果的截然不同。如果无法保持数据的完全一致,至少得保持数据规模在量上的相当。
3. 模拟尽量一致的用户行为。比如,用户到了注册页面,接下来基本上都是注册,并提交。这应该是大部分用户的一个顺序执行的行为。不同的用户行为,会导致不同的数据读写,不同的性能需求。所以,应该在测试脚本里模拟和真实环境尽量一致的普遍用户行为。
性能测试工具
性能测试工具有很多,对于负载测试而言,流行的工具是jmeter。几年没有用,突然发现它已经变得非常强大和易用。
有兴趣的自己去学吧:http://jakarta.apache.org/jmeter/
-----------------------------------------------------------------------------------------------------------------
下篇预告:Performance Testing之优化
负载均衡,rails优化,数据库(分表,索引),Cache(客户端cache,服务端cache)等一些实践。
分享到:
- 2009-07-13 01:17
- 浏览 803
- 评论(1)
- 论坛回复 / 浏览 (1 / 2061)
- 查看更多
相关推荐
Rails::API 是 Rails 的精简版本,针对不需要使用完整 Rails 功能的开发者。 Rails::API 移除了 ActionView 和其他一些渲染功能,不关心Web前端的开发者可更容易、快速地开发应用程序,因此运行速度比正常的 Rails ...
Rails以其简洁优雅的语法、高效的开发速度以及良好的社区支持而闻名,这使得它成为构建现代API的理想选择之一。 ### 一、什么是RESTful API REST(Representational State Transfer)是一种软件架构风格,用于定义...
这篇博客文章“Rails中应用Ext.tree:以中国的省市地区三级联动选择为例”提供了一个实用的示例,教我们如何利用Ext.js库中的Tree组件来实现这种功能。 首先,让我们了解Rails和Ext.js的基本概念。Rails是基于Ruby...
Rails :: Controller :: Testing 这个gem将assigns给控制器测试的内容以及assert_template带回assigns控制器和集成测试的内容。 这些方法已中。 安装 将此行添加到您的应用程序的Gemfile中: gem 'rails-...
《敏捷Web开发与Rails:程序指南 第四版》是一本深度探讨使用Ruby on Rails框架进行敏捷Web应用开发的专业书籍。本书旨在帮助开发者充分利用Rails 4的特性,提高开发效率,实现快速迭代和高质量的代码编写。 Rails是...
Rails :: Dom :: Testing 这个gem负责比较HTML DOM并断言Rails应用程序中存在DOM元素。 assert_dom_equal通过assert_dom_equal和assert_dom_not_equal进行比较。 元素通过assert_dom , assert_dom_encoded , ...
这个面试练习题可能是为了测试应聘者对于Rails应用的构建、自动化任务管理、测试驱动开发(TDD)以及文件组织结构的理解。让我们逐一探讨这些知识点。 首先,`Rakefile`是Ruby中的构建工具,类似于其他语言的...
- 安装Rails: 使用gem工具安装最新的Rails版本。 - 测试安装: 创建一个简单的Rails应用来验证是否成功安装。 #### 五、练习作业0-Hello World - **目标**: - 学习如何创建第一个Rails应用程序。 - **过程**: -...
综上所述,《Ruby on Rails Guides_ A Guide to Testing Rails Applications.pdf》是一个全面的资源,无论你是Rails新手还是资深开发者,都能从中学习到如何为Rails应用编写高质量的测试。从理论到实践,从单元测试...
Ruby on Rails,简称Rails,是一种基于Ruby语言的开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,旨在使Web开发过程更加高效、简洁。本篇将通过一个入门实例,深入探讨Rails的基本概念和核心...
rails_best_practices是用于检查Rails代码质量的代码度量工具。 它支持以下ORM / ODM: 活动记录 蒙古型 mongomapper 以及以下模板引擎: erb 哈姆 减肥 拉布尔 rails_best_practices支持Ruby 1.9.3或更高版本...
Ruby on Rails,通常简称为Rails,是一个基于Ruby语言的开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,以简洁、高效的代码和“约定优于配置”的理念著称。此压缩包中的"rubyonrails21-cn.pdf"可能是...
Rails,全称为Ruby on Rails,是一款基于Ruby编程语言的开源Web应用程序框架,以其MVC(模型-视图-控制器)架构模式而闻名。"Advanced Rails" 涵盖了Rails开发中的高级主题和技术,是Ruby on Rails学习进阶的重要...
### Ruby on Rails Guides v2 - Ruby on Rails 4.2.5 #### 一、重要概念及基础假设 - **重要概念**:本指南旨在帮助读者深入理解Ruby on Rails(以下简称Rails)4.2.5版本的核心功能与最佳实践。 - **基础假设**:...
Ruby on Rails(简称RoR或Rails)是一种开源的网络应用框架,用Ruby语言编写。它被设计用来轻松地实现MVC(模型-视图-控制器)设计模式,从而使开发人员能够快速和有条理地创建数据驱动的应用程序。接下来,我将详细...
- `rake rails:update`: 更新应用程序中的 scripts 和 public/javascripts 文件夹,使之与当前 Rails 版本保持一致。 - `rake rails:update:javascripts`: 仅更新 javascripts 文件夹。 - `rake rails:update:...
chef-rails, 厨房设置一个可以与 Nginx 和 Rails 一起滚动的Ubuntu服务器 主厨 rails安装一个准备为 Ruby on Rails 栈准备的Ubuntu服务器:NginxPostgreSQLRedisMemcached带RVM的rubyPhusion乘客独立要求Ubuntu ...
Ruby on Rails,简称Rails,是基于Ruby语言的一个开源Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,旨在使Web开发过程更加高效、简洁。本压缩包中的"Ruby on Rails入门经典代码"提供了新手学习...
rails5-docker-alpine:使用Alpine Linux的Rails轻量级Docker开发环境