自动化测试框架就是一个能够进行自动化测试的程序,其本质也是一堆“按照特定结构组织”的代码
使用自动化测试可提供代码的可复用性、可维护和可扩展性
框架设计比较灵活,并没有通用的标准来规定框架必须具备什么结构或功能,框架的目的只有一个,就是提高测试效率,降低测试成本
可复用性:编写的代码不仅只适用于一个模块或项目,同时也适用于其他的项目或模块,这个叫复用性
可维护性:减少代码维护时的工作量,比如需要修改某个功能的代码时,只需要修改一处即可,不需要每处代码去单独修改
可扩展性:当要增加或者是扩展功能时,可以不影响别的模块
自动化测试框架的两大核心功能:驱动测试、辅助测试
驱动测试:数据驱动(ddt) 关键字驱动(KDT)页面驱动(POM)
辅助测试:数据管理 报告管理 配置管理 日志管理等
测试驱动之数据驱动:
将测试代码和测试数据分离,一般用于一个测试场景需要多个不同的测试数据的条件下
通过数据驱动测试(有多少条测试数据,测试就会执行多少次)
典型的应用:unittest的ddt模块
关键字驱动的表达式:object.action(parameters)
关键字驱动将测试代码、测试业务和测试数据相分离
遇到某些xpath当中有逗号,干扰了参数解析,解决方法:
1.换一个分隔符,比如#
2.不用txt来写脚本,用excel等文档格式
data.txt
goto#http://localhost:8080/mms
input#id=username#admin
input#id=password#admin123
delay#1
singleclick#xpath=//input[contains(@onclick,"Login()")]
delay#1
checktext#id=loginName#admin
delay#1
singleclick#xpath=//div[text()="信息录入"]
delay#1
singleclick#xpath=//span[text()="录入顾客信息"]
delay#5
#droplist#xpath=/html/body/div[1]/div[3]/div/div[2]/div/div/div/div/form/div/div[1]/select#女
delay#5
over
keywords.py
import time
from time import sleep
class KeyWords:
@classmethod
def goto(cls,driver,*args):
if args and len(args)>=2:
driver.get(args[1]) #args[0]是goto这个关键字,args[1]是用户指定的url地址
return True
else:
print("goto命令参数不正确,请检查")
return False
@classmethod
def input(cls,driver,*args):
if args and len(args)>=3:
if 'xpath' in args[1]:
locate_way='xpath'
locator=args[1][6:]
value=args[2].strip()
else: #用id定位
locate_way='id'
locator=args[1][3:]
value=args[2].strip()
driver.find_element(locate_way,locator).send_keys(value)
return True
else:
print("input命令参数不正确,请检查")
return False
@classmethod
def singleclick(cls,driver,*args):
if args and len(args)>=2:
if 'xpath' in args[1]:
locate_way='xpath'
locator=args[1][6:]
else: #用id定位
locate_way='id'
locator=args[1][3:]
driver.find_element(locate_way,locator).click()
return True
else:
print("singleclick命令参数不正确,请检查")
return False
@classmethod
def delay(cls,driver,*args):
if args and len(args) >= 2:
sleep(int(args[1])) #sleep("1")
return True
else:
print("delay命令参数不正确,请检查")
return False
@classmethod
def checktext(cls,driver,*args):
if args and len(args)>=3:
if 'xpath' in args[1]:
locate_way='xpath'
locator=args[1][6:]
value=args[2].strip()
else: #用id定位
locate_way='id'
locator=args[1][3:]
value = args[2].strip()
element=driver.find_element(locate_way,locator).text
if value in element:
print("文字检查成功,要检查的文字",value,"在文字",element,"内")
else:
print("文字检查失败,要检查的文字", value, "不在文字", element, "内")
return True
else:
print("checktext命令参数不正确,请检查")
return False
@classmethod
def over(cls,driver,*args):
driver.quit()
print("测试结束,关闭浏览器")
return True
@classmethod
def droplist(cls,driver,*args):
driver.maximize_window()
time.sleep(3)
if args and len(args)>=3:
if 'xpath' in args[1]:
locate_way='xpath'
locator=args[1][6:]
value=args[2].strip()
else: #用id定位
locate_way='id'
locator=args[1][3:]
value=args[2].strip()
from selenium.webdriver.support.ui import Select
Select(driver.find_element(locate_way,locator)).select_by_value(value)
return True
else:
print("droplist命令参数不正确,请检查")
return False
util.py
import openpyxl
class Util:
@classmethod
def get_test_data_from_txt(cls,path):
cmd=[]
with open(path,'r',encoding='utf8') as f:
while True:
line=f.readline() #读取一行
if not line: #读取结束
break
if not line.startswith('#'):
cmd.append(line.strip())
return cmd
@classmethod
def get_test_data_from_excel(cls,path):
book=openpyxl.load_workbook(path)
sheet=book.active
test_data=[]
for row in range(2,sheet.max_row+1):
cmds=''
for col in range(1,sheet.max_column+1):
content=sheet.cell(row=row,column=col).value
if content:
cmds+=str(content)
cmds+='#'
test_data.append(cmds[:-1])
return test_data
if __name__=='__main__':
cmd=Util.get_test_data_from_excel('123.xlsx')
print(cmd)
run.py
from selenium import webdriver
from util import Util
from keywords import KeyWords
def run_case(driver):
test_data=Util.get_test_data_from_excel('123.xlsx')
for line in test_data:
print("当前执行的是:{}".format(line))
key_words=line.split('#')
if hasattr(KeyWords,key_words[0]):
action=getattr(KeyWords,key_words[0])
result=action(driver,*key_words)
if not result:
print("命令执行错误,测试终止")
break
else:
print("命令执行成功")
if __name__=="__main__":
driver=webdriver.Chrome()
run_case(driver)