目录:导读
前言
1、关键字驱动框架简介
原理及特点:
①关键字驱动测试是数据驱动测试的一种改进类型,它也被称为表格驱动测试或者基于动作字的测试。
②主要关键字包括三类:被操作对象(Item)、操作行为(Operation)和操作值(Value),用面向对象形式可将其表现为 Item.Operation(Value)。
③将测试逻辑按照这些关键字进行分解,形成数据文件。
④用关键字的形式将测试逻辑封装在数据文件中,测试工具只要能够解释这些关键字即可对其应用自动化。
优势:
①执行人员可以不需要太多的技术:一旦框架建立,手工测试人员和非技术人员都可以很容易的编写自动化测试脚本。
②简单易懂:它存在 Excel 表格中,没有编码,测试脚本容易阅读和理解。关键字和操作行为这样的手工测试用例,使它变得更容易编写和维护。
③早期介入:可以在应用未提交测试之前,就可以建立关键字驱动测试用例对象库,从而减少后期工作。使用需求和其它相关文档进行收集信息,关键字数据表可以建立手工测试程序。
④代码的重用性:用关键字的形式将测试用例及数据进行组装并解释执行,提高代码的可重用性。
2、框架结构说明
框架结构:
整个测试框架分为四层,通过分层的方式,测试代码更容易理解,维护起来较为方便。
第一层是“测试工具层”:
util 包:用于实现测试过程中调用的工具类方法,例如读取配置文件、页面元素的操作方法、操作 Excel 文件、生成测试报告、发送邮件等。
conf 包:配置文件及全局变量。
log 目录:日志输出文件。
exception_pic 目录:失败用例的截图保存目录。
第二层是“服务层”:
相当于对测试对象的一个业务封装。对于接口测试,是对远程方法的一个实现;对于 UI 测试,是对页面元素或操作的一个封装。
action 包:封装具体的页面动作,如点击、输入文本等。
第三层是“测试用例逻辑层”:
该层主要是将服务层封装好的各个业务对象,组织成测试逻辑,进行校验。
bussiness_process 包:基于关键字的形式,实现单条、多条用例的测试脚本逻辑。
test_data 目录:Excel 数据文件,包含用例步骤、被操作对象、操作动作、操作值、测试结果等。
第四层是“测试场景层”:
将测试用例组织成测试场景,实现各种级别 cases 的管理,如冒烟,回归等测试场景。
main.py:本框架工程的运行主入口。
框架特点:
①基于关键字测试框架,即使不懂开发技术的测试人员也可以实施自动化测试,便于在整个测试团队中推广和使用自动化测试技术,降低自动化测试实施的技术门槛。
②使用外部测试数据文件,使用Excel管理测试用例的集合和每个测试用例的所有执行步骤,实现在一个文件中完成测试用例的维护工作。
③通过定义关键字、操作元素的定位方式和定位表达式和操作值,就可以实现每个测试步骤的执行,可以更加灵活地实现自动化测试的需求。
④基于关键字的方式,可以进行任意关键字的扩展,以满足更加复杂的自动化测试需求。
⑤实现定位表达式和测试代码的分离,实现定位表达式直接在数据文件中进行维护。
⑥框架提供日志功能,方便调试和监控自动化测试程序的执行。
3、框架代码实现
action 包
action 包为框架第二层“服务层”,相当于对测试对象的一个业务封装。对于接口测试,是对远程方法的一个实现;对于 UI 测试,是对页面元素或操作的一个封装。
page_action.py
本模块基于关键字格式,封装了页面操作的常用函数,如打开 APP、点击、输入文本等。
import traceback
import os
import time
from appium import webdriver
from util.get_desired_caps import get_desired_caps
from util.datetime_util import *
from util.find_element_util import *
from util.global_var import *
from util.log_util import *
DRIVER = ""
# 打开APP,获取webdriver对象
def open_app():
global DRIVER
desired_caps = get_desired_caps()
DRIVER = webdriver.Remote(APPIUM_SERVER, desired_caps)
# 设定开始活动页
def open_start_activity(app_name, start_activity_name):
global DRIVER
DRIVER.start_activity(app_name, start_activity_name)
# 退出APP
def quit_app():
global DRIVER
DRIVER.quit()
# 在页面输入框中输入数据
def input_string(location_type, locator_expression, input_content):
global DRIVER
find_element(DRIVER, location_type, locator_expression).send_keys(input_content)
# 清除输入框默认内容
def clear(location_type, locator_expression):
global DRIVER
find_element(DRIVER, location_type, locator_expression).clear()
# 点击页面元素
def click(location_type, locator_expression):
global DRIVER
find_element(DRIVER, location_type, locator_expression).click()
# 断言界面源码是否存在某关键字或关键字符串
def assert_string_in_pagesource(assert_string):
global DRIVER
try:
assert assert_string in DRIVER.page_source, "%s not found in page source!" % assert_string
info("断言成功【关键字:{}】".format(assert_string))
except:
error("断言失败【关键字:{}】".format(assert_string))
raise
# 强制等待
def sleep(sleep_seconds):
time.sleep(int(sleep_seconds))
# 批量断言
def assert_app_list(location_type, locator_expression, assert_string):
global DRIVER
assert_string_list = assert_string.split(",")
elements = find_element(DRIVER, location_type, locator_expression)
for element in elements[:3]:
assert element.text in assert_string_list
# 截图函数
def take_screenshot():
global DRIVER
# 创建当前日期目录
dir = os.path.join(EXCEPION_PIC_PATH, get_chinese_date())
if not os.path.exists(dir):
os.makedirs(dir)
# 以当前时间为文件名
file_name = get_chinese_time()
file_path = os.path.join