关键字驱动
通过关键字做对应的动作,很早的自动化测试工具都走的这个方向,比如RobotFramework,QTP等,这里简单介绍一下关键字驱动的原理
python 实现关键字驱动
python实现关键字驱动,主要用到的是python中的反射getattr
getattr:实现反射机制
getattr可以通过字符串获取方法实例。这样,你就可以把一个类可能要调用的方法放在配置文件里,在需要的时候动态加载。
配置文件
在excel中,输入自己的测试步骤,如下
收集测试用例
写一个方法收集测试用例,收集后格式如下
feature,story,case_name后续添加到allure报告中去 case_loc主要用到前两个,对应的为测试用例步骤起始行,结束行
用pytest框架
在conftest中根据上面的测试用例信息,收集测试用例全部数据
excel=OperaExcel()
test_cases=collect_test_cases(excel)
@pytest.fixture(scope="function",params=test_cases)
def case_data(request):
'''
根据用例的位置信息,找到对应的case步骤数据
:param request: case信息
:return:
'''
case_data = request.param
case_loc=case_data["case_loc"]
case_data["case_steps"]=excel.get_appoint_lines_data_reture_map_list(case_data["feature"],case_loc[0],case_loc[1])
for step in case_data["case_steps"]:
if step["loc_type"] !='':
step["loc"]=(step["loc_type"],step["loc_value"])
if step["check_loc_type"] !='':
step["check_loc"] = (step["check_loc_type"], step["check_loc_value"])
if step["value"] !='':
try:
step["value"]=eval(step["value"])
except:
pass
return case_data
返回的case_data格式如下,为单个测试用例数据: case_step 就是把所有的步骤放进去
在执行测试用例代码处,调用conftest中的case_data用例数据
import pytest,allure
from common.step_method import StepMethod
from common.public import *
class TestCases():
@get_screen_in_case_end_or_error
def test_001(self,driver,login,case_data):
'''
根据传进来的参数,执行测试用例
:param driver: 浏览器驱动
:param case_data: 测试用例数据
:return:
'''
self.driver=driver
allure.dynamic.feature(case_data["feature"])
allure.dynamic.story(case_data["story"])
allure.dynamic.title(case_data["case_name"])
step_method=StepMethod(driver=driver)
for step in case_data["case_steps"]:
with allure.step(step["case_step"]):
if hasattr(step_method, step["method"]):
func=getattr(step_method, step["method"])
func(**step)
else:
raise Exception(f'传入的方法:{step["method"]}不正确,请检查')
if step["check"] != '':
with allure.step(step["check"]):
if hasattr(step_method, step["check_method"]):
func = getattr(step_method, step["check_method"])
func(**step)
else:
raise Exception(f'传入的方法:{step["check_method"]}不正确,请检查')
初始化StepMethod这个类,就是通过excel表格中的method反射出对应的方法,然后以字典的形式,把参数传给这个方法,这里是关键字驱动的核心
hasattr 是判断这个类中是否存在某个属性
来看一下StepMethod中写的方法
import time
from common.base import Base
import random
class StepMethod(Base):
def __init__(self,driver):
'''
封装所用到得步骤的方法
:param driver: 浏览器
'''
Base.__init__(self,driver)
def visit_url(self, **kwargs):
self.driver.get(kwargs["value"])
'''元素操作方法 '''
def click(self,**kwargs):
element = self.find_element(kwargs["loc"])
element.click()
def input(self, **kwargs):
element = self.find_element(kwargs["loc"])
element.send_keys(kwargs["value"])
def get_element_value(self, **kwargs):
element=self.find_element(kwargs["loc"])
return element.text
def clear_element(self, **kwargs):
element=self.find_element(kwargs["loc"])
element.clear()
def get_element_attribute(self, **kwargs):
element=self.find_element(kwargs["loc"])
return element.get_attribute(kwargs["value"])
def random_click_one_of_elements(self,**kwargs):
elements=self.find_elements(kwargs["loc"])
element=random.choice(elements)
element.click()
def sleep(self,**kwargs):
time.sleep(int(kwargs["value"]))
|