qileilove

blog已经转移至github,大家请访问 http://qaseven.github.io/

功能测试用例基础设计模型

  功能测试用例基础设计模型
  一. 异常测试
  异常数据输入:空数据库输入、特殊字符数据输入、超长数据输入、 错误数据输入
  异常操作输入:省略操作步骤、重复关键步骤、插入多余操作步骤
  异常环境:网络环境异常、硬件环境异常、软件环境异常
  二. 用例合并
  用例合并:异常测试等价类、测试数据等价类、测试步骤等价类、测试 结果等价类
  三. 功能组合
  功能内组合测试:改变组合输入顺序、必选功能和可选功能组合
  功能间组合测试:正交组合法、场景插入法、地标法
  与运行环境的组合:操作系统兼容性(2.1-4.0)、浏览器兼容性、 第三方软件兼容性(豌豆荚、91手机助手、360手机助手等)
  功能并发测试:测一送一法
  四. 场景验证
  正常路径验证测试
  分支路径验证测试:边界值法、改变部分操作顺序、正常路径操作遗 露、各种数据输入形式

posted @ 2014-01-03 13:36 顺其自然EVO 阅读(162) | 评论 (0)编辑 收藏

通用功能测试用例

 一般jsp页面的测试
  输入文本框类型控件的测试

 文本框中-> 数字类型的测试
  树控件的测试

posted @ 2014-01-02 09:51 顺其自然EVO 阅读(363) | 评论 (0)编辑 收藏

GUI功能测试自动化模式

 对于某个特定程序,为其开发自动化功能测试解决方案的过程,与创建该程序的过程,二者相较并没有很悬殊的差别。自动化测试是一个非常年轻的领域,它正在不断经历大量的进步、提升和标准化进程。在这个领域中,涌现了许多与“被测系统”(SUT,System Under Test)互动的新工具。
  现在,软件开发方面有大量可供选择的方法论和途径,例如:面向对象编程、函数式编程、领域驱动设计、测试驱动设计、行为驱动设计等等。它们拥有明确的声明性概念和理论,并简化了对初始系统架构的定义过程、对系统的理解以及开发者之间的知识交换等方面的工作
  本文将主要针对GUI(图形用户界面)应用的测试自动化进行讨论——从自动化开发人员的角度看,在这种情况下被测系统(SUT)表现为一个黑箱(被测系统,是指一个正在测试是否能够正确操作的系统。对于桌面应用来说,它就是应用本身,而对浏览器系统来说——则代表了网站/Web项目等含义)。在公司的遗留系统占很高比例的环境里,或是在新开发的系统没有考虑可检测质量属性时,这一现象非常常见。
  对最佳实践的准备和定义,是开发自动化的测试的关键部分。下图展示了被测系统和测试者之间的传统交互:
  测试者与SUT之间的交互
  位于该系统中心的,是一个扮演测试者角色的人类个体。测试者使用手动交互和应用的视觉化分析,以及特定的SUT非可视化界面访问工具,将测试用例中所描绘的场景进行复制。如果失败或是遇到系统意外行为,测试者便将错误行为的有关信息输入到默认的追踪系统中。
  自动化测试的主要目的,是消除(或者至少最小化)人类与SUT之间的交互。在持续交付产品开发周期中,这是非常常见的问题。一份文献来源的研究表明,现在自动化测试系统的数量非常多。商业产品一般会公布一系列详细的要求和推荐,特别适用于其产品。但是这些厂家往往不会公布适合与任何自动工具一起使用的一系列工具诊断实践。
  此外,这些自动工具软件提供商往往还会运用营销手段,基于小量功能测试来描绘其系统的优势。但是随着自动化测试数量的增长,维护现有测试将成为系统工作流程中最昂贵的部分。
  自动化测试框架旨在帮忙解决这些问题。他们定义了基本的系统可复用组件,公布了最佳实践和统一自动方法——为了正确地开发自动化测试框架,我们需要得到独立最佳实践的指导。
  自动化功能测试的模式
  让我们检查以下Web应用程序自动化方面的问题(图1),这是一个自动化解决方案装置的例子。该应用包含了一幅登录页面,而每项测试都必须经过该页面,才能进行更进一步的测试。
  图1:示例——拥有最少页面和功能集的简单Web应用
  分类体系(图2)为我们带来了全部功能测试模式的整体视角,本文稍后会对各个模式展开描述。
  图2:自动化功能测试模式的分类
测试实现的模式
  记录
  通过自动化测试工具来执行此模式的测试实现。该工具记录并回放手工测试者的操作。某种程度上,考虑到昂贵的维护成本,这种方式被认为是一个糟糕的实践。
  脚本化
  由程序员使用自动化工具的API来执行测试实现(例如Selenium WebDriver API)。
  实现基础模板(测试模板)
  该模式将实现基础测试模板类。要实现各种测试的变体,可以通过继承和扩展模板类的功能来创建。
  数据驱动实现
  通过测试用例来定义一个基础测试的实现。可以通过一系列不同的输入数据组合,来创建各种测试的变体。
  在大部分单元测试框架中都实现了这一方法,例如:MSTest以DataContext(键值集合)的方式,提供对测试内部的属性的访问权限。于是,相同的测试方法主体会运行很多次,但DataContext属性所提供的数据各不相同。
  关键字驱动实现
  这一测试实现借助了关键字(例如:点击、回车)。测试实现通过特殊的IDE完成,这类IDE可以钩挂到应用的UI上。
  目前已有数款软件工具,支持借助关键字来实现测试。测试的步骤,以关键字、屏幕上的控制名和输入参数的结合的形式出现。HP QTP和MonkeyTalk是这类IDE中的典型例子
  模型驱动实现
  对任何应用来说,在特定的时刻接受特定的输入,都只会有一个特定的状态。根据这样的定义,我们可以将软件程序描绘为有限状态机(有限自动机)。考虑到这一事实,以及状态可用性和转换模型(例如图1),我们可以定义一套特定的页面间转换(工作流)的集合,它将能够覆盖程序的大部分功能。
  架构模式
  多层的测试解决方案
  该模式从逻辑维度将正在测试的系统划分为独立的逻辑层级。
  将软件系统以架构性方式分为独立的层级是一个广为流传的实践。第一层封装了表述逻辑,第二层则是业务逻辑层,而第三层负责数据存储。使用这一范式,有助于降低应用维护成本,因为更换每层内部的组件对其他层级的影响将被最小化。而同样的方法也可以运用到测试系统中。
  测试代码同样可以分为三层:用来向SUT提供访问的UI自动化工具界面层、功能逻辑层和测试用例层。每一层都肩负特定的责任,而它们都在追求共同的目标——降低测试维护成本,提升创建新测试的便利性。
  图 3: 架构性原型——测试系统的多层架构
