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模块运用
  • 返回值的判断处理
  • 用例执行结果的存储
  • 用例测试的入口

原文地址:https://www.cnblogs.com/txx403341512/p/9355523.html

时间: 2024-11-06 03:32:57

Python 基于http接口自动化测试的相关文章

robot framework + python实现http接口自动化测试框架

https://www.jianshu.com/p/6d1e8cb90e7d 前言 下周即将展开一个http接口测试的需求,刚刚完成的java类接口测试工作中,由于之前犯懒,没有提前搭建好自动化回归测试框架,以至于后期rd每修改一个bug,经常导致之前没有问题的case又产生了bug,所以需要一遍遍回归case,过程一直手工去执行,苦不堪言.所以,对于即将开始的http接口测试需求,立马花了两天时间搭建了一个http接口自动化测试框架用于测试后期回归测试,实在是被大量的重复手工执行搞怕了. 基础

Python+requests+exce接口自动化测试框架

一.接口自动化测试框架 二.工程目录 三.Excel测试用例设计 四.基础数据base 封装post/get:runmethod.py #!/usr/bin/env python3 # -*-coding:utf-8-*- # __author__: hunter import requests import json class RunMain: def send_get(self, url, data): res = requests.get(url=url, params=data).js

python+robot framework接口自动化测试

python+requests实现接口的请求前篇已经介绍,还有不懂或者疑问的可以访问 python+request接口自动化框架 目前我们需要考虑的是如何实现关键字驱动实现接口自动化输出,通过关键字的封装实现一定意义上的脚本与用例的脱离! robot framework 的安装不过多说明,网上资料比较太多~ 实例:!!!!! 步骤一:新建项目 测试项目可以目录或文件存储,格式可以用TXT,TSV或HTML格式, 建议项目选择目录和TXT,这样便于管理 步骤二:新建测试套 测试套与测试项目一样,也

Python 基于python实现的http+json协议接口自动化测试框架源码(实用改进版)

目录 1.      写在前面 2.      开发环境 3.      大致流程 4.      框架简介 5.      运行结果展示 6.      文件与配置 7.      测试接口实例 n      1.登陆接口 n      2.支付密码更改接口 8.      数据库设计 9.      测试用例.测试数据准备 10.        模块与类.函数设计 11.        代码实现 a)         class congfighttp.ConfigHttp b)      

简单实现接口自动化测试(基于python+unittest)

简单实现接口自动化测试(基于python+unittest) 简介 本文通过从Postman获取基本的接口测试Code简单的接口测试入手,一步步调整优化接口调用,以及增加基本的结果判断,讲解Python自带的Unittest框架调用,期望各位可以通过本文对接口自动化测试有一个大致的了解. 引言 为什么要做接口自动化测试? 在当前互联网产品迭代频繁的背景下,回归测试的时间越来越少,很难在每个迭代都对所有功能做完整回归.但接口自动化测试因其实现简单.维护成本低,容易提高覆盖率等特点,越来越受重视.

如何简单实现接口自动化测试(基于 python) 原博主地址https://blog.csdn.net/gitchat/article/details/77849725

如何简单实现接口自动化测试(基于 python) 2017年09月05日 11:52:25 阅读数:9904 GitChat 作者:饿了么技术社区 原文:如何简单实现接口自动化测试(基于 python) 关注微信公众号:GitChat 技术杂谈 ,这里一本正经的讲技术 一.简介 本文从一个简单的登录接口测试入手,一步步调整优化接口调用姿势,然后简单讨论了一下接口测试框架的要点,最后介绍了一下我们目前正在使用的接口测试框架pithy.期望读者可以通过本文对接口自动化测试有一个大致的了解. 二.引言

基于Python接口自动化测试框架(初级篇)附源码

引言 很多人都知道,目前市场上很多自动化测试工具,比如:Jmeter,Postman,TestLink等,还有一些自动化测试平台,那为啥还要开发接口自动化测试框架呢?相同之处就不说了,先说一下工具的局限性: 1.测试数据不可控:    接口虽然是对业务逻辑.程序代码的测试,而实际上是对数据的测试,调用接口输入一批数据,通过断言代码验证接口返回的数据,整个过程围绕数据测试.    如果返回的数据不是固定的,是变化的,那么断言失败,就无法知道是接口程序错误引起的,还是数据变化引起的,所以就需要进行测

基于HttpRunner的接口自动化测试平台HttpRunnerManager(二)

https://github.com/HttpRunner/HttpRunnerManager HttpRunnerManager Design Philosophy 基于HttpRunner的接口自动化测试平台: HttpRunner, djcelery and Django_. HttpRunner手册: http://cn.httprunner.org/ Key Features 项目管理:新增项目.列表展示及相关操作,支持用例批量上传(标准化的HttpRunner json和yaml用例

基于jmeter+ant实现的接口自动化测试

jmeter+ANT接口自动化测试框架 项目说明 本框架是一套基于jmeter+Ant+Excel+Python而设计的数据驱动接口自动化测试框架,jmeter 作为执行器,Ant 作为构建工具,进行构建测试,本框架无需你使用代码编写用例,测试用例存储在csv中,在csv中可以进行接口用例编写,接口断言,用例运行控制. 技术栈 jmeter Ant Python 环境部署 1.安装JDK 2.安装Jmeter 3.安装 ANT 1.解压apache-ant-1.10.5-bin.zip到任意目录