zoukankan      html  css  js  c++  java
  • Python 基于http接口自动化测试

    设计原理   基于http协议接口的测试设计,莫过于Python的requests库,简单粗暴易理解。

    设计模式   采用python的flask框架,搭建一套接口自动化测试平台。   测试用例维护:采用Excel   测试结果保存:采用MongoDb存储,HTML页面展示

    相关核心代码介绍:

    1.   Excel模板如下:   看Excel的定义命名,基本理解,每个参数的含义   介绍:   B1:要测试的接口地址   B2:该测试接口的请求参数,以“#”分隔【便于分割】   B3:登录的URL,若测试不需要登录   B4:登录的json串,以字典的形式展现   注:CaseNo、Except——result、Commit,是必填的
    2.   从Excel读取及处理数据,代码如下:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      79
      80
      81
      82
      83
      import xlrd
      import os
       
      # ****************************************************************
      # Excel模版设置
      # self.interFace = 0             #Excel中测试用例接口对应为第1列
      # self.interFaceArgList = 1      #Excel中测试用例接口参数列表对应为第2列
      # self.loginChoice = 2           #Excel中测试用例接口是否需要登录为第3列
      # self.loginJson = 3            #Excel中测试用例接口是否需要登录为第4列
      # self.titleIndex = 4            #Excel中测试用例标题行索引为第5列
      # self.caseBegin = 5             #Excel中测试用例开始行索引为第6列
      # ****************************************************************
       
      class ExcelSheet:
          def __init__(self, sFile, interFace=0, interFaceArgList=1, loginInterFace=2, loginJson = 3, titleIndex=4, caseBegin=5):
              try:
                  excel = xlrd.open_workbook(sFile)
              except Exception as e:
                  print e
                  exit()
       
              self.sheet = excel.sheet_by_index(0)        # 查询Excel的第一个sheet
              self.interFace = interFace
              self.interFaceArgList = interFaceArgList
              self.loginInterFace = loginInterFace
              self.titleIndex = titleIndex
              self.caseBegin = caseBegin
              self.loginJson = loginJson
       
          def sheet_name(self):
              return self.sheets.name
       
          def nrows(self):
              return self.sheet.nrows
       
          def ncols(self):
              return self.sheet.ncols
       
          def cellxy(self, rowx, colx):
              # type: (object, object) -> object
              cell_value = self.sheet.cell(rowx, colx).value
              # 对数字的处理
              if self.sheet.cell(rowx, colx).ctype in (2, 3) and int(cell_value) == cell_value:
                  cell_value = int(cell_value)
       
              return cell_value
       
          # interFace 测试接口URL
          def get_interFace(self):
              return self.cellxy(self.interFace, 1)
       
          # interFace接口的参数List
          def get_interFaceArgList(self):
              return self.cellxy(self.interFaceArgList, 1).split("#")
       
          # 测试用例的参数项
          def get_titleIndex(self):
              return self.sheet.row_values(self.titleIndex)
       
          # 登录的接口地址
          def get_loginInterFace(self):
              return self.cellxy(self.loginInterFace, 1)
       
          # 获取登录接口参数的json
          def get_loginJson(self):
              return str(self.cellxy(self.loginJson, 1))
       
          # 返回单行用例的数据字典
          def get_by_line(self, line):
              tempdict = dict()
              data = dict()
              if line < self.caseBegin:
                  return False
              else:
                  for col in range(self.ncols()):
                      if self.cellxy(self.titleIndex, col) in self.get_interFaceArgList():
                          if self.cellxy(line, col) != 'X':
                              data[self.cellxy(self.titleIndex, col)] = self.cellxy(line, col)
                      else:
                          tempdict[self.cellxy(self.titleIndex, col)] = self.cellxy(line, col)
       
                  tempdict["data"] = data
              return tempdict
    3.   requests的post和get请求代码:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      import requests
       
      def postRequest(url, data, cookie):
          header={"Content-Type":"application/json"}
          if cookie:
              return requests.post(url, data=data, cookies=cookie, headers = header)
          else:
              return requests.post(url, data=data, headers = header)
       
      def postRequest(url, cookie):
          header={"Content-Type":"application/json"}
          if cookie:
              return requests.get(url, cookies=cookie, headers = header)
          else:
              return requests.get(url, headers = header)
    4.   检查返回为页面还是json串:
      1
      2
      3
      4
      5
      6
      7
      def checkReturnResult(req_result):
          try:
              realResult = eval(req_result)
          except:
              return False
          else:
              return req_result
    5.   测试结果存储MongoDB:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      # -*- coding: utf-8 -*-
      import pymongo
      class ConMongoDb:
          #读取配置文件
          def __init__(self):
              MongoIP="192.168.X.XXX"
              MongoPort=27017
              #链接MongoDb
              self.conn = pymongo.Connection(MongoIP, MongoPort)
              #选择数据库
              self.db = self.conn.test
              self.collection = self.db.SocketTest
       
          '''
          # **************************************************
          # InsertMongo:往MongoDb插入数据
          # **************************************************
          '''
          def InsertMongo(self, Lst):
              self.collection.insert(Lst)
        def close(self):      return self.conn.disconnect()
       
    6. 测试用例执行代码:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      import time
      ExcelSheet = ExcelSheet("104137PC.xlsx")
      interFace = ExcelSheet.get_interFace()
      interFaceArgList = ExcelSheet.get_interFaceArgList()
      titleIndex = ExcelSheet.get_titleIndex()
      loginInterFace = ExcelSheet.get_loginInterFace()
       
      # 判断是否需要登录
      if loginInterFace:
          if "username" not in titleIndex or "password" not in titleIndex:
              print "Test Case File not include username or password"
              exit()
          else:
              # 获取登录接口参数的json
              loginJson = ExcelSheet.get_loginJson()
       
      caseList = list()
      for line in range(5, ExcelSheet.nrows()):
          lineContent = ExcelSheet.get_by_line(line)
          # 获取登录后的cookie
          if loginInterFace:
              # 需要登录,用户名密码,替换
              loginJson = loginJson.replace("#username#", lineContent["username"])
              loginJson = loginJson.replace("#password#", str(lineContent["password"]))
              result = postRequest(loginInterFace, eval(loginJson), False)
              print result.text
              cookie = result.cookies
          else:
              cookie = False
       
          # reqtype 不填默认post
          if lineContent.has_key("reqtype"):
              if lineContent["reqtype"].upper() == "POST":
                  interFaceResult = postRequest(interFace, lineContent["data"], cookie)
              else:
                  interFaceResult = postRequest(interFace, cookie)
          else:
              interFaceResult = postRequest(interFace, lineContent["data"], cookie)
       
          req_result = interFaceResult.text
       
          # 非页面,可直接比较,也可以转换成字典进行某个value进行比较
          if checkReturnResult(req_result):
              if checkReturnResult(req_result) == lineContent["Except_result"]:
                  TestResult = "PASS"
              else:
                  TestResult = "FAIL"
          #如果返回是页面的话,就查找特殊标志词
          else:
              if ineContent["Except_result"] in req_result:
                  TestResult = "PASS"
              else:
                  TestResult = "FAIL"
       
          lineContent["result"] = TestResult
       
          caseList.append(lineContent)
      TestDate = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))
      content = {"interFace": interFace, "caseList": caseList, "testdate": TestDate}
       
      MyngoCls = ConMongoDb()
      MyngoCls.InsertMongo(content)
      MyngoCls.close()

    整个流程梳理:

    • 用例Excel的读取解析
    • python的requests模块运用
    • 返回值的判断处理
    • 用例执行结果的存储
    • 用例测试的入口
  • 相关阅读:
    Mysql入门-对表数据的增删改查
    Mysql教程-自动备份数据库
    前端基础教程-jQuery EasyUI 的EasyLoader实例
    html上标与下标应用
    git使用教程
    retrofit2.0缓存设置
    android 模拟用户点击事件
    power designer 16.5 生成mysql8.0注释
    Navicat连接Mysql8.0.11出现1251错误
    mongodb 安装配置及简单使用
  • 原文地址:https://www.cnblogs.com/txx403341512/p/9355523.html
Copyright © 2011-2022 走看看