元框架
  该模式定义了一组基础的独立工具类。对任何自动化工具来说,它们都是通用的,而且可以在不同自动化项目之间复用。
  当需要在一个组织机构中测试不同的项目,而且企业标准要求测试结果采用统一的界面时,或许就需要这样的解决方案。此外,元框架改进了项目间代码复用的度量标准,因为它可能会包含有用的工具方法。有关功能和测试对象的基础类,简化了项目之间知识的转移。元框架展现在图3的右侧。
  功能组合模式
  功能方法
  针对特定于应用的业务功能,从其UI实现、API或其他层面进行了抽象。
  用于自动化测试的许多工具,都支持创建被称之为“场景记录”的功能。当一位测试开发者针对特定应用执行特定操作时,这些工具将自动创建一份测试脚本。它可以在稍后进行回放,并检查在程序发生变化后,该脚本是否得到了正确的执行。
  例子:改变登录界面的外观,将要求在全部预计的测试场景中的对应部分都进行变更。如果我们将登录方法提取为Application.Login(username,password),并在全部测试中使用这一方法,那么当登陆页面发生任何变更的时候,我们将只需要修改仅仅这一个功能方法,随后变更就会被自动分发到所有使用该方法的测试中。
  图4:测试脚本与(a)缺乏功能方法的过渡层的用户界面之间的交互;(b) 带有功能方法层的用户界面。当应用发生变更时,阴影部分对象将会被改变。
  页面对象
  这一模式将某个页面的功能方法组合在一起。
  由于图1中展现的用于应用的功能方法数量不多,因此它们可以移入一个单独的类。但是为了提升代码可维护性,此模式建议依据这些方法所代表页面,对其进行分组。例如,这些对应关系可以包括:页面:PageLogin——方法:Login();页面PageHome——方法:Logout()、CreateUser()。
  功能库
  它将某个特定应用的功能对象或(和)功能方法分组打包,成为一个适合复用的模块。
  SUT的启动和拆卸对象(SUT运行者)
  该模式支持被测系统的初始启动,即它的初始化。在此之后,测试对象释放与该系统相关的资源。
  在功能方法之中,我们可以区分出与功能测试无关的方法集合:例如启动某个Web浏览器,并访问SUT的登录页面。而在测试之后,Web浏览器应该被关闭。SUT运行者负责以上这些通用活动。
  对象源(对象之母、对象精灵、对象工程)
  该模式按测试执行所要求的形式,创建并初始化的对象。
  运输者(导航器)
  根据测试要求,它将被测试系统中的导航控制集中在一起。
  该对象封装了与被测试系统内部的导航实现有关的完整逻辑。因此业务逻辑的问题不会影响系统内的导航。
  对于图1所描述的情况,我们将拥有一个Transporter类(运输者),它拥有以下方法:NavigateToLogin()、NavigateToHomePage()和NavigateToCreateuser()等等。或者,每个独立的页面(page)对象或许都会拥有自己的运输(transport)方法。在这种情况下,这些方法就作为该对象自身的运输者。
  复合页面对象
  该模式将复用的页面(page)对象聚合在一个外部对象中。
  这一模式支持用更加“面向对象”的方式来组织页面对象——把可以在不同页面上复用的子对象分离,并将其包含到父对象中。
  图5:通过在主页和创建用户页面对象中聚集,来使用导航页面(Navigation Page)对象
 扩展的页面对象
  该模式通过继承来扩展基础的页面对象,成为复合页面对象的替代选择。
  过程模式
  给定条件/时机/结果
  此模式将测试执行过程分为三个阶段:
  给定条件(定义先决条件)
  时机(设定与上下文协同工作的特定操作)
  结果(检查结果)
  四阶段测试
  此模式将测试执行过程分为四个阶段:
  定义先决条件
  调用业务功能
  Checking results;
  拆卸系统
  流测试
  该模式支持在一个测试内执行业务操作并进行检查。两项内容可以交替进行,直到实现测试的最终目标。
  多次失败
  该模式定义了一套机制,能够在非致命错误出现之后继续进行测试。
  测试依赖模式
  独立测试
  该模式令被测试的系统回到测试前的状态。
  链式测试
  在该模式中,初步测试树立起了测试需要跟踪的SUT状态。
  测试分组模式
  每个测试类封装一个测试方法
  在该模式下,每个独立的测试方法,都封装在一个独立的测试类中。
  测试类中的分组测试方法
  在该模式下,多个测试方法被放置于一个独立的测试类中。
  总结
  测试解决方案的设计背后的驱动力,是对特定测试实现模式的选择。它扮演了未来所有测试解决方案开发的起点,将在可读性、可维护性和其他诸多特性方面产生影响。而且它也设置了这些实验,使其在能够产生帮助的时候更好地复用项目之间的资源,并减少新项目自动启动的时间。
  这篇文章抛出了有关如何参考设计模式,来构建测试解决方案的想法。

posted @ 2014-01-02 09:50 顺其自然EVO 阅读(224) | 评论 (0)编辑 收藏

sulley测试环境搭建的相关总结

