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

news2024/11/17 5:31:26

目录

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

简介

引言

为什么要做接口自动化测试?

为什么要自己写框架呢?

一个现有的简单接口例子

接口信息如下

测试思路

原始脚本实现

未优化

优化 第一版

优化 第二版

优化 第三版

最终输出日志信息

后续改进建议

总结:


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

简介

本文通过从Postman获取基本的接口测试Code简单的接口测试入手,一步步调整优化接口调用,以及增加基本的结果判断,讲解Python自带的Unittest框架调用,期望各位可以通过本文对接口自动化测试有一个大致的了解。

引言

为什么要做接口自动化测试?

在当前互联网产品迭代频繁的背景下,回归测试的时间越来越少,很难在每个迭代都对所有功能做完整回归。但接口自动化测试因其实现简单、维护成本低,容易提高覆盖率等特点,越来越受重视。

为什么要自己写框架呢?

使用Postman调试通过过直接可以获取接口测试的基本代码,结合使用requets + unittest很容易实现接口自动化测试的封装,而且requests的api已经非常人性化,非常简单,但通过封装以后(特别是针对公司内特定接口),可以进一步提高脚本编写效率。

一个现有的简单接口例子

下面使用requests + unittest测试一个查询接口

 

接口信息如下

请求信息:

Method:POST

URL:api/match/image/getjson

Request:

{
"category": "image",
"offset": "0",
"limit": "30",
"sourceId": "0",
"metaTitle": "",
"metaId": "0",
"classify": "unclassify",
"startTime": "",
"endTime": "",
"createStart": "",
"createEnd": "",
"sourceType": "",
"isTracking": "true",
"metaGroup": "",
"companyId": "0",
"lastDays": "1",
"author": ""
}

Response示例:

