百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

自动化测试模型介绍

toyiye 2024-06-21 12:28 11 浏览 0 评论

在介绍自动化测试模型之前,我们试着来解释自动化测试库、框架和工具之间的区别。

  库的英文单词叫library,库是由代码集合成一个产品,供程序员调用,面向对象的代码组织形成的库叫类库,面向过程的代码组织形成的库叫函数库,所以从这个角度来看,我们以前学习的WebDriver就属于库的范畴,因为它提供了一组操作Web页面的类与方法,所以我们可以称它为Web自动化测试库。

  框架的英文单词叫Framework,框架是为解决一个或一类问题而开发的产品,用户一般只需要使用框架提供的类或函数,即可实现全部功能,所以从这个角度来理解unittest框架,它主要用于实现测试用例的组织和执行,以及测试结果的生成,因为它的主要任务就是帮助我们完成测试工作,所以我们通常把它叫做单元测试框架。

  工具的英文单词叫Tools,在笔者看来工具与框架所作的事情类似,只是工具会有更高的抽象,屏蔽了底层代码,一般会提供单独的操作界面供用户操作。例如,selenium IED和QTP就是自动化测试工具。

  回到自动化测试模型的概念上,笔者认为自动化测试模型可以看作自动化测试框架与工具设计的思想。随着自动化测试技术的发展,演化为以下几种模型:线性测试模块化驱动测试数据驱动测试关键字驱动测试

线性测试

  通过录制或编写对应程序的操作步骤产生相应的线性脚本,每个测试脚本相对独立,且不产生其他依赖与调用,这也是早期自动化测试的一种形式:他们其实就是单纯的来模拟用户完整的操作厂家。前几篇文章所用到的测试脚本都属于线性测试,如下代码:


  这种模型的优势就是每一个脚本都是完整且独立的。所以,任何一个测试用例脚本拿出来都可以单独执行。当然,缺点也是相当明显,测试用例的开发与维护成本很高:

  (1)开发成本很高,测试用例之间可能会存在重复的操作,不得不为每一个用例去录制或编写这些重复的操作。例如每个用例中重复的用户登录或退出操作等。

  (2)维护成本很高,正是因为测试用例之间存着重复的操作,所以当这些重复的操作发生改变时,就需要逐一地对它们进行修改。例如登录输入库的定位发生了改变,就需要对每一个包含登录的用例进行调整。

模块化驱动测试

  正是由于线性测试的缺陷非常明显,因此早期的自动化测试专家就考虑用新的自动化测试模型来代替线性测试。做法也很简单,借鉴了编程语言中模块化的思想,把重复的操作独立成公共模块,当用于执行过程中需要用到这一个模块操作时则被调用,这样就最大限度地消除了重复,从而提高测试用例的可维护性。

  需要说明的是,早期的自动化测试以工具为主。

  模块化的结构很好地解决了线性结构性的两个问题:

  (1)提高了开发效率,不用重复编写相同的操作脚本。假如,已经写好了一个登录模块,后续测试用例在需要登录的地方调用即可。

  (2)简化了维护的复杂性,加入登录按钮的定位发生了变化,那么只需要修改登录模块的脚本即可,对于所有调用登录模块的测试脚本来说不需要做任何修改。

数据驱动测试

  虽然模块化驱动测试很好地解决了脚本的重复问题,但是,自动化测试脚本在开发的过程还是发现了诸多不便。例如,现在我要测试不同用户的登录,首先用的是“张三”的用户名登录;下一次测试用例要换成“李四”的用户名登录。在这种情况下,还是需要重复的编写登录脚本,因为虽然登录的步骤相同,但是登录所用的测试数据不同。

  于是,数据驱动测试的概念就为了解决这类问题而被提出。从它的本意来解释,就是数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变。这听上去的确是个高大上的概念,而在早期的商业自动化工具中,也的确把这一概念作为一个卖点。对于数据驱动所需要的测试数据,也是通过工具内置的Datapool管理。

  如下代码所示,数据驱动说得直白点就是数据的参数化,因为输入数据的不同从而引起输出结果的不同。


 不管我们读取的是自定义数组、字典,或者是外部文件(excel、csv、txt、xml等),都可以看作是数据驱动,它的毛菊地就是实现数据与脚本的分离。

  这样做的好处同样显而易见,它进一步增强了脚本的复用性。同样以登录为例,首先是重新设计登录模块,使其可以接收不同的数据,把接收到的数据作为登录操作的一部分,这样可以很好地适应相同操作、不同数据的情况。