忙活了几天,在师兄的指导下也算是OK啦,下面来说一句具体的搭建过程,基本是按照python灰帽子那本书的第九章来弄的,在网上的话可以参考这里:
  http://blog.chinaunix.net/uid-25979788-id-1747694.html
  基本上就是书上的电子版了。对于环境的测试,需要分为客户端与服务器端,一般不要把两个端放在同一台电脑上,否则不会有效果,下面是我画的一个大概的结构图:
  而如果在使用python ftp_session.py中出现了包括提示Pause不存在等错误的话,请参考我在OSC发的帖子:
  http://www.oschina.net/question/59519_138659
  在下面我自己已经给出了答案。
  后续如果有新的进展,包括在LINUX下的安装等,我都会一一都写出来,希望对有需要的人有帮助。
  结构图的VSD格式文件:http://download.csdn.net/detail/jayxujia123/6769001

posted @ 2014-01-02 09:46 顺其自然EVO 阅读(267) | 评论 (0)编辑 收藏

软件测试流程规划

 一、引言
  本文档规范了软件测试过程中的整体流程,明确了软件测试从开始到结束的各个阶段,以及在各阶段中的负责人、具体工作内容和必需的输入输出文档。另外,本文还介绍了各测试阶段需要的测试工具、测试点和测试步骤,并提供了各类测试文档的参考模板。
  二、测试流程概述
  1、流程介绍
  一般来讲,软件测试是伴随着项目的立项而开始的。也就是说,软件项目一旦确立,测试工作也就开始了。在测试的过程中,前后要经过以下主要环节:
  需求分析—>制定测试计划—>搭建测试环境—>测试用例设计—>测试执行—>BUG回归测试—>测试总结—>软件发布
  对于以上流程环节,一般而言,需求分析属于需求分析人员的工作范畴,环境搭建、用例设计、测试执行以及回归测试等属于测试人员的工作范畴,测试负责人负责制定测试计划以及对各个环节的跟踪、实施、管理等。
  2、流程图
  功能测试
  项目开始
  需求阶段
  测试计划
  测试阶段
  性能测试
  用户界面测试
  兼容性测试
  安全性测试
  接口测试
  测试总结
  软件发布
  三、需求阶段
  在这个阶段,主要是对于需求的收集、分析以及评估。
  1.由需求分析人员统一收集需求,并整理成文档格式转发给项目经理、开发经理和测试经理;
  2.项目经理召集开发经理、测试经理和需求分析人员进行会议讨论,了解具体每个需求的实际含义,并且明确各需求的有效性和可用性;
  3.小组会议讨论,确定最终实现的需求和功能点,并整理出重点需求;
  4.项目经理根据会议讨论结果编写需求说明,并且再次召集小组开会讨论,对需求说明进行修复、完善,并最终确定《需求规格说明书》。
  负责人:项目经理
  输入文档:需求说明文档
  输出文档:《需求规格说明书》
  四、测试计划阶段
  作为测试的起始步骤和重要环节,测试计划是对测试全过程的组织、资源、原则等进行规定和约束,并制定测试全过程各个阶段的任务以及时间进度安排,并提出对各项任务的评估、风险分析和管理需求。用一句话概括就是:测试计划是从管理角度对整个测试活动进行规划和控制。
  测试计划的主要内容可分以下几个方面:
  1.测试概述(介绍项目测试的范围、目的以及组织形式)
  2.测试进度(测试时间周期的安排)
  3.测试策略(包括测试环境、测试工具及测试方法)
  4.需求跟踪(确定系统测试项与需求之间的对应关系)
  5.测试通过失败标准(指明测试何时通过何时结束)
  6.测试挂起恢复标准(指明当测试过程无法进行下去时测试活动挂起以及恢复的标准)
  7.资源分配(工作量的统计以及工作任务的安排)
  8.应交付测试工作产品(明确测试需要提交的各类工作文档)
  9.风险评估(预估测试存在的风险)

测试经理根据项目的总体进度、发布时间以及需求规格说明、开发计划制定相应的测试计划,完成后提交给项目经理。项目经理组织讨论会,连同开发经理、测试经理以及各模块负责人,对测试计划进行评审并确定。
  负责人:测试经理
  输入文档:《需求规格说明书》、《软件开发计划》
  输出文档:《软件测试计划》
  五、测试阶段
  测试阶段按照不同的测试要求可分为以下几点:
  · 功能测试
  · 性能测试
  · 用户界面测试
  · 系统兼容性测试
  · 系统安全性测试
  · 系统接口测试
  负责人:测试工程师
  输入文档:《需求规格说明书》、《软件测试计划》、《软件设计文档》
  输出文档:《***测试用例》、《***缺陷报告》、《***测试报告》
  1、测试前提条件
  当研发部门完成了软件项目的开发任务之后,软件产品开始进入测试环节。在开发人员提交测试之前,需要遵守测试的前提条件,如果没有限定测试前的前提条件,测试人员需要花费大量的时间去完成一些简单的并且很容易发现的错误,这样会造成很大的人员浪费。因此,对于开发部门提交给测试部门的软件产品,除领导亲自特批外,均必须满足以下条件才允许提交:
  (1)开发部门完成软件的白盒测试。
  (2)开发部门完成软件的冒烟测试。
  (3)必须提供软件产品的需求文档以及软件开发的设计文档(包括概设和详设文档)。
  (4)对于新增功能,必须提供功能列表、功能详细说明、流程明细以及关联的模块;对于修改功能,必须提供修改功能列表、具体修改内容以及影响的模块。
  (5)对于没有完成的功能,不能提交测试,必须在代码中注释掉。
  (6)对于需要与其他系统进行集成测试的软件,需要明确测试环境以及参数的配置,并且详细说明系统间具体是如何集成的。
  (7)对于需要进行性能测试的部分,提供详细说明以及需要达到的各项性能指标。
  2、系统功能测试
  2.1测试工具
  主要采用手工测试,但对于重复性功能点的测试可采用QuickTest Professional作为自动化测试工具。另外,使用公司Dynamix系统作为测试用例和BUG管理工具。
  2.2测试点
  2.2.1链接测试
  链接是Web应用系统的一个主要特征,它是在页面之间切换和指导用户去一些不知道地址的页面的主要手段。链接测试可分为三个方面。首先,测试所有链接是否按指示的那样确实链接到了该链接的页面;其次,测试所链接的页面是否存在;最后,测试web应用系统上是否有孤立的页面。
  2.2.2表单测试
  当用户给Web应用系统管理员提交信息时,就需要使用表单操作,例如:用户注册、登陆、信息提交等。在这种情况下,我们必须测试提交操作的完整性,以校验提交给服务器的信息的正确性,例如:用户填写的出生日期与职业是否恰当,填写的所属省份与所在的城市是否匹配等。如果使用了默认值,还要校验默认值得正确性。如果表单只能接受指定的某些值,则也要进行测试。如:只能接受某些字符,测试时可以跳过这些字符,看系统是否会报错。
  2.2.3 Cookie测试
  如果Web应用系统使用了Cookies,就必须检查Cookies是否能正常工作。测试的内容可包括Cookies是否起作用,是否按预定的时间进行保存,刷新对Cookies有什么影响等。
  2.2.4数据校验测试
  如果系统中根据业务规则需要对用户的输入进行校验,那么就必须要保证这些校验功能正常工作。例如,省份的字段可以用一个有效列表进行校验。在这种情况下,需要验证列表完整而且程序正确调用了该列表(例如在列表中添加一个测试值,确定系统能够接受这个测试值)。
  2.2.5程序功能点的测试
  尝试用户的所有操作,这是用户之所以使用网站的原因,必须确保:
  1、各个功能点是否能正确使用;
  2、流程是否能正常运转。
  2.3测试步骤
  2.3.1测试环境的搭建
  根据实际情况,搭建相应的测试环境,包括软件环境和硬件环境。
  2.3.2用例设计
  测试工程师根据“需求规格说明书”、“测试计划”以及开发提供的“软件设计文档”来设计各个模块以及功能点的测试用例,完成后提交给测试经理。测试经理组织各模块开发以及测试人员进行开会讨论,评估设计好的测试用例。
  2.3.3测试执行
  在这一阶段,测试工程师对之前设计好的测试用例进行执行操作,找出系统软件的BUG并且提交给开发人员进行修复。
  2.3.4回归测试
  测试工程师对于那些已被开发修复的BUG,做回归测试以验证其是否得到正确修复。确认修复的,就将BUG关闭,否则重新提交给开发人员修复。
  回归测试需要注意一下两点:
  1.BUG是否得到正确修复;
  2.是否引入了新的BUG。
  2.4测试报告
  测试工程师对功能测试结果进行总结分析,完成《功能测试报告》。
  3、系统性能测试
  性能测试是测试过程中不可或缺的一个环节,它是通过自动化的测试工具模拟多种正常、峰值以及异常条件来对系统的各项性能指标进行测试。
