自动化测试模型
一个自动化测试框架就是一个集成体系,在这一体系中包含测试功能的函数库,测试数据源,测试对象识别标准,以及可重用的模块,自动化测试框架在发展历程中经历了几个阶段,模块驱动测试,数据驱动测试,对象驱动测试,下面就介绍一下这几种模型
自动化测试模型的介绍
自动化测试模型是自动化测试架构的基础,自动化测试的发展也经历的不同的阶段,不断有新的模型被提出,了解和使用这些模型将帮助我们构建一个灵活可维护的自动化测试框架
线性测试
通过录制或编写脚本,一个脚本完成一个场景,通过对脚本的回放来进行自动化测试,这是早期进行自动化测试的一种形式,
测试脚本一:
from selenium import webdriver import time driver = webdriver.Firefox() driver.get("http://wwww.xxx.com") driver.find_element_by_id("tbUserName").send_keys("username") driver.find_element_by_id("tbPassword").send_keys("123456") driver.find_element_by_id("btnLogin").click() #执行具体用例操作 ...... driver.quit
测试脚本二:
from selenium import webdriver import time driver = webdriver.Firefox() driver.get("http://wwww.xxx.com") driver.find_element_by_id("tbUserName").send_keys("username") driver.find_element_by_id("tbPassword").send_keys("123456") driver.find_element_by_id("btnLogin").click() #执行具体用例操作 ...... driver.quit ()
通过上面的两个脚本,我们发现它优势就是每一个脚本都是独立的,任何一个脚本文件拿出来就能单独运行,当然,缺点也很明显,用例的开发和维护成本很高
一个用例对应一个脚本,假如登陆发生变化,用户名的属性发生改变,不得不对每一个脚本进行修改,测试用例形成一种规模,我们可能将大量的工作用于脚本的维护,从而失去自动化的意义
这种模式下的数据和脚本混在一起,如果数据发生改变也需要对脚本进行修改,这种模式下脚本没有可重复使用的概念
模块化与类库
我们会清晰的发现上面的脚本中,其实有不少内容是重复的,于是我们就考虑能不能把重复的部分写成一个公共的模块,需要的时候进行调用,这样就打打提高了我们编写脚本的效率
login.py
#登录模块 def login(): driver.find_element_by_id("tbUserName").send_keys("username") driver.find_element_by_id("tbPassword").send_keys("456123") driver.find_element_by_id("btnLogin").click()
quit.py
#退出模块 def quit_(): #coding=utf-8 from selenium import webdriver import login,quit_ #调用登录、退出模块 driver = webdriver.Firefox() driver.get("http://wwww.xxx.com") #调用登录模块 login.login() #其它个性化操作 ...... #调用退出模块 quit.quit_()
通过阅读上面的代码发现,我们可以把脚本中相同的部分代码独立出来,形成模块或库;这样做有两方面的优点
一方面提高了开发效率,不用重复的编写相同的脚本;假如,我已经写好一个登录模块,我后续需要做的就是在需要的地方调用,不同重复造轮子
另一方面方便了代码的维护,假如登录模块发生了变化,我只用修改 login.py 文件中登录模块的代码即可,那么所有调用登录模块的脚本不用做任何修改。
数据驱动
数据驱动应该是自动化的一个进步,从它的本意上来讲,数据的改变(更新)驱动自动化的执行,从而引起测试结果的改变,这显然是一个非常高级的概念和想法,其实我们可以直白的理解成参数化,输入数据的不同从而引起输出结果的变化
#coding=utf-8 from selenium import webdriver import time values=['selenium','webdriver',u'俊杰'] # 执行循环 for serch in values: driver = webdriver.Firefox() driver.get("http://www.xxxx.com") driver.find_element_by_id("kw").send_keys(serch) time.sleep(3) .....
不管我们读取的是数组,还是字典、函数,又或者是 csv、txt 文件。我们实现了数据与脚本的分离换句话说,我们实现了参数化。我们传一千条数据,通过脚本的执行,可以返回一千条结果出来
同样的脚本执行不同的数据从而得到了不同的结果,是不是增强的脚本的复用性呢!
关键字驱动:
理解了数据驱动,无非是把“数据”换成“关键字”,通过关键字的改变引起测试结果的改变
关键字驱动用编程方式就不太容易表现了。QTP、robot framework 等都是以关键字驱动为主的自动化工具,因为这类工具主打的易用性,“填表格”式的关键字驱动帮我们封装了很多底层的东西,我们只要考虑三个问题就可以了:我要做什么? 对谁做?怎么做?