自动化测试模型
自动化测试框架包含了一系列的方法,在其发展的过程中经历了线性测试,模块驱动测试,数据驱动测试,关键字驱动测试等阶段。
1.自动化测试模型
- 线性测试
线性测试的特点是一个脚本即为一个完整的功能场景的操作,每一个脚本都是独立的,可以单独运行的,但是维护成本较高,因为每个独立的脚本中重复的内容较多,一个地方改变,就需要我们对多个测试脚本进行改变。
- 模块驱动测试
模块驱动测试较线性测试,把重复的代码提取到一个公共的模块,然后在我们需要的时候,只需要调用这个公共的模块,这样当修改时我们只需要修改这个公共的模块,大大提供了编写脚本的效率。
- 数据驱动测试
数据驱动测试即把测试数据和测试脚本分离,通过测试数据的改变驱动自动化的执行,从而产生不同的测试结果。
- 关键字驱动测试
关键字驱动测试即通过关键字驱动自动化的执行,从而产生测试结果,但是这种方法使得我们学习的关键字编写语法只能针对某一个测试框架,不能用于其他测试代码的编写,推荐使用编程方式开发自动化脚本。
2.模块驱动测试示例
这里模拟登陆126邮箱,然后点击写信按钮,再退出126邮箱,把登陆操作和退出操作封装成方法,方便后续维护,因为我们在测试126邮箱的发件,收件等用例时都需要登陆邮箱,退出邮箱,后续我们想要修改登陆或者退出操作的脚本,只需要修改一个地方即可,大大提高了可维护性。
1 demo01.py 2 3 # -*- coding:utf-8 -*- 4 from selenium import webdriver 5 import login_logout 6 7 driver = webdriver.Firefox() 8 # 隐式等待5秒 9 driver.implicitly_wait(5) 10 driver.get("https://www.126.com") 11 # 登录126邮箱 12 login_logout.login(driver) 13 driver.find_element_by_xpath("//div[@id='dvNavTop']//span[text()='写 信']").click() 14 # 退出126邮箱 15 login_logout.logout(driver) 16 17 login_logout.py 18 19 # -*- coding:utf-8 -*- 20 from selenium import webdriver 21 22 23 def login(driver): 24 # 切换到内嵌iframe 25 driver.switch_to.frame(driver.find_element_by_css_selector("#loginDiv>iframe")) 26 # 定位到email输入框 27 user_name = driver.find_element_by_css_selector("#login-form input[name='email']") 28 # 清空已经存在的内容 29 user_name.clear() 30 # 输入email 31 user_name.send_keys("angelszhu") 32 # 定位到password输入框 33 password = driver.find_element_by_css_selector("#login-form input[name='password']") 34 # 清空已经存在的内容 35 password.clear() 36 # 输入密码 37 password.send_keys("Test6530") 38 # 定位登录按钮 39 login_button = driver.find_element_by_css_selector("#dologin") 40 # 点击登录按钮进行登录 41 login_button.click() 42 # 返回到父框架 43 driver.switch_to.parent_frame() 44 45 46 def logout(driver): 47 driver.find_element_by_xpath("//*[@class='frame-head']//a[text()='退出']").click()
3.数据驱动测试
a.读取txt文件数据
Python提供了以下几种读取文件的方式:
read():读取整个文件
readline():读取一行数据
readlines():读取所有行的数据
1 user_info.txt 2 zhangsan,123456 3 boxiaoyuan,123 4 lisi,222 5 6 demo01.py 7 # -*- coding:utf-8 -*- 8 9 user_info = open("user_info.txt") 10 lines_value = user_info.readlines() 11 12 for line in lines_value: 13 username = line.split(",")[0] 14 password = line.split(",")[1] 15 print(username + "," + password) 16 print() 17 user_info = open("user_info.txt") 18 while True: 19 line = user_info.readline() 20 if line: # 如果不为空,则输出内容 21 print(line) 22 else: 23 break
b.读取csv文件数据
csv文件内容
1 zhangsan,123456,男,12 2 boxiaoyuan,123,女,17 3 lisi,222,男,22
按行读取csv文件数据
1 # -*- coding:utf-8 -*- 2 import csv 3 4 csv_values = csv.reader(open("user.csv")) 5 6 for csv_value in csv_values: 7 print(csv_value) # 按行读取数据
按列读取csv文件数据
1 # -*- coding:utf-8 -*- 2 import csv 3 4 csv_values = csv.reader(open("user.csv")) 5 6 for csv_value in csv_values: 7 print(csv_value[1]) # 读取csv文件第一列
c.读取xml文件数据
xml.dom.minidom模块被用来处理xml文件,需要先引入。
xml.dom.minidom.parse()用来打开一个xml文件。
documentElement 用来得到dom对象的文档元素。
每个节点都有nodeName(节点名字),nodeValue(节点的值,只对文本节点有效),nodeType(节点的类型)属性。
1 # -*- coding:utf-8 -*- 2 import xml.dom.minidom 3 4 # 打开xml文档 5 dom = xml.dom.minidom.parse("info.xml") 6 # 得到文档元素对象 7 root = dom.documentElement 8 # getElementsByTagName()可以通过标签名获取某个标签,它所获取的对象是以数组形式存放 9 tagname = root.getElementsByTagName("maxid") 10 # 获取标签名字 11 print(tagname[0].tagName) 12 13 logins = root.getElementsByTagName("login") 14 # getAttribute()方法可以获得元素的属性值 15 print(logins[0].getAttribute("username")) 16 17 captions = root.getElementsByTagName("caption") 18 # 返回被选节点的第一个子节点,data表示获取该节点的数据 19 print(captions[0].firstChild.data)