版权声明:本文出自 Giant321 的51Testing软件测试博客:http://www.51testing.com/?506499
原创作品,转载时请务必以超链接形式标明本文原始出处、作者信息和本声明,否则将追究法律责任。

posted @ 2014-01-02 09:45 顺其自然EVO 阅读(268) | 评论 (0)编辑 收藏

如何构建有效的自动化测试笔记

 如何构建自动化测试
  通常测试的五个步骤
  1.分析:测试需求分析。
  2.设计:测试用例设计。
  3.建立:测试环境建立。
  4.执行:测试用例执行。
  5.检查:测试结果检查。
  其中测试用例的执行和检查需要执行多次且很无聊,所以考虑自动化测试。
  自动化测试:
  项目A:
  1.一定要把它当成独立的项目去做。
  资源的投入,领导的支持。
  2.参照企业开发流程。
  框架开发人员。
  3.明确解决什么问题。
  替代人增强执行效率,提高广度。
  4.测试的设计。
  5.相应代码的开发管理。
  6.测试的推广
  总结:自动化测试一定要成体系,一定要按照一个独立的项目区运作。
  案列B:
  POC(概念验证)
  1.要照顾到已有案列的组织形态。
  2,自动化测试不要做太多的改变去颠覆原有测试。
  案列C
  1,要考虑自动化测试的可延续性。
  包括,能否大规模推广,脚本的完整性,可独立性,可维护性等。
  自动化测试体系概述。
  1.自动化测试策略(目标分析,范围分析,可行性分析)。
  指定明确的。合理的自动化测试目标,对自动化测试范围进行详细规划,通过试点项目进行可行性分析。
  2.自动化测试管理要素(投资回报,流程与规范,团队与组织):
  制定完整的,与手工测试配合的自动化测试流程规划及组织结构,以投资回报模型来衡量自动化测试价值。知道推进放心是开展有效自动化测试的关键管理要素。
  3.自动化测试技术要素(测试层次,测试框架,测试工具)
  选取使用的自动化测试工具,根据业务系统特点定制开发良好设计的自动化测试框架。
 自动化测试的合理目标:
  1.减少人力资源的投入。
  2.在相同的人力支援投入的情况下减少人力资源的投入
  3.让测试的执行向上游浮动,
  4。帮助开发者更早的发现产品中的问题。
  如何制定实际而合理的自动化测试目标:
  1.不追求大而全,追求达到特定目的
  2.针对自动化测试特点,期望契合实际。
  3.分阶段的,有计划的,做不达到目标。
  ROI平衡点
  手工
  投资平稳。
  自动
  前期比较多,后期平稳。
  流程与规范
  BPT:
  功能和流程相分离。
  框架:
  可重用的平台,
  自动化测试所需要的人员:
  1 一个技术背景好的人。
  2.一个懂测试的人。
  3.一个测试经理。

posted @ 2014-01-02 09:43 顺其自然EVO 阅读(218) | 评论 (0)编辑 收藏

Android Monkeyrunner Test

  关于Android自动化测试,研究了Monkey,Robotium 这次来看下 Monkeyrunner.
  具体实践最靠谱的当然还是官网资料了。
  http://developer.android.com/tools/help/monkeyrunner_concepts.html
  这里简单记录下实践过程,Monkeyrunner 需要用Python来编写,对于曾未学过Python的童鞋来说也没关系,因为Python属于比较好学的一门脚本语言.笔者也未曾学过Python,但有其他编程基础如:PHP,Java,Peal,还是能够很好理解Python的。
  一、monkeyrunner 介绍
  monkeyrunner 提供了一个API,使用此API写出的程序可以在Android代码之外控制Android设备和模拟器.
  二、monkeyrunner 测试类型
  多设备控制、功能测试、回归测试
  三、实例(测试MyAndroid.apk)
  1. 新建一个 monkeyrunnerTest.py
