一、接口自动化
应用框架:python+request+pytest+allure
testcase目录:用例目录
- 一个模块创建一个目录
- 每个目录中一个py文件和若干yaml文件
- py文件中一般是一个类代表一个模块内容,类中的各个方法代表着这个模块的不同操作实现
- 举例,一个标签模块,包含创建、修改、查询、删除等4个操作,那么改模块类中就会有这四个标签操作方法的实现
-
通过pytest的parametrize方法读入一个用例处理方法read_yaml_ddt(读取指定的用例yaml,方法返回一个字典列表,一个用例即一个dict类型数据)
- 然后单个用例datas(dict类型)通过统一请求方法send_request()处理请求过程和断言结果判断
- 目录下的yaml文件都是单个yaml用例,或者一个yaml用例模板(数据需要从datas下对应目录的数据文件读取,从而获取多个用例),另外就是文件中夹杂着热加载方法
- 这是“创建标签”的testcase/Lable_manager/get_token.yaml文件,如果就是单个用例,那么文件中不会出现ddt(自定义的数据驱动方法),都是实际数据
- 热加载规则$${function_name(**kwargs)}、ddt数据驱动规则$ddt${取数据文件指定列的值}、提取规则 提取值赋予给key:jp{jonspath提取指定值规则} re{正则提取规则}
- 可以看到,整个文件用例是字典列表,一个字典列表一个用例
- name:必须项,用例具体名字,一般ddt获取具体值
- base_url:必须项,用例基础路径,因为不同环境即使是相同模块的路径也可能存在不同,这里应该统一从config目录下的环境配置文件热加载
- parametrize:非必须项,用例参数读取路径(就是本用例ddt默认从路径读取数据,没有就说明是完整用例,无需读取),这里可以需要读取的列通过name-appid-secret-grant_type-assert_str组成key,而值就是数据文件的路径,也可以是all:path这样代表读取数据文件中所有列字段作参数
- request:必须,请求参数主体,必须具有url(后缀路径)、method(请求类型)、json或者param或者files其中一个、head(非必须,有些请求头部是必须的)
- method:在用例中一般是固定值
- url和head:一般是通过热加载从temps下的文件或者配置文件中读取数据,不随用例参数变化
- json或者param或者files:一般是通过ddt进行数据驱动,从而获得多个用例
- extract:提取response的值,表达式key:value,key是提取指定值后赋予给key,value提取方式(支持jsonpath提取和正则提取)
- validate:断言集合,包含相等equals、contains等多种基础断言方式,依据实际情况增加或者完善
- equals:相等断言,之下是key:value,key是response中指定值,value是预期值
- contains:包含断言,用列表表示表示返回body中必须的字段
- py文件中一般是一个类代表一个模块内容,类中的各个方法代表着这个模块的不同操作实现
commons目录:公共方法目录
- base_uitl:基础且必要的函数,如指定随机字符串,获取项目根目录等等
- request_util:主要是包含统一请求方法和其他相关方法的类
- send_request:发送统一请求,1)先调用standand检查用例yaml的必须参数;2)判断files参数是否存在,files需要另外处理;3)将request的参数分别赋予,然后使用request(method,url,**kwargs);4)如果用例中extract参数,则提取相关数据到指定临时文件;5)调用断言方法断言数据,注意asserterror不能被捕获,需要重新抛出
- standand:检查用例yaml模板的必须参数是否都有,没有就报错
-
yaml_util:对yaml的处理方法,包含读取用例、写入、清空、读取配置、提取、yaml热加载、ddt数据驱动等等方法
- extract:提取用例extract参数的值,通过前缀判断用正则或者jsonpath各种提取方式来提取值,这里可以完善,把规则写入到配置文件,根据配置文件来提取
- reflex:热加载,通过分析热加载规则,反射实现用例yaml的热加载功能
- read_yaml_ddt:这里先进行热加载,然后判断用例yaml是单个完整用例还是用例模板
- ddt:对用例yaml模板通过参数parametrize指定字段读取数据文件,得到多个用例cases,进行数据驱动
- assert_util:断言集合,这里主要对断言进行处理,可根据情况增加断言方法
- assert_result:统一断言,根据断言类型调用相关断言方法,断言方法返回布尔值,断言错误则抛出断言异常,负责捕捉异常
- contains:包含断言方法,根据用例参数的包含验证列表一次验证,都没有问题结果才返回rue
- equals:相等断言方法,根据用例参数的相等字典列表一次验证,都没有问题才返回true
- logger_util:日志处理模块,单例化日志类实例对象,防止重复输出日志
- __new__:在创建新对象的时候实现单例模式
- __init__:在第一次初始化对象根据配置处理器
datas目录:ddt数据驱动的用例数据目录,层次结构和testcases一样
- 一个目录对应一个模块,模块下有相对应的yaml数据文件(也可以是其他文件类型),包含参数字段和断言字段
config目录:配置目录
- 环境配置文件:包含基础路径、日志处理格式、日志级别输出等等
- 项目参数配置:热加载规则、提取规则、数据驱动规则、支持的提取方式等等
- 其他普通配置
source目录:资源目录,包含图片、文件等等项目运行过程可能需要的资源
reports目录:自动化结果报告,此处为allure报告
- 报告json文件目录
- aluure:根据json文件生成的报告
temps目录:整个项目过程中产生的临时文件目录,在每次自动化开始前会自动清空所有文件内容
log目录:日志目录,此处根据环境配置最多保留当前最近的十个运行日志,会通过钩子实现后置处理
conftest.py文件:众多fixtrue函数所在的文件,自动处理相关前后置操作
pytest.ini文件:pytest的相关配置文件
README,md文件:项目说明文件
run.py文件:自动化启动文件
二、WEB自动化
框架:python+selenium+unittest+allure
POM模式
页面对象设计模式有以下注意点:
- 先注明basepage类,此类有从创建浏览器对象到关闭浏览器的一系列基础方法和属性
- __init__:再页面初始化方法中用wait_all方法等待所有页面元素就绪
- 一个页面一个类,类中先写明定位方式(统一xpath定位),所有页面元素操作基本方法(比如输入密码),然后在t统合程高级操作(比如登录)
-
- _url:每个页面都有的属性
- _ele_:约定以此开头的元素都是xpath定位后的element类型
- submit:登录方法,高级操作,其余都是基本操作
- testcase:用例层,存放基本用例,一个测试类对应一个页面所有操作,此处ddt需要下载安装,非自定义
- datas:数据层,根据对应测试类,一个测试类对应测试数据文件
- run:unittest执行
关键字驱动模式
关键字驱动模式重要的有以下几点:
- execl中写明用例步骤,一个sheet中代表所属模块中一个操作的所有用例,一个execl文件代表模块所有用例
- 将execl用例转化为unitest的套件suitcases
- 先定义单个execl的所有用例用例套件_suite,
- 按照执行步骤需要增加关键字keywords
- 函数中返回一个Testcase的集成对象
-
1 def create_test(test_suite, file): 2 file_path = Path(file) # 文件路径 3 filename = file_path.name # 文件的名字 4 5 @ddt.ddt 6 @allure.suite(filename) 7 class Test(unittest.TestCase): 8 @classmethod 9 def setUpClass(cls) -> None: 10 cls.driver = get_webdriver() 11 12 @classmethod 13 def tearDownClass(cls) -> None: 14 cls.driver.quit() 15 16 @ddt.data(*create_runner(test_suite["cases"].values())) # 通过数据生成用例 17 def test(self, runner): 18 case = runner.case 19 key_word = action.KeyWord(driver=self.driver) 20 21 for step in case["steps"]: 22 print("步骤", step) # 步骤ID,步骤名称,关键字,参数 23 24 @allure.step(step[1]) 25 def _f(关键字=step[2], 参数=step[3]): 26 f = getattr(key_word, f"key_{step[2]}") 27 28 try: 29 f(*step[3]) # 调用关键字,可能出现异常 30 except Exception as e: 31 # 预期外的异常,使用error级别日志,自动记录异常信息 32 logger.error("关键字执行出错", exc_info=True) 33 raise e # 重点:异常捕捉之后,要继续抛出 34 35 # 来自excel的关键字执行完毕,开始自动截图 36 logger.info(f"关键字执行完毕 {step[2]} {step[3]}") 37 logger.info("开始自动截图") 38 logger.info( 39 f"浏览器关闭情况:{key_word.is_close}", 40 ) 41 42 if ( 43 step[2] 44 not in [ # 此列表的关键字不自动截图 45 "screenshot", 46 "assert", 47 "new_session", # 启动浏览器关键字 不截图 48 # "quit_session", 49 "mysql", 50 "save_sql", 51 ] 52 and key_word.is_close is False # 浏览器关闭了,不自动截图 53 ): 54 try: 55 key_word.driver.switch_to.alert # 有对话框,切换成功 56 logger.info("对话框切换成功,说明存在对话框,不进行截图") 57 except NoAlertPresentException: 58 # 切换失败,说明,没有对话框,可以截图 59 logger.info("所有的条件都满足,调用关键字,进行截图") 60 key_word.key_screenshot(step[1]) # 附件名称使用步骤名称 61 62 _f() 63 print("用例结束") 64 65 return Test
-
- 根据execl文件依次动态生成包含不同模块用例的执行文件,然后执行用例,session后置清除执行文件
- 上面动态生成用例,利用glob获取test_*.xlsx相关符合的文件作为用例execl,然后for循环根据每个execl生成的suite用例,借助gliobal()方法在当前模块下生成unittest的Testcase的继承类(也就是测试用例),框架启动前生成test_beifan.py,结束后删除此文件,conftest中应用内容如下
-
三、APP自动化
标签:总结,文件,层次,yaml,ddt,用例,key,自动化,断言 From: https://www.cnblogs.com/ldzcy/p/16102274.html