/aydApiTest

py3+unittest+requests+ddt Api test framework

Primary LanguageHTML

  • 框架简介

    • aydApiTest ,基于python3+requests+unnittest+yaml+ddt封装的接口自动化测试框架
  • 最新版本与修改

    • v1.11

      • 1.调整邮件样式显示.
    • v1.1

      • 1.用例组织依据项目进行管理.
      • 2.邮件模块逻辑调整,新增邮件统计结果.
      • 3.优化部分代码逻辑.
    • v1.06

      • 1.修复一些已知问题.
    • v1.05

      • 1.修复关联数据无法保存数据时的问题.
      • 2.完善数据校验逻辑,修复原有的校验逻辑问题.
      • 3.调整yaml数据格式,新增options选项管理额外的请求状态数据.
    • v1.02

      • 1.修复返回数据为页面时,报告显示的bug.
      • 2.修复数据校验逻辑的bug.
    • v1.01

      • 1.修复关联数据的问题.
      • 2.修复校验数据的问题.
    • v1.0

      • 1.新增mongodb、redis数据库常用操作封装.
      • 2.新增http其他请求封装如put、delete、patch等.
      • 3.修改数据关联逻辑实现.
    • v0.8

      • 1.新增mysq数据库操作封装.
      • 2.新增数据校验逻辑.
    • v0.5

      • 1.新增单个接口过滤的skip.
      • 2.修改Beautifulreport源码,调整报告输出增加请求体、响应体、caseid、case_desc等详细信息.
      • 3.用例运行响应时间精确到ms.
      • 4.简化yaml,抽取case公共数据.
      • 5.优化日志输出格式.
      • 6.yaml增加skip过滤单个用例功能.
      • 7.调整关联逻辑.
    • v0.1

      • 1.构建框架基本结构 python+requests+unittest+yaml+ddt.
      • 2.完成demo用例输出.
  • 框架特色

    • 灵活配置:支持以配置文件的方式管理配置,如日志配置与email配置等
    • 测试输出:每次运行结果生成实时运行记录,包含测试详细报告与运行时日志
    • 邮件支持:支持基于smtp的方式发送email
    • 兼容性强:基于requests模块进行测试,并集成yaml与ddt进行数据驱动
    • 扩展性强:基于python3开发,方便后续对框架功能的扩展
  • 目录结构

    • /conf : 配置文件目录,包含构建配置、邮件配置、日志配置等(默认使用conf.ini、logging.conf)
    • /data : 数据文件目录,包括用例数据管理文件夹caseData、公共数据管理文件夹pubData等
    • /log : 运行时日志目录
    • /report : 测试报告目录
    • /src : 源码管理目录,包含基础类、工具类、公共类、用例类等
    • start.py : 框架执行入口
    • beautifaulreport : 生成html报告,基于beautifaulreport.py修改
    • README.MD : 文档说明
  • 运行环境

    • python3.6+
  • 运行依赖

    • unittest
    • requests 2.18.4+
    • pyyaml 3.13+
    • jsonpath_rw 1.4.0+
    • ddt 1.2.0+
    • configparser
    • BeautifulReport
    • pymysql 0.8.0+
    • pymongo 3.7.1+
    • redis 2.10.6+
  • 操作数据库demo

    • operation mysql

      op_mysql = OperMysql()
      op_mysql.connect(MYSQL_HOST, MYSQL_PORT, MYSQL_USER, MYSQL_PWD, MYSQL_DB)
      data = op_mysql.runsql(SQL, COUNT)
      print(data)
      op_mysql.close()  
      
    • operation mongodb

      op_mongo = OperMongod()
      op_mongo.connect(MONGOD_HOST, MONGOD_PORT, db_name=MONGOD_DB, collection_name=MONGOD_COL, username=MONGOD_USER, password=MONGOD_PWD)
      data = op_mongo.get_data()
      print(data)  # type list
      print(len(data))  # count data,default 10
      op_mongo.close()
      
    • operation redis

      op_redis = OperRedis()
      op_redis.connect(host=REDIS_HOST, port=REDIS_PORT, db=DB, password=PASSWORD)
      print(op_redis.get_keys(100))          # type list,default length 10
      print(op_redis.get_data('test:1'))     # get value
      
  • 用例demo

    • 关联用例demo

      • 被关联的case

         case_id: getGuest_1  # 建议用例命令方式: ${ApiName}_${ID} 
         desc: "查询成功"
         request_data:
               eid: 5
         relyDataExport: # 关联输出,即该接口响应返回被其他接口关联字段
             - {"relyKey": "phone", "keepKey": "MyPhone", "datatype": "body"}  # relyKey:响应中待关联的字段名,keepKey:保存字段名
             - {"relyKey": "Content-Type", "keepKey": "Content-Type", "datatype": "header"}  # datatype:响应中获取关联数据的位置,cookie/header/body
         validators:
             - {"check": "status", "expect": 200}    # validators data in response is json,default
             # - {"expect": \"status\":200}          # validators data in response is text
         options:
             # skip: 1        # if value is 1,skip case
               datacheck : 1   # if value is 1,need datacheck
             # toJsonData: 0   # if value is 1,request data to json
        
      • 需要关联的case

        case_id: getGuest_4
        desc: "eid为空查询phone"
        request_data:
              phone: 13700000004
        validators:
            - {"check": "status", "expect": 10021}
            - {"check": "message", "expect": "eid cannot be empty"}
        relyDataImport:  # 关联引入,即该接口运行所需的关联字段设置
            - {"relyDataSrc": "phone", "relyDataDes": "MyPhone", "datatype": "body"}  # relyDataSrc:关联的字段,relyDataDes:被关联引用的字段
            - {"relyDataSrc": "phone", "relyDataDes": "MyPhone", "datatype": "cookie"}  # datatype: 关联数据引入处,body|header|cookie
            - {"relyDataSrc": "phone", "relyDataDes": "MyPhone", "datatype": "header"}
        
    • 校验用例demo

      • case实例

        def test_get_guest(self, **kw):
              try:
                  self.start(url=url,...., **kw)
              except DataCheck:
                  print(1)
                  try:
                      api_resp = self.get_resp()  # type dict,获取api响应数据
                      # 获取数据库返回数据
                      ...
                      db_resp=....
                      ...
                      
                      if len(db_resp) == 0:
                          raise DbNoneDataException
                      # 对比api与db返回数据
                      if api_resp.get('E_testdata'):
                          pass
                          self.logger.debug("数据校验:   通过!")
                      else:
                          raise ApiNoneDataException
                  except DbNoneDataException:
                      self.logger.debug("数据校验   :失败,数据库返回数据为空!")
                      raise
                  except ApiNoneDataException:
                      self.logger.debug("数据校验   :失败,API返回数据为空!")
                      raise
                  except Exception as e:
                      self.logger.debug("数据校验   :失败!")
                      self.logger.debug(e)