# Import the monkey runner modules used by this program
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage
# Connects to current device, returning a MonkeyDevice object
device = MonkeyRunner.waitForConnection()
# Installs the Android package
device.installPackage("./MyAndroid.apk")
# Runs the component
device.startActivity(component = 'com.luwenjie.android/.MyAndroidActivity')
#Presses the Menu button
device.press('KEYCODE_MENU','DOWN_AND_UP')
#Takes a screenshot
result = device.takeSnapshot()
# Writes the screenshot to a file
result.writeToFile('./shot1.png','png')
  2. 运行在 %Android_HOME%\tools 目录下运行一下命令
  monkeyrunner  monkeyrunnerTest.py
  四、API参考
  MonkeyRunner:http://developer.android.com/tools/help/MonkeyRunner.html
  MonkeyDevice:http://developer.android.com/tools/help/MonkeyDevice.html
  MonkeyImage:http://developer.android.com/tools/help/MonkeyImage.html  五、录制模式
#Usage: monkeyrunner recorder.py
#recorder.py  http://mirror.yongbok.net/linux/android/repository/platform/sdk/monkeyrunner/scripts/monkey_recorder.py
from com.android.monkeyrunner import MonkeyRunner as mr
from com.android.monkeyrunner.recorder import MonkeyRecorder as recorder
device = mr.waitForConnection()
recorder.start(device)
#END recorder.py
#Press ExportAction to save recorded scrip to a file
#Example of result:
#PRESS|{'name':'MENU','type':'downAndUp',}
#TOUCH|{'x':190,'y':195,'type':'downAndUp',}
#TYPE|{'message':'',}
#Usage: monkeyrunner playback.py "myscript"
#playback.py   http://mirror.yongbok.net/linux/android/repository/platform/sdk/monkeyrunner/scripts/monkey_playback.py
import sys
from com.android.monkeyrunner import MonkeyRunner
# The format of the file we are parsing is very carfeully constructed.
# Each line corresponds to a single command.  The line is split into 2
# parts with a | character.  Text to the left of the pipe denotes
# which command to run.  The text to the right of the pipe is a python
# dictionary (it can be evaled into existence) that specifies the
# arguments for the command.  In most cases, this directly maps to the
# keyword argument dictionary that could be passed to the underlying
# command.
# Lookup table to map command strings to functions that implement that
# command.
CMD_MAP = {
'TOUCH': lambda dev, arg: dev.touch(**arg),
'DRAG': lambda dev, arg: dev.drag(**arg),
'PRESS': lambda dev, arg: dev.press(**arg),
'TYPE': lambda dev, arg: dev.type(**arg),
'WAIT': lambda dev, arg: MonkeyRunner.sleep(**arg)
}
# Process a single file for the specified device.
def process_file(fp, device):
for line in fp:
(cmd, rest) = line.split('|')
try:
# Parse the pydict
rest = eval(rest)
except:
print 'unable to parse options'
continue
if cmd not in CMD_MAP:
print 'unknown command: ' + cmd
continue
CMD_MAP[cmd](device, rest)
def main():
file = sys.argv[1]
fp = open(file, 'r')
device = MonkeyRunner.waitForConnection()
process_file(fp, device)
fp.close();
if __name__ == '__main__':
main()

posted @ 2014-01-02 09:36 顺其自然EVO 阅读(245) | 评论 (0)编辑 收藏

