1.内容介绍
- 什么是关键字驱动?
- 如何设计关键字驱动?
- 具体如何实现的?
- 框架详细分析
2.什么是关键字驱动
2.1.解决什么问题?
在回归测试的时候有很多重复测试的用例,我们希望这部分用例能自动化执行,减少人的重复性劳动。使用传统的全写代码模式进行自动化测试,如果测试人员不懂代码,那么自动化测试就无法开展,对技能要求太高,能不能有这个样的一个工具或框架,部分测试人员不写代码也能进行自动化测试?
我们先来看看之前我们设计的用例。
我们要怎样把上面的用例做成自动化用例?让代码实现如下功能。
- 打开浏览器
- 输入网站
- 输入框输入内容
- 点击搜索按钮
- 自动判断结果并把结果写回excle
2.2.如何来做?
如果用以前的用例格式来直接转换成自动化用例能行吗?
- 操作步骤每个人的描述不一致,无法通过程序准确调用某功能。
- 操作步骤中没有提供具体的元素定位及操作方法,代码上如何才能明白你操作的那个按钮?
- 结果验证方法也需要调用程序代码,需要告诉程序通过什么验证。
我的设计方法:
- 操作浏览器的方法都固定下来,不能变。
- 操作方法需要的字段(定位方法,定位表达式,操作的值)用单独的列表示。
- 程序运行异常后需要有错误信息和错误截图
2.3.概念
我们把上面的这种设计方法叫做关键字驱动,总结以下两点。
- 关键字驱动框架是一种功能自动化测试框架
- 被称为表格驱动测试
- 被称为基于动作字的测试。
- 关键字驱动的框架的重要组成部分
- 测试步骤(Test Step),
- 测试步骤中的对象(Test Object) --鼠标、键盘、浏览器等对象
- 测试对象执行的动作(Action)
- 测试对象需要的数据(Test Data)
3.如何设计关键字驱动
3.1.如何设计程序?
从上面设计的用例出发,我们依次来分析需要实现的功能。
我们希望的是自动化框架脚本能读取每一行用例,然后在执行后把测试结果也填好,如果执行出错要有错误信息、错误截图。那我们需要完成以下代码的编写。
- Excel操作(读、写)
- 读取关键字名称、操作元素定位方式、操作元素定位表达式、操作值
- 执行完成后写入执行时间、测试结果、错误信息、截图文件位置
- 根据关键字名称、操作元素定位方式、操作元素定位表达式、操作值开发web操作脚本
- 执行用例的方法脚本
- 错误信息记录方法脚本
- 错误截图方法脚本
3.2.Cases编写
主要实现根据excel表格中的用例自动转换成的用例
from openpyxl import load_workbook from datetime import datetime from PIL import ImageGrab from action.pageAction import KeyWordTest import traceback import os def TestCase(filename): wb = load_workbook(filename) #获取sheet_names for sheetname in wb.sheetnames: ws = wb[sheetname] #获取最大行数 ws_rows_max = ws.max_row #sheet.rows为生成器, 里面是每一行的数据,每一行又由一个tuple包裹 idx = 2 while idx <= ws_rows_max: # 指定的关键字 essential = ws.cell(row=idx, column=3).value # 定位方式 Targeting = ws.cell(row=idx, column=4).value # 元素定位表达式 Element_positioning = ws.cell(row=idx, column=5).value # 操作值 Manipulated_value = ws.cell(row=idx, column=6).value try: #根据传入的方法名来确定每一步执行哪一个方法 if essential == 'open_browser': dirver = KeyWordTest('Chrome') elif essential == 'open_url': dirver.open_url(Manipulated_value) elif essential == 'maximize_browser': dirver.maximize_browser() elif essential == 'input_text': dirver.input_text(Targeting, Element_positioning, Manipulated_value) elif essential == 'click_btn': dirver.click_btn(Targeting, Element_positioning) elif essential == 'quit_browser': dirver.quit_browser() elif essential == 'assert_driver_title_is': title_text = dirver.assert_driver_title_is() #断言 if title_text == Manipulated_value: #print(dirver.assert_driver_title_is()) #如果执行无误则将执行结果写入Pass ws.cell(row=idx, column=8).value = 'Pass' else: # 如果执行无误则将执行结果写入Pass ws.cell(row=idx, column=8).value = 'Fail' wb.save(filename) return # 如果执行无误则将执行结果写入Pass ws.cell(row=idx, column=8).value = 'Pass' # 获取当前系统时间,作为测试用例执行时间 curr_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S') ws.cell(row=idx, column=7).value = curr_time except Exception: #出现错误时截图保存到表格:只用到一个PIL模块,但PIL是Python2专有的,没有Python3版本。Python3应安装pillow,用的时候和PIL是一样的。 im = ImageGrab.grab() imagepath = f'screenshot/{idx-1}.png' im.save(imagepath) ws.cell(row=idx, column=10).value = imagepath # 如果执行出现异常,测试结果写入 异常,同时将异常信息写入到表格中 ws.cell(row=idx, column=8).value = '异常' # 写入异常信息 ws.cell(row=idx, column=9).value = traceback.format_exc() idx += 1 wb.save(filename)
3.3.Web操作脚本
主要实现页面元素查找功能的封装和页面校验断言assert的封装
from selenium import webdriver import time class KeyWordTest: def __init__(self, type_browser): self.driver = self.open_browser(type_browser) self.driver.implicitly_wait(20) #隐式等待 self.maximize_browser() #浏览器最大化 #打开浏览器 def open_browser(self, type_browser): if type_browser == 'Chrome': self.driver = webdriver.Chrome() elif type_browser == 'Firefox': self.driver = webdriver.Firefox() elif type_browser == 'Edge': self.driver = webdriver.Edge() else: self.driver = 'type error' return self.driver #打开网页 def open_url(self, url): self.driver.get(url) #浏览器最大化 def maximize_browser(self): self.driver.maximize_window() #元素定位 def locator(self, locator_type, element): element_object = None if locator_type == 'id': element_object = self.driver.find_element_by_id(element) elif locator_type == 'name': element_object = self.driver.find_element_by_name(element) elif locator_type == 'class_name': element_object = self.driver.find_element_by_class_name(element) elif locator_type == 'css': element_object = self.driver.find_element_by_css_selector(element) elif locator_type == 'xpath': element_object = self.driver.find_element_by_xpath(element) return element_object #输入内容定位 def input_text(self, targeting, element, content): self.locator(targeting, element).send_keys(content) #点击按钮 def click_btn(self, targeting, element): self.locator(targeting, element).click() #关闭浏览器 def quit_browser(self): self.driver.quit() #获取 title信息 def assert_driver_title_is(self):return self.driver.title
3.4.运行
- 自定义一个在excle写结果的函数
- 执行用例的步骤
- 先获取要执行的用例,遍历找到要具体执行用例的sheet表。
- 执行sheet表中的步骤。
- 根据sheet中的步骤判断当前用例执行是否成功(需要执行的用例数等于执行通过的用例数,则执行成功)
- 如果有错误就截图,并保存错误日志
- 测试过程中统计执行了多少用例,成功多少,失败多少。
- 把执行结果写到excle中
4.项目代结构展示
5.框架分析
- 使用外部测试数据文件,使用Excel管理测试用例的集合和每个测试用例的所有测试步骤,实现一个文件中完成测试用例的维护
- 每个测试用例的测试结果在一个文件中查看和统计
- 通过定义关键字,操作元素的定位方式及定位表达式和操作值就可以实现每个测试用例步骤的执行,可以更加灵活地实现自动化测试的需求
- 实现定位表达式和测试代码的分离,实现定位表达式直接在测试数据文件中进行维护。
- 框架提供日志功能,方便调试和监控自动化测试程序的执行
- 基于关键字测试框架,即使不懂开发技术的测试人员也可以实施自动化测试,便于在整个测试团队中推广和使用自动化测试技术,降低自动化测试实施的技术门槛
- 基于关键字的方式,可以进行任意关键字的扩展,以满足更加复杂项目的自动化测试需求