{
"timestamp" : xxx,
"errorMsg" : "",
"data" : {
"config" : xxx
}

Postman测试方法见截图:

测试思路

1.获取Postman原始脚本

2.使用requests库模拟发送HTTP请求**

3.对原始脚本进行基础改造**

4.使用python标准库里unittest写测试case**

原始脚本实现

未优化

该代码只是简单的一次调用,而且返回的结果太多,很多返回信息暂时没用,示例代码如下

import requests

url = "http://cpright.xinhua-news.cn/api/match/image/getjson"

querystring = {"category":"image","offset":"0","limit":"30","sourceId":"0","metaTitle":"","metaId":"0","classify":"unclassify","startTime":"","endTime":"","createStart":"","createEnd":"","sourceType":"","isTracking":"true","metaGroup":"","companyId":"0","lastDays":"1","author":""}

headers = {
    'cache-control': "no-cache",
    'postman-token': "e97a99b0-424b-b2a5-7602-22cd50223c15"
    }

response = requests.request("POST", url, headers=headers, params=querystring)

print(response.text)

优化 第一版

调整代码结构,输出结果Json出来,获取需要验证的response.status_code,以及获取结果校验需要用到的results['total']

#!/usr/bin/env python
#coding: utf-8
'''
unittest merchant backgroud interface
@author: zhang_jin
@version: 1.0
@see:http://www.python-requests.org/en/master/
'''

import unittest
import json
import traceback
import requests


url = "http://cpright.xinhua-news.cn/api/match/image/getjson"

querystring = {
    "category": "image",
    "offset": "0",
    "limit": "30",
    "sourceId": "0",
    "metaTitle": "",
    "metaId": "0",
    "classify": "unclassify",
    "startTime": "",
    "endTime": "",
    "createStart": "",
    "createEnd": "",
    "sourceType": "",
    "isTracking": "true",
    "metaGroup": "",
    "companyId": "0",
    "lastDays": "1",
    "author": ""
}

headers = {
    'cache-control': "no-cache",
    'postman-token': "e97a99b0-424b-b2a5-7602-22cd50223c15"
    }

#Post接口调用
response = requests.request("POST", url, headers=headers, params=querystring)

#对返回结果进行转义成json串
results = json.loads(response.text)

#获取http请求的status_code
print "Http code:",response.status_code

#获取结果中的total的值
print results['total']
#print(response.text)

优化 第二版

接口调用异常处理,增加try,except处理,对于返回response.status_code,返回200进行结果比对,不是200数据异常信息。

#!/usr/bin/env python
#coding: utf-8
'''
unittest merchant backgroud interface
@author: zhang_jin
@version: 1.0
@see:http://www.python-requests.org/en/master/
'''

import json
import traceback
import requests


url = "http://cpright.xinhua-news.cn/api/match/image/getjson"

querystring = {
    "category": "image",
    "offset": "0",
    "limit": "30",
    "sourceId": "0",
    "metaTitle": "",
    "metaId": "0",
    "classify": "unclassify",
    "startTime": "",
    "endTime": "",
    "createStart": "",
    "createEnd": "",
    "sourceType": "",
    "isTracking": "true",
    "metaGroup": "",
    "companyId": "0",
    "lastDays": "1",
    "author": ""
}

headers = {
    'cache-control': "no-cache",
    'postman-token': "e97a99b0-424b-b2a5-7602-22cd50223c15"
    }


try:
    #Post接口调用
    response = requests.request("POST", url, headers=headers, params=querystring)

    #对http返回值进行判断,对于200做基本校验
    if response.status_code == 200:
        results = json.loads(response.text)
        if results['total'] == 191:
            print "Success"
        else:
            print "Fail"
            print results['total']
    else:
        #对于http返回非200的code,输出相应的code
        raise Exception("http error info:%s" %response.status_code)
except:
    traceback.print_exc()

优化 第三版

1.该版本改动较大,引入config文件,单独封装结果校验模块,引入unittest模块,实现接口自动调用,并增加log处理模块;
2.对不同Post请求结果进行封装,不同接口分开调用;
3.测试用例的结果进行统计并最终输出

   

 

#!/usr/bin/env python
#coding: utf-8
'''
unittest interface
@author: zhang_jin
@version: 1.0
@see:http://www.python-requests.org/en/master/
'''

import unittest
import json
import traceback
import requests
import time
import result_statistics
import config as cf
from com_logger import  match_Logger


class MyTestSuite(unittest.TestCase):
    """docstring for MyTestSuite"""
    #@classmethod
    def sedUp(self):
        print "start..."
    #图片匹配统计
    def test_image_match_001(self):
        url = cf.URL1

        querystring = {
            "category": "image",
            "offset": "0",
            "limit": "30",
          "sourceId": "0",
          "metaTitle": "",
          "metaId": "0",
          "classify": "unclassify",
          "startTime": "",
          "endTime": "",
          "createStart": "",
          "createEnd": "",
          "sourceType": "",
          "isTracking": "true",
          "metaGroup": "",
          "companyId": "0",
          "lastDays": "1",
          "author": ""
        }
        headers = {
            'cache-control': "no-cache",
            'postman-token': "545a2e40-b120-2096-960c-54875be347be"
            }


        response = requests.request("POST", url, headers=headers, params=querystring)
        if response.status_code == 200:
            response.encoding = response.apparent_encoding
            results = json.loads(response.text)
            #预期结果与实际结果校验,调用result_statistics模块
            result_statistics.test_result(results,196)
        else:
            print "http error info:%s" %response.status_code

        #match_Logger.info("start image_query22222")
        #self.assertEqual(results['total'], 888)

        '''
        try:
            self.assertEqual(results['total'], 888)
        except:
            match_Logger.error(traceback.format_exc())
        #print results['total']
        '''

    #文字匹配数据统计
    def test_text_match_001(self):

        text_url = cf.URL2

        querystring = {
            "category": "text",
            "offset": "0",
            "limit": "30",
            "sourceId": "0",
            "metaTitle": "",
            "metaId": "0",
            "startTime": "2017-04-14",
            "endTime": "2017-04-15",
            "createStart": "",
            "createEnd": "",
            "sourceType": "",
            "isTracking": "true",
            "metaGroup": "",
            "companyId": "0",
            "lastDays": "0",
            "author": "",
            "content": ""
        }
        headers = {
            'cache-control': "no-cache",
            'postman-token': "ef3c29d8-1c88-062a-76d9-f2fbebf2536c"
            }

        response = requests.request("POST", text_url, headers=headers, params=querystring)

        if response.status_code == 200:
            response.encoding = response.apparent_encoding
            results = json.loads(response.text)
            #预期结果与实际结果校验,调用result_statistics模块
            result_statistics.test_result(results,190)
        else:
            print "http error info:%s" %response.status_code

        #print(response.text)

    def tearDown(self): 
        pass

if __name__ == '__main__':
    #image_match_Logger = ALogger('image_match', log_level='INFO')

    #构造测试集合
    suite=unittest.TestSuite()
    suite.addTest(MyTestSuite("test_image_match_001"))
    suite.addTest(MyTestSuite("test_text_match_001"))

    #执行测试
    runner = unittest.TextTestRunner()
    runner.run(suite)
    print "success case:",result_statistics.num_success
    print "fail case:",result_statistics.num_fail
    #unittest.main()

最终输出日志信息

Zj-Mac:unittest lazybone$ python image_test_3.py 
测试结果:通过

.测试结果:不通过 
错误信息: 期望返回值:190 实际返回值:4522

.
----------------------------------------------------------------------
Ran 2 tests in 0.889s

OK
success case: 1
fail case: 1

后续改进建议

1.unittest输出报告也可以推荐使用HTMLTestRunner(我目前是对结果统计进行了封装)

2.接口的继续封装,参数化,模块化

3.unittest单元测试框架实现参数化调用第三方模块引用(nose-parameterized)

4.持续集成运行环境、定时任务、触发运行、邮件发送等一系列功能均可以在Jenkins上实现。

总结:

感谢每一个认真阅读我文章的人!!!

我个人整理了我这几年软件测试生涯整理的一些技术资料,包含:电子书,简历模块,各种工作模板,面试宝典,自学项目等。欢迎大家点击下方名片免费领取,千万不要错过哦。

   Python自动化测试学习交流群:全套自动化测试面试简历学习资料获取点击链接加入群聊【python自动化测试交流】:http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=DhOSZDNS-qzT5QKbFQMsfJ7DsrFfKpOF&authKey=eBt%2BF%2FBK81lVLcsLKaFqnvDAVA8IdNsGC7J0YV73w8V%2FJpdbby66r7vJ1rsPIifg&noverify=0&group_code=198408628

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/700505.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ubuntu20.04系统4060安装cuda11.8和cudnn8.6

ubuntu20.04系统4060安装cuda11.8和cudnn8.6 一:安装nvidia-driver-525 1:查看本机显卡能够配置的驱动信息 在终端输入: ubuntu-drivers devices2:推荐安装的版本号是: 安装代码: sudo apt install n…

JPA-querydsl增强工具,query-dsl-plus,现在已开源并推送到mvnrepository

前言 由于喜欢使用JPA,所以后续就接触了query-dsl,但是呢,随着需求的变更,数据查询条件也会越来越复杂(这个和jpa没关系,就算使用mybatis也一样),往往前端改动了,后端还…

【亲测】python 安装 pillow报错 如何处理

今天在新系统上安装pillow库,提示错误: WARNING: Retrying (Retry(total4, connectNone, readNone, redirectNone, statusNone)) after connection broken by SSLError(SSLEOFError(8, EOF occurred in violation of protocol (_ssl.c:997))): /simple/…

LangChain_ChatGLM部署

环境准备 项目地址:https://github.com/imClumsyPanda/langchain-ChatGLM 下载chatglm-6b模型到本地,大约13G: https://huggingface.co/THUDM/chatglm-6b 里面的文件需要一个个手动点击下载,点击下载时,可能需要多次点…

HBase(8):扫描操作

1 需求 查看ORDER_INFO表中所有的数据 1.2 scan命令 在HBase,我们可以使用scan命令来扫描HBase中的表。语法: scan 表名 1.3 扫描ORDER_INFO表 scan ORDER_INFO,{FORMATTER > toString} 注意:要避免scan一张大表! 2 需求二…

[Arduino] ESP32开发 - LCD1602显示实验

目录 LCD1602硬件准备环境搭设接线获取 IIC 地址显示第一行文本可滚动字符串点灯小案例 LCD1602 实验将利用 LCD1602 显示文本 参考文献:https://randomnerdtutorials.com/esp32-esp8266-i2c-lcd-arduino-ide/ 硬件准备 4 条母对母杜邦线 LCD1602 Esp32-Devkit-V1 …

JProfiler 使用中文说明文档

JProfiler 是一款用于 Java 应用程序性能分析和优化的工具。它可以帮助开发人员识别性能瓶颈、内存泄漏等问题,并提供可视化的分析报告和建议。JProfiler 支持各种 Java 虚拟机、应用服务器和操作系统,可以在本地或远程环境中运行。下载安装完成后对应的…

目标检测模型中的Bells and wisthles

目标检测模型中的Bells and wisthles 目标检测模型中的Bells and wisthles1. Data augmentation 数据增强2. Multi-scale Training/Testing 多尺度训练/测试3. Global Context 全局语境4. Box Refinement/Voting 预测框微调/投票法5. OHEM 在线难例挖掘6. Soft NMS 软化非极大抑…

云原生——云平台操作

❄️作者介绍:奇妙的大歪❄️ 🎀个人名言:但行前路,不负韶华!🎀 🐽个人简介:云计算网络运维专业人员🐽 前言 云:云是网络、互联网的一种比喻说法。 平台&am…

【爬虫】5.2 Selenium编写爬虫程序

1. Selenium 框架介绍 Selenium自动化测试框架是实现自动化测试的一个软件结构和功能组件集合。Selenium自动化测试框架是一个半成品,能够帮助用户实现自动化测试。Selenium是模仿浏览器行为的,当你运行测试类(爬虫)的时候&…

【AIGC】Chatglm2-lora微调

ChatGLM2介绍 ChatGLM2-6B源码地址:https://github.com/THUDM/ChatGLM2-6B ChatGLM2-6B 是开源中英双语对话模型 ChatGLM-6B 的第二代版本,在保留了初代模型对话流畅、部署门槛较低等众多优秀特性的基础之上,ChatGLM2-6B 引入了如下新特性&…

【Java】Java中的异常

文章目录 一、什么是异常1.1 异常的概念1.2 异常的分类 二、异常的体系结构三、异常的处理3.1 异常的抛出3.2 异常的捕获与处理3.3 异常的处理流程 四、自定义异常类4.1 自定义异常类的规则4.2 自定义异常案例 一、什么是异常 1.1 异常的概念 在Java中,异常&#…

《Linux操作系统编程》第八章 Shell程序设计: shell 语言结构,包括测试、分支、循环、跳转、函数、语句组

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

C++ DAY3

1.思维导图 2.有以下类定义&#xff0c;按要求实现剩余功能 #include <iostream> using namespace std;class Person { private:int age;int *p; public://无参构造Person():p(new int(89)){age 18;}//有参构造Person(int age,int num){this->age age;this->pne…

基于Java实验室开放管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

Servlet实现留言墙

目录 1.创建工程 2.构建目录工程结构 3.设置编码格式尾utf-8 4.查看Maven配置 5.一些其他配置​编辑 6.导入依赖 7.导入HTML和JS、配置tomcat 8.测试网站是否可以正常访问 9.编写业务代码 开发环境&#xff1a;idea2022.2社区版 1.创建工程 2.构建目录工程结构 web.xml中的…

《程序员的AI书_从代码开始》第一章 机器学习的Hello World

文章目录 1.3 从代码开始1.3.2 一段简单的代码 1.3 从代码开始 1.3.2 一段简单的代码 python导入tensflow.keras报错解决方法 import tensorflow as tf from tensorflow.python.keras.models import Sequential from tensorflow.python.keras.layers import DensemodelSeque…

为什么网络攻击绝大多数发生在游戏行业

近年来&#xff0c;游戏行业欣欣向荣&#xff0c;游戏玩家也呈指数级增长&#xff0c;全球数以亿计的游戏玩家享受着网络游戏广泛的互动体验&#xff0c;然而&#xff0c;由于游戏的崛起和受欢迎程度也使其成为网络黑客寻求利用其漏洞的首选目标。 出于多种原因&#xff0c;游…

MybatisPlus的分页插件自动优化LeftJoin语句导致参数不匹配

所报的错误&#xff1a; java.sql.SQLException: Parameter index out of range (3 &#xff1e; number of parameters, which is 2). 首先会去检查自己传了哪些参数&#xff1f;是否都用上了&#xff1f;反复检查&#xff0c;发现并没有多余的参数&#xff1a; controller…

目前主流的软件开发模型:瀑布模型,增量模型(渐增模型,快速原型模型),螺旋模型,喷泉模型,敏捷模型。

目录 前言&#xff1a; 一、瀑布模型&#xff1a; 二、增量模型&#xff1a; 三、螺旋模型&#xff1a; 四、喷泉模型&#xff1a; 五、敏捷开发模型&#xff1a; 前言&#xff1a; 软件开发模型是用来指导和组织软件开发过程的模式或方法。随着软件行业的发展和不断变化…