Python Api接口自动化测试框架 代码写用例

公司新来两个妹子一直吐槽这个接口测试用例用excel维护起来十分费脑费事,而且比较low(内心十分赞同但是不能推翻自己),妹子说excel本来就很麻烦的工具,于是偷偷的进行了二次改版。

变更内容如下:

  • 1.代码结构

image.png

  • 2.新增测试报告网页版和版本管理
  • 3.新增用例代码化
一、封装一个获取用例的模块

image.png

用例的写法可以按照yml文件的写法,后缀的文件都可为.conf、.config、.ini。[]中的是测试用例场景,下面的参数内容对应接口用例参数。
简单介绍下python内置模块ConfigParser:
  • ConfigParser 是用来读取配置文件的包。配置文件的格式如下:中括号“[ ]”内包含的为section。section 下面为类似于key:value 的配置内容。(key = value也可以具体方法这次不详细展开,之后写一遍关于ConfigParser的用法,懂原理会让工作更轻松。)
  • 这里讲讲为什么配置写在最外层,如果写到文件夹中,怎么都无法读取配置。python执行run命令的时候需要.ini文件跟run 文件在同个文件夹下。所以应该是路径问题导致,之后尝试修复这个BUG。

(通过操作绝对路径的方法修复此BUG上图已经修复)

这次变更代码实现如下:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 基础包:配置服务

import ConfigParser

config = ConfigParser.ConfigParser()

def get_config(filename):
    """
    获取文件配置
    :param filename: 配置文件名
    :return: None
    """
    global config
    try:
        config.read(filename)
        return True
    except Exception, e:
        print ("读取配置失败 %s" % e)

def get_data(title, key):
    """
    参数配置
    :param title: 配置文件的头信息
    :param key: 配置文件的key值
    :return: 配置文件的value
    """
    try:
        value = config.get(title, key)
        return value
    except Exception, e:
        print ("获取参数失败 %s" % e)

def get_title_list():
    """
    获取所有title
    :return: title list
    """
    try:
        title = config.sections()
        return str(title).decode("string_escape")
    except Exception, e:
        print ("获取title信息失败 %s", e)

二、封装一个日志的模块

这次日志进行了一次更改:会将测试用例返回结果文件内容写入,文件通过mkdocs生成测试报告。
公司用的微服务,所以对docker有一定涉猎。官方提供了mkdocs的镜像。拉取官网镜像,将数据卷挂载到搭载测试报告的宿主机上,就可以访问了。你只要维护代码的测试用例,自动更新测试报告。

看下展示效果:

image.png

代码如下:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 基础包:日志服务

import logging
import constants as cs
import logging.handlers

def get_logger(name=‘report‘):
    FORMAT = ‘%(message)s‘
    filename = cs.REPORT_PATH + name + cs.NOW
    logging.basicConfig(level=logging.WARNING, format=FORMAT,
                       filename=filename, filemode=‘w‘)
    return logging

三、调用接口的requests

代码如下:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 基础包:接口测试的封装

import requests
import json

def change_type(value):
    """
    对dict类型进行中文识别
    :param value: 传的数据值
    :return: 转码后的值
    """
    result = eval(json.dumps(value, ensure_ascii=False, encoding="UTF-8"))
    return result

def api(method, url, data, headers):
    """
    定义一个请求接口的方法和需要的参数
    :param method: 请求类型
    :param url: 请求地址
    :param data: 请求参数
    :param headers: 请求headers
    :return: code码
    """
    global results
    try:
        if method == ("post" or "POST"):
            results = requests.post(url, data, headers=headers)
        if method == ("get" or "GET"):
            results = requests.get(url, data, headers=headers)
        response = results.json()
        code = response.get("code")
        return code
    except Exception, e:
        print ("请求失败 %s" % e)

四、业务包调用封装包(common.py)

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 业务包:通用函数