测试前置条件及测试点

 一、引言
  本文档根据目前公司的实际情况,规范了软件产品提交测试的前置条件以及需提交的文档资料,避免造成测试的反复和资源的浪费。另外,文档还明确了各测试阶段需要关注的一些测试点,为我们的软件测试工作明确了目的和方向。
  二、测试前置条件
  当研发部门完成了软件项目的开发任务之后,软件产品开始进入测试环节。在开发人员提交测试之前,需要遵守测试的前提条件,如果没有限定测试前的前提条件,测试人员需要花费大量的时间去完成一些简单的并且很容易发现的错误,这样会造成很大的人员浪费。因此,对于开发部门提交给测试部门的软件产品,除领导亲自特批外,均必须满足以下条件才允许提交:
  1、 开发部门完成软件的白盒测试
  2、 开发部门完成软件的冒烟测试。
  3、 对于新增功能,必须提供功能列表、功能详细说明、流程明细以及关联的模块;对于修改功能,必须提供修改功能列表、具体修改内容以及影响的模块。
  4、 对于没有完成的功能,不能提交测试,希望在代码中注释掉。
  5、 对于需要与其他系统进行集成测试的软件,需要明确测试环境以及参数的配置,并且详细说明系统间具体是如何集成的。
  6、 对于需要进行性能测试的部分,提供详细说明以及需要达到的各项性能指标。
  三、测试点设计
  1、系统功能测试
  1.1  链接测试
  链接是Web应用系统的一个主要特征,它是在页面之间切换和指导用户去一些不知道地址的页面的主要手段。链接测试可分为三个方面。首先,测试所有链接是否按指示的那样确实链接到了该链接的页面;其次,测试所链接的页面是否存在;最后,测试web应用系统上是否有孤立的页面。
  1.2  表单测试
  当用户给Web应用系统管理员提交信息时,就需要使用表单操作,例如:用户注册、登陆、信息提交等。在这种情况下,我们必须测试提交操作的完整性,以校验提交给服务器的信息的正确性,例如:用户填写的出生日期与职业是否恰当,填写的所属省份与所在的城市是否匹配等。如果使用了默认值,还要校验默认值得正确性。如果表单只能接受指定的某些值,则也要进行测试。如:只能接受某些字符,测试时可以跳过这些字符,看系统是否会报错。
  1.3  cookie测试
  如果Web应用系统使用了Cookies,就必须检查Cookies是否能正常工作。测试的内容可包括Cookies是否起作用,是否按预定的时间进行保存,刷新对Cookies有什么影响等。
  1.4  数据校验测试
  如果系统中根据业务规则需要对用户的输入进行校验,那么就必须要保证这些校验功能正常工作。例如,省份的字段可以用一个有效列表进行校验。在这种情况下,需要验证列表完整而且程序正确调用了该列表(例如在列表中添加一个测试值,确定系统能够接受这个测试值)。
  1.5  应用程序特定的功能需求
  尝试用户的所有操作,这是用户之所以使用网站的原因,必须确保:1、功能点是否能正确使用;2、流程是否能正常运转。
  2、系统性能测试
  性能测试是测试过程中不可或缺的一个环节,它是通过自动化的测试工具模拟多种正常、峰值以及异常条件来对系统的各项性能指标进行测试。
  性能测试主要包含负载测试和压力测试
  2.1负载测试
  负载测试是为了测量Web系统在某一负载级别上的性能,以保证Web系统在需求范围内能正常工作。负载级别可以是某个时刻同时访问Web系统的用户数量,也可以是在线数据处理的数量。例如:Web应用系统能允许多少个用户同时在线?如果超过了这个数量,会出现什么现象?Web应用系统能否处理大量用户对同一个页面的请求?
  通过负载测试,确定在各种工作负载下系统的性能,目标是测试当负载增加时,系统各项性能指标的变化情况。
 2.2压力测试
  压力测试是测试系统的限制和故障恢复能力,也就是测试Web应用系统会不会崩溃,在什么情况下会崩溃。黑客常常提供错误的数据负载,直到Web应用系统崩溃,接着当系统重新启动时获得存取权。
  压力测试是通过确定一个系统的瓶颈或者不能接收的性能点,来获得系统能提供的最大服务级别的测试。
  性能测试主要指标:
  (1)响应时间(RT):反映在完成某个业务所需要的时间。
  (2)吞吐量(TPS):反映单位时间内能够处理的事务数目。
  (3)服务器资源占用。
  3、用户界面测试
  3.1  站点地图和导航条
  确认测试的站点是否有地图。有些网络高手可以直接去自己要去的地方,而不必点击一大堆页面,另外新用户在网站中可能会迷失方向。站点地图和导航条可以引导用户进行浏览。需要验证站点地图是否正确?确认地图上的链接是否确实存在?地图有没有包括站点上的所有链接?是否每个页面都有导航条?导航条是否一致?每个页面的链接是否正常?导航条是否直观?
  3.2  颜色和背景
  由于web日益流行,很多人把它看作图形设计作品。而有些开发人员对新的背景颜色更感兴趣,以至于忽略了这种背景颜色是否易于浏览。通常来说,使用少许或尽量不使用背景是个不错的选择。如果您想用背景,那么最好使用单色的,和导航条一起放在页面的左边。否则,图案和图片可能会转移用户的注意力。
  3.3  图形测试
  在Web应用系统中,适当的图片和动画既能起到广告宣传的作用,又能起到美化页面的功能。一个Web应用系统的图形可以包括图片、动画、边框、颜色、字体、背景、按钮等。图形测试的内容有:
  (1)要确保图形有明确的用途,图片或动画不要胡乱地堆在一起,以免浪费传输时间。Web应用系统的图片尺寸要尽量地小,并且要能清楚地说明某件事情,一般都链接到某个具体的页面。
  (2)验证所有页面字体的风格是否一致。
  (3)背景颜色应该与字体颜色和前景颜色相搭配。
  (4)图片的大小和质量也是一个很重要的因素,一般采用JPG或GIF压缩。
  3.4  内容测试
  内容测试用来检验Web应用系统提供信息的正确性、准确性和相关性。信息的正确性是指信息是可靠的还是误传的。例如,在商品价格列表中,错误的价格可能引起财政问题甚至导致法律纠纷;信息的准确性是指是否有语法或拼写错误。这种测试通常使用一些文字处理软件来进行,例如使用Microsoft Word的“拼音与语法检查”功能;信息的相关性是指是否在当前页面可以找到与当前浏览信息相关的链接或入口。
  3.5  表格测试
  需要验证表格是否设置正确。用户是否需要向右滚动页面才能看见产品的价格?把价格放在左边,而把产品细节放在右边是否更有效?每一栏的宽度是否足够宽,表格里的文字是否都有折行?是否有因为某一个的内容太多,而将整行的内容拉长?
  3.6  整体界面测试
  整体界面是指整个Web应用系统的页面结构设计,是给用户的一个整体感。例如:当用户浏览Web应用系统时是否感到舒适,是否凭直觉就知道要找的信息在什么地方?整个Web应用系统的设计风格是否一致?对整体界面的测试过程,其实是一个对最终用户进行调查的过程。一般Web应用系统采取在主页上做一个调查问卷的形式,来得到最终用户的反馈信息。对所有的可用性测试来说,都需要有外部人员(与Web应用系统开发没有联系或联系很少的人员)的参与,最好是最终用户的参与。
  4、系统兼容性测试
  兼容性测试主要考虑到以下几个方面的兼容:
  4.1平台的兼容性
  需要测试在不同操作系统下(例如windows/Linux/Unix等)以及在同一操作系统不同版本下(例如winxp/win2003server/vista/win7等)的运行情况,避免软件在某一操作系统下能正常运行,但在另外的操作系统下就会运行失败。
  4.2浏览器的兼容性
  由于浏览器是web客户端的核心,而不同厂商的浏览器对Java、JavaScript、ActiveX、plug-ins或不同的HTML规格有不同的支持,所以需要对不同的浏览器进行测试,确保软件在不同浏览器下的运行都是没问题的。
  4.3分辨率的兼容性
  测试主流分辨率下的页面显示是否正常?字体大小是否合适?文本图片是否对齐等?
  4.4打印机的兼容性
  4.5组合测试
  5、系统安全性测试
  对于网站系统,安全性测试非常重要,如果用户信息被黑客泄露,客户在交易时,就不会有安全感。
  安全性测试主要关注以下几点:
  (1)现在的Web应用系统基本采用先注册,后登陆的方式。因此,必须测试有效和无效的用户名和密码,要注意到是否大小写敏感,可以试多少次的限制,是否可以不登陆而直接浏览某个页面等。
  (2)Web应用系统是否有超时的限制,也就是说,用户登陆后在一定时间内(例如15分钟)没有点击任何页面,是否需要重新登陆才能正常使用。
  (3)为了保证Web应用系统的安全性,日志文件是至关重要的。需要测试相关信息是否写进了日志文件、是否可追踪。
  (4)当使用了安全通信协议SSL时,还要测试加密是否正确,检查信息的完整性。
  (5)服务器端的脚本常常构成安全漏洞,这些漏洞又常常被黑客利用。所以,还要测试没有经过授权,就不能在服务器端放置和编辑脚本的问题。
  6、系统接口测试
  在很多情况下,系统都不是孤立的,往往会有很多外部系统与之对接。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。
  6.1服务器接口
  第一个需要测试的接口是浏览器与服务器的接口。测试人员提交事务,然后查看服务器记录,并验证在浏览器上看到的正好是服务器上发生的。测试人员还可以查询数据库,确认事务数据已正确保存。
  6.2外部接口
  有些web系统有外部接口。例如,网上商店可能要实时验证信用卡数据以减少欺诈行为的发生。测试的时候,要使用web接口发送一些事务数据,分别对有效信用卡、无效信用卡和被盗信用卡进行验证。也就是说,测试人员需要确认软件能够处理外部服务器返回的所有可能的消息。
  6.3错误处理
  接口的错误处理是最容易被忽略的地方。通常我们试图确认系统能够处理所有错误,但却无法预期系统所有可能的错误。尝试在处理过程中中断事务,尝试中断用户到服务器的网络连接,尝试中断web服务器到信用卡验证服务器的连接。在这些情况下,看看会发生什么情况?系统能否正确处理这些错误?