关键字驱动测试

  理解了数据驱动后,无非是把“数据”换成了“关键字”,通过关键字的改变引起测试结果的改变。

  目前市面上典型的关键字驱动工具以QTP(目前已更名为UFT-Unified Functional Testing)、Robot Framework(RIDE)工具为主。这类工具封装了底层的代码,提供给用户独立的图形界面,以“填表格”的形式免除测试人员对写代码的恐惧,从而降低脚本的编写难度,我们只需要使用工具所提供的关键字以“过程式”的方式来编写用例即可。

  当然,Selenium家族中Selenium IDE也可以看作是一种传统的关键字驱动的自动化工具。

Baidu Test Case (Selenium IDE)

open

http://www.baidu.com


type

Id=kw

selenium

click

Id=su

 上面的脚本由Selenium IDE录制产生,它把每一个动作分为三部分:

  1. 做什么?例如打开、输入、点击等操作。
  2. 对谁做?通过定位方式找到要操作的对象。
  3. 如何做?例如输入框输入的内容为“selenium”等。

  当然,关键字驱动技术也在不断发展和进步。下面以功能更为强大的关键字驱动测试框架Robot Framework为例,它也可以像变成一样写测试用例。

  1. If分支语句

If(Robot Framework)

${a}

Set variable

2



${b}

Set variable

5



Run keyword if

${a}>=1

log

a大于1


...

ELSE IF

${b}>=1

log

b小于或等于5

...

ELSE

log

上面两个条件都不满足


首先,定义a,b两个变量,分别赋值2和5;然后,通过run keyword is关键字判断a是否大于或等于1,如果满足条件则通过Log输出“a大于或等于1”,否则继续判断b是否小于或等于5,如果满足条件则通过Log输出“b小于或等于5”。如果以上两个条件都不满足,则通过log输出“以上两个条件都不满足”。

  1. for循环

For(Robot Framework)

:FOR

${I}

in range

10



log

${i}



这个例子很好理解,for循环i从1到10,每循环一次都通过log输出i的值。

  1. 读取外部文件

ReadFlie(Robot Framework)

Import Resource

${CURDIR;/resource.txt}

Import Resource

${CURDIR;/../resource//resource.html}

通过Import Resource关键字读取指定的外部文件。

  1. import引入外部类库

Import(Robot Framework)

Import Libray

MyLibrary



Import Libray

${CURDIR;/Libaray.py}

csom

args

Import Libray

${CURDIR;/../libs/Lib.java}

arg

WITHNAME

JavaLib


  首先,定义a,b两个变量,分别赋值2和5;然后,通过run keyword is关键字判断a是否大于或等于1,如果满足条件则通过Log输出“a大于或等于1”,否则继续判断b是否小于或等于5,如果满足条件则通过Log输出“b小于或等于5”。如果以上两个条件都不满足,则通过log输出“以上两个条件都不满足”。

  2.for循环

For(Robot Framework)

:FOR

${I}

in range

10



log

${i}



  这个例子很好理解,for循环i从1到10,没循环一次都通过log输出i的值。

  3.读取外部文件

ReadFlie(Robot Framework)

Import Resource

${CURDIR;/resource.txt}

Import Resource

${CURDIR;/../resource//resource.html}

  通过Import Resource关键字读取指定的外部文件。

  4.import引入外部类库

Import(Robot Framework)

Import Libray

MyLibrary



Import Libray

${CURDIR;/Libaray.py}

csom

args

Import Libray

${CURDIR;/../libs/Lib.java}

arg

WITHNAME

JavaLib

  通过Import Libray关键字引入外部文件,

  关键字驱动也可以像写代码一样写用例,在变成的世界中,没有什么不能做;不过这样的用例同样需要较高的学习成本,与学习一门编程语言几乎相当。这样的框架越到后期越难维护,可靠性也会变差,关键字的用途与经验被局限在自己的框架内,你所学到的知识也很难用到其他地方。所以,从测试人员的经验与技术积累价值来讲,笔者更倾向于直接通过编程的方式开发自动化脚本。

  这里简单介绍了几种测试模型的发展过程与特点,虽然是从自动化测试模型的发展顺序逐一介绍的,但他们并非后者淘汰前者的关系。在实际自动化实施过程中,应以项目需求为出发点,综合运用上述模型来开展自动化测试。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码