import lib.tezMysql as mysql
import lib.tezLog as log
import lib.tezRequest as request
import lib.tezConfig as conf
import constants as cs
import os

def prepare_data(host, user, password, db, sql):
    """
    数据准备,添加测试数据
    :param host: 服务地址
    :param user: 用户
    :param password: 密码
    :param db: 数据库名
    :param sql: 执行的SQL
    :return:
    """
    mysql.connect(host, user, password, db)
    res = mysql.execute(sql)
    mysql.close()
    print ("Run sql: the row number affected is %s" % res)
    return res

def get_prepare_sql(filename, key):
    """
    获取预备执行的SQL
    :param title: 配置文件头信息
    :param key: 配置文件值
    :return: Value
    """
    try:
        conf.get_config(filename)
        value = conf.get_data(title=cs.TITLE, key=key)
        return value
    except Exception, e:
        print ("获取用例参数值失败 %s" % e)

def reset_report(filename):
    try:
        result = os.path.exists(cs.REPORT_PATH)
        if result == True:
            conf.get_config(filename)
            reportName = eval(conf.get_data(title=cs.REPORT_NAME, key=cs.REPORT))
            report_name = eval(conf.get_data(title=cs.REPORT_NAME, key=cs.R_NAME))
            file = open(cs.YML_REPORT, ‘r‘)
            list_con = file.readlines()
            content = str(list_con).decode("string_escape")
            fileContent = "- [%s, %s]"
            row = "\n"
            con = row + fileContent % (reportName + cs.NOW, report_name)

            if fileContent % (reportName + cs.NOW, report_name) not in content:
                f = open(cs.YML_REPORT, ‘a+‘)
                f.write(con)
            else:
                print ("内容已经存在 %s" % con)
    except Exception, e:
        print ("文件路径不存在 %s", e)

def run_test(filename):
    conf.get_config(filename)
    list = eval(conf.get_title_list())
    reportName = eval(conf.get_data(cs.REPORT_NAME, key=cs.REPORT))
    logging = log.get_logger(reportName)
    for i in range(2, len(list)):
        title = list[i]
        number = eval(conf.get_data(title, key=cs.NUMBER))
        name = str(conf.get_data(title, key=cs.NAME))
        method = str(conf.get_data(title, key=cs.METHOD))
        url = str(conf.get_data(title, key=cs.URL))
        data = request.change_type(conf.get_data(title, key=cs.DATA))
        headers = eval(conf.get_data(title, key=cs.HEADERS))
        testUrl = cs.TEST_URL + url
        actualCode = request.api(method, testUrl, data, headers)
        expectCode = conf.get_data(title, key=cs.CODE)

        if actualCode != expectCode:
            print "FailInfo"
            print number
            logging.warning("- <font color=#FFB5C5 size=3>FailCase : %s", name)
            logging.warning("    - <font color=#FFB5C5 size=3>Number : %s", number)
            logging.warning("    - <font color=#FFB5C5 size=3>Method : %s", method)
            logging.warning("    - <font color=#FFB5C5 size=3>Url : %s", testUrl)
            logging.warning("    - Data : </br> ``` %s ```", data)
            logging.warning("    - Headers : </br> ``` %s ```", headers)
            logging.warning("    - <font color=#FFB5C5 size=3>期望值 : %s", expectCode)
            logging.warning("    - <font color=#FFB5C5 size=3>实际值 : %s", str(actualCode))
            logging.warning("*****************")
        else:
            print number
            print "TrueInfo"
            logging.warning("- <font color=#3cc8b4 size=3> TrueCase %s", name)
            logging.warning("*****************")

五、执行包(run.py)

import util.common as common
import sys

# FILENAME = sys.argv[1]

FILENAME = "proUser.ini"

"""1.新建测试报告目录"""
common.reset_report(filename=FILENAME)

"""2.执行测试用例"""
common.run_test(filename=FILENAME)

