首页 > 其他分享 >自动化层次总结

自动化层次总结

时间:2022-11-14 14:33:10浏览次数:51  
标签:总结 文件 层次 yaml ddt 用例 key 自动化 断言

 

 

一、接口自动化

应用框架: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中必须的字段

 

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

相关文章