版权声明:本文出自 Giant321 的51Testing软件测试博客:http://www.51testing.com/?506499
原创作品,转载时请务必以超链接形式标明本文原始出处、作者信息和本声明,否则将追究法律责任。

posted @ 2014-01-02 09:36 顺其自然EVO 阅读(667) | 评论 (0)编辑 收藏

Selenium定位不到元素的解决方法—iframe挡住了去路

 刚接触Selenium,在调试过程中发现有些元素定位不到,于是求助了百度,查找到的资料是这么说的:如果需要定位的元素在某个frame里,则单独通过id/name/xpath是定位不到此元素的。比如,原本想通过WebElement element=driver.FindElement(By.LinkText("XXX"));来定位元素的,但由于该元素在iframe. id="left_frame"这个frame里面,所以需要先定位frame,WebElement element=driver.SwitchTo().Frame("left_frame").FindElement(By.LinkText("XXX"));
  此外还有个问题,就是相关的操作是在不同的frame中定位元素的。比如,先在left_frame中定位元素Id=TestFor1,然后在right_frame中定位元素Id=TestFor2。这种情况下,先切到left_frame,driver.SwitchTo().Frame("left_frame");再定位元素TestFor1,driver.FindElement(By.Id("TestFor1"));再切到默认的content,driver.SwitchTo().DefaultContent();再切到right_frame,driver.SwitchTo().Frame("right_frame");再定位元素TestFor2,driver.FindElement(By.Id("TestFor2"));
  在实际应用中,该方法能解决元素无法定位的问题,写了个C#通用接口(不管元素是否在frame里面),如下:
  publicIWebElementGetElement(stringstrDefined,boolbFrame.=false)
  {
  try
  {
  // 如果元素不在frame中,则切到默认的content
  if(!bFrame)
  {
  _webDriver.SwitchTo().DefaultContent();
  }
  IWebElementele=null;
  stringstrFrame.=m_cc.GetElementFrame(strDefined);
  // 如果元素在frame里,先切到frame
  if(null!=strFrame.&&""!=strFrame)
  {
  IWebElementFrameEle=GetElement(strFrame,true);
  _webDriver.SwitchTo().Frame(FrameEle);
  }
  stringstrID=m_cc.GetElementID(strDefined);
  // 如果元素的ID为空,则通过XPath来定位元素
  if(""==strID)
  {
  stringstrXPath=m_cc.GetElementXPath(strDefined);
  else=_webDriver.FindElement(By.XPath(strXPath));
  }
  else
  }
  }
版权声明:本文出自 xiaobaiwdn 的51Testing软件测试博客:http://www.51testing.com/?367232
原创作品,转载时请务必以超链接形式标明本文原始出处、作者信息和本声明,否则将追究法律责任。

posted @ 2014-01-02 09:31 顺其自然EVO 阅读(3641) | 评论 (0)编辑 收藏

性能测试分享—JMeter篇

 这周尝试了一把性能测试,之前都是测试网站的性能测试,java接口的性能测试还是头一次,学到了很多,特此分享一下。
  主要用到了两个性能测试工具,一个是jmeter,一个是LoadRunner
  使用jmeter的测试方法:
  1、下载jemeter的linux版本的,下载的文件里包含了两个jar包,一个是ApacheJMeter_core.jar,ApacheJMter_java.jar。分别把这两个jar放到eclipse的Java Build Path的libraries下面。
  2、创建编写脚本的类,使他继承AbstractJavaSamplerClient。初步结构是
private SampleResult results;
public void setupTest(JavaSamplerContext arg0) {
results = new SampleResult();
}
public Arguments getDefaultParameters() {
Arguments params = new Arguments();
return params;
}
//测试执行的循环体,根据线程数和循环次数的不同可执行多次,类似于LoadRunner中的Action方法
public SampleResult runTest(JavaSamplerContext arg0) {
results.sampleStart();
results.sampleEnd();
results.setSuccessful(true);
return results;
}
//结束方法,实际运行时每个线程仅执行一次,在测试方法运行结束后执行,类似于LoadRunner中的end方法
public void teardownTest(JavaSamplerContext arg0) {
}
 将需要循环的业务流程放到runTest方法里。编写好的代码如下:
