自动化测试框架的概念
自动化测试框架就是一个能够进行自动化测试的程序,其本质也是一堆“按照特定结构组织”的代码。自动化测试框架可以提高代码的可复用性、可维护性、可扩展性。
●可复用性:编写的代码不仅适用于一个模块和项目,同时也适用于其他的模块和项目
●可维护性:减少代码维护时的工作量,比如修改某个功能代码时,只需要修改一处即可,不需要每处代码去单独修改
●可扩展性:当要增加或者扩展功能时,可以不影响原有模块
框架设计比较灵活,并没有通用的标准来规定框架必须具备什么结构或功能,框架的目的只有一个,提高测试效率,降低测试成本。
两大核心功能
●驱动测试
○数据驱动(ddt)
○关键字驱动(kdt)
○页面驱动(pom)
●辅助测试
○数据管理
○报告管理
○配置管理
○日志管理等
测试驱动
数据驱动
将测试代码和测试数据分离,一般用于一个测试场景需要多个不同的测试数据的条件下。通过数据驱动测试,有多少条测试数据,测试就会执行多少次。如:unittest的ddt模块
关键字驱动
主打易用性,将测试代码、测试业务和测试数据相分离,灵活性高。
使用时,只需要考虑三个问题,对谁做,做什么,参数
关键字驱动的表达式:object.action(parameters)
data.txt
PowerShell复制代码
# 关键字驱动的脚本 # action;object;parameters goto;https://segmentfault.com/ delay;2 singleclick;xpath://nav[@class='p-0 navbar navbar-expand navbar-light'] singleclick;xpath://a[@data-mode='password'] delay;2 input;xpath://input[@placeholder="手机号或邮箱"];18423262925 input;xpath://input[@placeholder="密码"];xujiao5770 singleclick;xpath://button[@class='sflex-center btn btn-primary btn-block btn-lg']
util.py
PowerShell复制代码
# 导入Excel的模块 import openpyxl class Util: @classmethod def get_test_data_from_txt(cls, path): with open(path, 'r', encoding='utf-8') as f: cmds = [] while True: # 读取一行: line = f.readline() # 读取结束 if not line: break cmds.append(line.strip()) return cmds @classmethod def get_test_data_from_xlsx(cls, path): # 从Excel中读取数据 workbook = openpyxl.load_workbook(path) worksheet = workbook.active test_data = [] for row in range(2, worksheet.max_row + 1): cmd = '' for column in range(1, worksheet.max_column + 1): content = worksheet.cell(row=row, column=column).value if content: cmd += str(content) cmd += ';' test_data.append(cmd[:-1]) return test_data if __name__ == '__main__': # cmds = Util.get_test_data_from_txt('data.txt') cmds = Util.get_test_data_from_xlsx('data.xlsx') print(cmds)
keywords.py
PowerShell复制代码
from selenium import webdriver import time from selenium.webdriver.common.action_chains import ActionChains driver = webdriver.Chrome() driver.maximize_window() class KeyWord: @classmethod def goto(cls, *args): print('参数:{}'.format(args)) if args and len(args) >= 2: driver.get(args[1]) return True else: print('goto命令不正取,请检查') return False @classmethod def input(cls, *args): print('input的参数:{}'.format(*args)) if args and len(args) >= 3: element_split = args[1].split(':') # element_split[0]是查找定位的方式 # element_split[1]是要查找的元素 driver.find_element(element_split[0], element_split[1]).send_keys(args[2].strip()) return True else: print('input命令不正取,请检查') return False @classmethod def singleclick(cls, *args): print('singleclick的参数:{}'.format(args[1])) if args and len(args) >= 2: element_split = args[1].split(':') driver.find_element(element_split[0], element_split[1]).click() return True else: print('singleclick命令不正取,请检查') return False @classmethod def delay(cls, *args): print('睡眠参数:{}'.format(args[1])) if args and len(args) >= 2: time.sleep(int(args[1])) return True else: print('delay命令参数不正取,请检查') return False
run.py
PowerShell复制代码
from selenium import webdriver from util import Util from keywords import KeyWord def run_case_from_txt(): data = Util.get_test_data_from_txt('data.txt') for line in data: print('当前执行:{}'.format(line)) if line.startswith('#'): continue key_words = line.split(";") # 判断是否有这个方法 if hasattr(KeyWord, key_words[0]): # 调用关键字对应的方法 action = getattr(KeyWord, key_words[0]) result = action(*key_words) if not result: print('{}命令执行错误,测试终止'.format(action)) break else: print('{}命令执行成功'.format(action)) pass if __name__ == '__main__': ru