PS:有个全局变量包constant.py,里面看到是参数目录文件相关的

作者:赫本z
链接:https://www.jianshu.com/p/459e578f86e6
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

原文地址:https://www.cnblogs.com/peter200-OK/p/9086087.html

时间: 2024-10-10 08:53:57

Python Api接口自动化测试框架 代码写用例的相关文章

python+requests接口自动化测试框架实例详解教程

转自https://my.oschina.net/u/3041656/blog/820023 摘要: python + requests实现的接口自动化框架详细教程 前段时间由于公司测试方向的转型,由原来的web页面功能测试转变成接口测试,之前大多都是手工进行,利用postman和jmeter进行的接口测试,后来,组内有人讲原先web自动化的测试框架移驾成接口的自动化框架,使用的是java语言,但对于一个学java,却在学python的我来说,觉得python比起java更简单些,所以,我决定自

python+requests接口自动化测试框架实例详解

前段时间由于公司测试方向的转型,由原来的web页面功能测试转变成接口测试,之前大多都是手工进行,利用postman和jmeter进行的接口测试,后来,组内有人讲原先web自动化的测试框架移驾成接口的自动化框架,使用的是java语言,但对于一个学java,却在学python的我来说,觉得python比起java更简单些,所以,我决定自己写python的接口自动化测试框架,由于本人也是刚学习python,这套自动化框架目前已经基本完成了,于是进行一些总结,便于以后回顾温习,有许多不完善的地方,也遇到

REST API 自动化测试 利器Rest Assured(API接口自动化测试框架体系)

现在,越来越多的 Web 应用转向了 RESTful 的架构,很多产品和应用暴露给用户的往往就是一组 REST API,这样有一个好处,用户可以根据需要,调用不同的 API,整合出自己的应用出来.从这个角度来讲,Web 开发的成本会越来越低,人们不必再维护自己的信息孤岛,而是使用 REST API 互联互通 那么,作为 REST API 的提供者,如何确保 API 的稳定性与正确性呢?全面系统的测试是必不可少的.Java 程序员常常借助于 JUnit 来测试自己的 REST API,不,应该这样

基于python的接口自动化测试框架

公司内部的软件采用B/S架构,大部分是数据的增删改查,由于还在开发阶段,所以UI界面的变化非常快,难以针对UI进行自动化测试,那样会消耗大量的精力与时间维护自动化脚本.针对此种情况,针对接口测试较为有效. 工具选择 针对接口测试的工具也很多,例如soup UI, robot framework ,甚至jmeter这样的性能测试工具也可以进行接口测试. robot framework测试框架有很多的第三方库可以使用,采用的是填表的方式进行,较容易上手,但是无法深入底层的了解客户端与服务器的交互过程

【python3+request】python3+requests接口自动化测试框架实例详解教程

转自:https://my.oschina.net/u/3041656/blog/820023 前段时间由于公司测试方向的转型,由原来的web页面功能测试转变成接口测试,之前大多都是手工进行,利用postman和jmeter进行的接口测试,后来,组内有人讲原先web自动化的测试框架移驾成接口的自动化框架,使用的是java语言,但对于一个学java,却在学python的我来说,觉得python比起java更简单些,所以,我决定自己写python的接口自动化测试框架,由于本人也是刚学习python,

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

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

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

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

Python接口自动化测试框架实战 从设计到开发

第1章 课程介绍(不要错过)本章主要讲解课程的详细安排.课程学习要求.课程面向用户等,让大家很直观的对课程有整体认知! 第2章 接口测试工具Fiddler的运用本章重点讲解如何抓app\web的http\https请求包.如何模拟请求数据.过滤规则及修改响应数据.如何解决无法抓包问题        以及fiddler接口测试,让大家能应用好工具! 第3章 Requests常见方法实战运用本章重点讲解 get\post请求测试.接口测试中结果处理.上传\下载文件接口测试.请求中header及coo

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