自动化测试模型
名词解释
自动化测试库、框架和工具之间的区别:
- 【库】是有代码集合组成的一个产品,供程序员调用,面向对象的代码组织形成的库叫类库,WebDriver就属于库的范畴,它提供了一组操作web页面的类与方法,所有称它为{Web自动化库}
- 【框架】为解决一个或一类问题而开发的产品,用户一般只需要使用框架提供的类或函数,即可以实现功能,如:unittest框架主要用于实现测试用例的组织和执行,以及测试结果生成,帮助我们完成测试工作,所以把它叫做单元测试框架;
- 【工具】工具和框架做的事情类型,只是工具会更加抽象,屏蔽了底层的代码,提供了单独操作界面。例如:Selenium IDE和QTP就是自动化测试工具;
自动化测试模型
自动化测试模型可以看作【自动化测试框架】和 【工具】设计思想结合;
自动化测试技术的发展,演化为以下几种模型:
- 线型测试
- 模块化驱动测试
- 数据驱动测试
- 关键字驱动测试
二、自动化测试模型介绍
1)线性测试
编写对应用程序的操作步骤产生相应的线性脚本,每个测试脚本相对独立,且不产生其他依赖与调用,其实就是单纯的来模拟用户完整的操作场景。
线性测试的优势:每个脚本都是完整且独立的。所以,任何一个测试用例脚本都可以单独执行。
缺点:测试用例的开发和维护成本很高。
- 开发成本很高,测试用例之间可能会存在重复操作,需要为每一个用例去编写重复的操作。例如:每个用例中重复的用户登录和退出操作等。
- 维护成本很高,用例之间存在重复操作,当这些重复操作发生改变时,就需要逐一对它们进行修改。例如:登录输入框的定位发生了改变,就需要对每一个包含登录的用例进行调整。
2)模块化驱动测试
把重复的操作作为独立成公共模块,当用例执行过程中需要用到这一模块操作时则被调用,这样就最大限度消除了重复,从而提高测试用例的可维护性。
- 提高开发效率,不用重复编写相同的操作脚本。例如:已经写好一个登录模块,后续测试用例在需要登录的地方调用即可。
- 简化了维护的复杂性,例如登录按钮的定位发生了变化,那么只需要修改登录模块的脚本即可,对所有调用登录模块的测试脚本来说不需要任何修改;
3)数据驱动测试
虽然模块化驱动测试已经很好解决了脚本的重复问题,但是自动化测试脚本在开发过程中还是发现很多不方便。例如:要测试不同用户的登录,首先用的是张三用户名登录,下一个测试用例要换成“李四”的用户名登录,这种情况下还是需要重复地编写登录脚本,因为虽然登录的步骤相同,但是登录所用的测试数据不同,于是数据驱动测试的概念就为解决这类问题而被提出。
3.1 读取txt文件
txt文件是我们经常操作的文件类型,Python提供了以下几种读取txt;
- read() 读取整个文件;
- readline() 读取一行数据;
- readlines() 读取所有行的数据;
例子
百度参数化关键字搜索
baidu.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from selenium import webdriver
from time import sleep
driver = webdriver.Ie();
url ="https://www.baidu.com/" ;
driver.maximize_window();
driver.get(url)
driver.implicitly_wait(5)
search_text =[]
with open("user_info.txt","r+") as fr:
for line in fr:
if line.strip()=='':continue;
text,paswod = line.strip().split(",")
# print(text,paswod)
search_text.append(text)
search_text.append(paswod)
# print(search_text)
for text in search_text:
print(text)
driver.find_element_by_xpath("//*[@id='kw']").send_keys(text);
driver.find_element_by_xpath("//*[@id='su']").click();
sleep(5)
driver.back();
sleep(5)
driver.close();
user_info.txt
python,java
c,javascript
c#,HTML
3.2、读取csv文件
读取一组多数据时使用csv,通过WPS表格或Excel创建表格,文件另存为CSV格式进行保存。
import csv #导入csv包
#读取本地csv文件,list类型
date = csv.reader(open('info.csv','r+)
#循环输出每一行信息
for user in date:
print(user)
例子:
目录结构:
bbs目录:
mailTest.py
public.py
user_info.txt
mailTest.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from selenium import webdriver
from selenium.webdriver import ActionChains
from public import Login
from time import sleep
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
if __name__ == '__main__':
driver = webdriver.Chrome();
url ="http://xxooo/bbs/forum.php"
driver.implicitly_wait(10)
# # 获取首页窗口句柄
sreach_windows = driver.current_window_handle;
driver.get(url)
# # 创建Login类对象user
driver.maximize_window()
user_dict ={}
user_dict.values()
# 调用登录模块
with open("user_info.txt",'r+') as fr:
for line in fr:
if line.strip()=='':continue;
username ,password = line.strip().split("|");
# print(username,password)
user_dict[username] =password;
# print(user_dict)
for line ,password in user_dict.items():
print(line ,password)
user = Login(driver,line,password)
user.user_login();
# user.user_logout();
public.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from selenium import webdriver
from time import sleep
class Login:
def __init__(self,driver,username,password):
self.driver = driver;
self.user = username;
self.password = password;
print(self.user)
print(self.password)
# 登录
def user_login(self):
sleep(5)
self.driver.find_element_by_xpath(".//*[@id='ls_username']").send_keys(self.user)
self.driver.find_element_by_xpath(".//*[@id='ls_password']").send_keys(self.password)
self.driver.find_element_by_xpath(".//*[@id='lsform']/div/div/table/tbody/tr[2]/td[3]/button").click();
print("我是登录")
self.driver.find_element_by_xpath(".//*[@id='um']/p[1]/a[5]").click()
sleep(10)
# 退出
def user_logout(self):
print("退出啊")
self.driver.find_element_by_xpath(".//*[@id='um']/p[1]/a[5]").click()
sleep(10)
self.driver.close()
例二、163邮箱登录、发邮件
目录结构:
email163目录
EmaiTest.py
public163.py
EmaiTest.py
from selenium import webdriver from time import sleep from public163 import Login def write_email(driver): driver.find_element_by_class_name("oz0")[1].click(); sleep(2); # 收件人 driver.find_element_by_class_name("nui-editableAddr-ipt").clear(); driver.find_element_ty_class_name("nui-editableAddr-ipt").send_keys("xxxxxxxxx@qq.com") ; #主题 driver.find_element_by_class_name("nui-ipt-input").clear(); driver.find_element_by_class_name("nui-ipt-input").send_keys("自动化测试发的邮件啊") #正文 sleep(3) frame = driver.find_element_by_class_name("APP-editor-iframe"); driver.switch_to_frame(frame); driver.find_element_by_xpath("//body[@class='nui-scroll']").click(); driver.find_element_by_xpath("//body[@class='nui-scroll']").send_keys("2017年写的新代码测试发送啊 "); driver.switch_to_default_content(); #点击发送 driver.find_element_by_xpath(".//div[@class='nui-toolbar-item']/div[1]/span[2]").click(); if __name__ == '__main__': driver = webdriver.Chrome(); driver.maximize_window(); driver.implicitly_wait(10) url ="http://mail.163.com" ; driver.get(url); sleep(5) # 首页未登录页面title title = driver.title; print(title) # 首页未登录url now_url = driver.current_url; print(now_url); # 创建公共模块Login对象; user_obj = Login(driver); # 登录 user_obj.user_login() # 打印登录后title title = driver.title(); print(title) # 打印登录后url now_url = driver.current_url; print(now_url); #获取登录后的用户名 urser=driver.find_element_by_id("spnUid").text; print("\033[1;31m登录成功{0}\033[0m".format(urser)) # 发邮件 write_email(driver); # 退出 user_obj.user_logout()
public163.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from selenium import webdriver;
from time import sleep
class Login:
def __init__(self,drive):
self.drive = drive;
# 登录方法
def user_login(self):
self.drive.switch_to_frame("x-URS-iframe") ;
self.drive.find_element_by_name('email').clear();
# 输入邮箱账号
self.drive.find_element_by_name('email').send_keys('13580xxxxxx')
sleep(3);
self.drive.find_element_by_name('password').clear();
self.drive.find_element_by_name('password').send_keys('xxooxxoox');
self.drive.find_element_by_id("dologin").click()
sleep(3)
# 登录后,退出表单操作;
self.drive.switch_to_default_content()
#退出方法
def user_logout(self):
self.drive.find_element_by_link_text("退出").click();
self.driver.quit();
浙公网安备 33010602011771号