整理不易,希望对各位学习软件测试能带来帮助
第四章 自动化测试模型
一个自动化测试框架就是一个集成体系,在这一体系中包含测试功能的函数库、测试数据源、测试对象识别标准,以及种可重用的模块。自动化测试框架在发展的过程中经历了几个阶段,模块驱动测试、数据驱动测试、对象驱动测试。本章就带领读者了解这几种测试模型。
第一节、自动化测试模型介绍
自动化测试模型是自动化测试架构的基础,自动化测试的发展也经历的不同的阶段,不断有新的模型(概念)被提出,了解和使用这些自动化模型将帮助我们构建一个灵活可维护性的自动化架构。
4.1.1 线性测试
通过录制或编写脚本,一个脚本完成一个场景(一组完整功能操作),通过对脚本的回放来进行自动化测试。这是早期进行自动化测试的一种形式;我们在上一章中练习使用 webdriver API 所编写的脚本也是这种形式。
测试脚本一
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 ()
通过上面的两个脚本,我们发现它优势就是每一个脚本都是独立的,任何一个脚本文件拿出来就能单
独运行;当然,缺点也很明显,用例的开发与维护成本很高:
一个用例对应一个脚本,假如登陆发生变化,用户名的属性发生改变,不得不需要对每一个脚本进行
修改,测试用例形成一种规模,我们可能将大量的工作用于脚本的维护,从而失去自动化的意义。
这种模式下数据和脚本是混在一起的,如果数据发生变也需要对脚本进行修改。这种模式下脚本的没
有可重复使用的概念。
4.1.2 模块化与类库
我们会清晰的发现在上面的脚本中,其实有不少内容是重复的;于是我们就考虑能不能把重复的部分
写成一个公共的模块,需要的时候进行调用,这样就大大提高了我们编写脚本的效率。
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 文件中登录模块的代
码即可,那么所有调用登录模块的脚本不用做任何修改。
4.1.3 数据驱动
数据驱动应该是自动化的一个进步;从它的本意来讲,数据的改变(更新)驱动自动化的执行,从而
引起测试结果的改变。这显然是一个非常高级的概念和想法。其实,我们可直白的理解成参数化,输入数据的不同从而引起输出结果的变化。
#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 自动化工具来说地确是一个卖点,因为它面对的大多是不懂开发的测试,当然,随着时代的发展,懂开发的测试人员越来越多。
4.1.4 关键字驱动
理解了数据驱动,无非是把“数据”换成“关键字”,通过关键字的改变引起测试结果的改变。
关键字驱动用编程方式就不太容易表现了。QTP、robot framework 等都是以关键字驱动为主的自动
化工具,因为这类工具主打的易用性,“填表格”式的关键字驱动帮我们封装了很多底层的东西,我们只
要考虑三个问题就可以了:我要做什么? 对谁做?怎么做?。
我们可以把 selenium IDE 看做是一种关键字驱动的自动化工具。