package app;
import http.HttpClient4;
import http.HttpParameter;
import http.HttpResp;
import http.JsonUtil;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;
import java.util.Random;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
import com.yeepay.g3.utils.common.encrypt.AES;
import com.yibao.utils.des3.RSA_Encrypt;
public class TheardTest extends AbstractJavaSamplerClient{
private SampleResult results;
public void setupTest(JavaSamplerContext arg0) {
results = new SampleResult();
}
public Arguments getDefaultParameters() {
Arguments params = new Arguments();
return params;
}
public static String ramdonNum(int num){
Random rd = new Random();
StringBuilder sb = new StringBuilder("");
if (num <1){
return null;
}
else{
for(int i=1;i<=num;i++){
int sr=rd.nextInt(9);
sb.append(String.valueOf(sr));
}
return sb.toString();
}}
public static void testCreditPay() throws ParseException{
String PUBLIC_KEY=TheardTest.testConsult();
HttpClient client = new HttpClient();
PostMethod method = new PostMethod("http://xxxxxxxx/xxxxxx/api/bankcard/credit/pay");
String key=TheardTest.ramdonNum(6);
String encryptkey = "0123456789"+key;
String merchantAccount = "YB01000000078";
//民生
String cardNo ="XXXXXXXXX";
String validthru="xxx7";
String cvv2 = "6xx";
String phone = "13xxxxxx5431";
String orderId = "33hhkssseef3utyt2"+key;
System.out.println(orderId);
Integer transtime = (int)(System.currentTimeMillis()/1000);
Integer currency = 156;
String  amount = "50";
String productcatalog = "1";
String productName = "123";
String productDesc = "小丸子";
String userIp = "123.45.45.45";
String identityId = "a";
Integer identityType = 6;
String other = "eeee";
String data = "{\"merchantaccount\":\"" + merchantAccount
+"\",\"cardno\":\"" + cardNo
+ "\",\"validthru\":\"" + validthru
+ "\",\"cvv2\":\"" + cvv2
+ "\",\"phone\":\"" + phone
+ "\",\"orderid\":\"" + orderId
+ "\",\"transtime\":" + transtime
+ ",\"currency\":" + currency
+ ",\"amount\":" + amount
+ ",\"productcatalog\":\"" + productcatalog
+ "\",\"productname\":\"" + productName
+ "\",\"productdesc\":\"" + productDesc
+ "\",\"userip\":\"" + userIp
+ "\",\"identityid\":\"" + identityId
+ "\",\"identitytype\":" + identityType
+ ",\"other\":\"" + other + "\"}";
data = AES.encryptToBase64(data, encryptkey);
try {
method.setParameter("merchantaccount", merchantAccount);
method.setParameter("data", data);
method.setParameter("encryptkey", RSA_Encrypt.encrypt(encryptkey, PUBLIC_KEY));
client.executeMethod(method);
System.out.println(method.getStatusLine());
String respStr = method.getResponseBodyAsString();
System.out.println(respStr);
String result = AES.decryptFromBase64(respStr, encryptkey);
System.out.println(result);
//                    自动退款
Map<String, Object> mapjson=JsonUtil.parse(result);
Object obj = mapjson.get("yborderid");
String yborderid=obj.toString();
System.out.println("流水号:"+yborderid);
TheardTest.refundTeseCase(yborderid,merchantAccount,amount);
method.releaseConnection();
} catch (HttpException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 测试协商接口
* @author shangwei
* @return
* @throws ParseException
*
*/
public static String testConsult() throws ParseException{
String url = "http://xxxxxxx/xxxxxx/consult";
HttpClient4 client =HttpClient4.createDefault();
String data = "";
Date d = new Date();
Calendar now = Calendar.getInstance();
now.setTime(d);
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateline=format.format(now.getTime());
System.out.println(dateline);
Date date = format.parse(dateline);
String dates=date.getTime()/1000+"";
System.out.println(dates);
try {
data = AES.encryptToBase64(dates, "12345678901234HH");
} catch (Exception e) {
e.printStackTrace();
}
HttpParameter parameter = new HttpParameter();
parameter.add("data", data);
parameter.add("merchantaccount", "YB01000000078");
HttpResp resp = new HttpResp();
try{
resp=client.doPost(url, parameter, "utf-8");
String respStr= resp.getText("utf-8");
System.out.println(respStr);
String aes=AES.decryptFromBase64(respStr, "12345678901234HH");
System.out.println(aes);
return aes;
}catch (HttpException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
client.shutdown();
return "出错啦";
}
public static void refundTeseCase(String yborderid,String merchantAccount,String amount) throws IOException{
String url ="http://xxxxxxxx/xxxxxxx/api/refund/direct";
HttpClient4 client =HttpClient4.createDefault();
HttpParameter parameter = new HttpParameter();
parameter.add("merchantaccount", merchantAccount);
parameter.add("merchantrefundid", "093032323");
parameter.add("transorderid", yborderid);
parameter.add("amount", amount);
HttpResp rep;
try {
rep = client.doPost(url, parameter,"utf-8");
System.out.println(rep.getStatusCode());
System.out.println(rep.getText("utf-8"));
}catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//测试执行的循环体,根据线程数和循环次数的不同可执行多次,类似于LoadRunner中的Action方法
public SampleResult runTest(JavaSamplerContext arg0) {
results.sampleStart();
try {
testCreditPay();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
results.sampleEnd();
results.setSuccessful(true);
return results;
}
//结束方法,实际运行时每个线程仅执行一次,在测试方法运行结束后执行,类似于LoadRunner中的end方法
public void teardownTest(JavaSamplerContext arg0) {
}
}
  3、将写好的class类和该类引入到的类都打成jar包,放到jemter文件的lib/ext文件下。将用到的其他的jar包放到lib文件夹下面。
  4、启动jemter后,创建先添加线程组,在添加sampler的java请求,如果之前步骤成功,在类名称下拉列表里会出现测试代码打好jar包的类。之后操作jemter进行测试就OK啦。
  下面在分享LoadRunner进行性能测试及环境优化。

posted @ 2014-01-02 09:24 顺其自然EVO 阅读(853) | 评论 (0)编辑 收藏

仅列出标题
共394页: First 上一页 164 165 166 167 168 169 170 171 172 下一页 Last 
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

导航

统计

常用链接

留言簿(55)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