在实际工作中使用requests+unittest进行接口测试
之前学习python做接口测试时,用的时requests+excel的方式来进行接口测试,后来在工作中也用unittest来做了一个项目的接口测试,接口测试用例完全基于unittest来编写,把大致步骤记录一下。
项目背景
之前公司的测试并没有在前期就介入项目,即使是接口测试,也是在研发人员完成项目开发后再进行的接口校验,其实更接近于验证一下接口功能是否正常实现了,一般这种工作我更喜欢使用postman来进行,一个一个把接口录入postman,每个都单独校验一下,最终也会形成一套测试脚本(对于没有代码能力又要进行接口测试的人来说简直是神器)。后来再论坛看其他人的经验贴时,发现其实对于公司这种接口比较少的项目,也完全可以用python自带的unittest来写测试用例,一个接口写作一个py文件,其实也很简洁,相对于requests+excel的方式省去了读取/解析excel文件的步骤,维护起来也不麻烦。
结构说明

base_data: 封装了一些基础数据,如固定的ip地址、端口(方便后期修改)
common_utils: 存放了一些配置文件、读取配置文件的方法、发送请求的方法
reports:存放测试报告
test_suits: 存放接口测试用例
run_report.py: 最终运行文件,即调用测试用例,执行后生成报告
每个模块下的具体内容
1.common_utils

config.ini
配置文件
[URL]
# url = http://192.168.XXX:7001
url = http://192.168.XXX:8080
read_config.py
读取配置文件的方法 # -*- coding:utf-8 -*- import configparser
import os class ReadConfig:
def __init__(self, filepath=None):
if filepath:
configpath1 = filepath
else:
root_dir1 = os.path.dirname(__file__) # 获取当前脚本的目录
configpath1 = os.path.join(root_dir1, "config.ini") # 拼接路径
# print(root_dir1) # root_dir = os.path.dirname(os.path.abspath('.')) # 获取当前脚本所在目录的上一级目录
# configpath = os.path.join(root_dir, "common_utils/config.ini") # 拼接路径
# print(root_dir) self.cf = configparser.ConfigParser()
self.cf.read(configpath1) def get_host(self, param):
value = self.cf.get("URL", param)
return value base_url = ReadConfig() # if __name__ == '__main__':
# test = ReadConfig()
# t = test.get_host("url")
# print(t)
# print(base_url.get_host("URL"))
send_request.py
请求方法类
# -*- coding:utf-8 -*- import requests
import json
from requests.exceptions import RequestException class RunMethod:
"""定义一个执行接口请求的类""" @staticmethod
def send_get(url, data=None, header=None):
response = requests.get(url=url, params=data, headers=header, timeout=20)
try:
if response.status_code == 200:
r = response
return r
else:
return None
except RequestException:
print("请求失败")
return None @staticmethod
def send_post(url, data=None, header=None):
response = requests.post(url=url, data=data, headers=header, timeout=20)
try:
if response.status_code == 200:
r = response
return r
else:
return None
except RequestException:
print("请求失败")
return None def run_main(self, method, url, data=None, header=None):
if method == "GET":
res = self.send_get(url, data, header)
else:
res = self.send_post(url, data, header)
# return json.dumps(res, indent=2, sort_keys=False, ensure_ascii=False)
return res if __name__ == '__main__':
url = "http://192.168.XXX:7001/ApprLicenseInterface/saveFile.v"
data = {'ATTACH_SIZE': "", 'ATTACH_URL': "/mnt/MDFilesPath/APPR_STUFF_ATTACH/B2018120709470002/Rectangle.png",
'ATTACH_CREATOR': "", 'PARENTID': "-1", 'ATTACH_NAME': "67d06265bb814e6aa0f8f87913ab4f4e.pdf"}
t = RunMethod()
print(t.run_main("GET", url, data))
print(type(t.run_main("GET", url, data)))
2.base_data

base_data.py
基础数据,从配置文件取数据
# -*- coding:utf-8 -*- from common_utils.read_config import ReadConfig
import os class BaseData:
def __init__(self):
self.data = ReadConfig() def get_ip(self):
"""从配置文件中获取固定ip"""
ip = self.data.get_host("url")
return ip base_data = BaseData()
# print(base_data.get_ip())
3.test_suits

这里面就是存放的接口测试用例了,一个文件代表一个接口,每个文件中根据实际情况存在多条用例(根据传参不同来组合)
注意:为了再后面往套件中添加用例文件,为每个用例文件都加了test_前缀;
说下遇到的一个问题:因为接口文档中每个接口都有一个编号,如下

所以开始我的命名方式是 test_5.2.1.1+接口名称,然后发现在把用例添加到测试套件时总是识别不到,后来把数字去掉才可以,至今不知道什么原因导致的。。。
一个例子
# -*- coding:utf-8 -*- import unittest
from common_utils.send_request import RunMethod
from base_data.base_data import *
import json run = RunMethod()
class Test(unittest.TestCase):
""" 5.2.1.3、依职能查验用证:通过目录编码以及身份证件号码获取证照"""
@classmethod
def setUpClass(cls):
cls.url = base_data.get_ip() + "/XXX/licenseList/identity.v" @classmethod
def tearDownClass(cls):
pass def test01(self):
"""参数正常"""
data = {"licenseDirNum":"",
"identityNumbers":""}
r = run.run_main("GET", self.url, data)
res = r.json()
print(json.dumps(res, indent=2, sort_keys=False, ensure_ascii=False))
self.assertEqual("", res["status"])
self.assertNotEqual([], res["data"]["dataList"]) # 判断dataList不为空 def test02(self):
"""licenseDirNum为空"""
data = {"licenseDirNum":"",
"identityNumbers":""}
r = run.run_main("GET", self.url, data)
res = r.json()
print(json.dumps(res, indent=2, sort_keys=False, ensure_ascii=False))
self.assertEqual("传入的参数:(licenseDirNum)不能为空", res["desc"])
self.assertTrue(res["data"] is None) # 判断返回结果的data值为空
self.assertIsNone(res["data"]) # 判断返回结果的data值为空
# self.assertNotEqual([], res["data"]["dataList"]) def test03(self):
"""identityNumbers为空"""
data = {"licenseDirNum": "",
"identityNumbers": ""}
r = run.run_main("GET", self.url, data)
res = r.json()
print(json.dumps(res, indent=2, sort_keys=False, ensure_ascii=False))
self.assertEqual("传入的参数:(identityNumbers)不能为空", res["desc"])
self.assertTrue(res["data"] is None) # 判断返回结果的data值为空 if __name__ == '__main__':
suite = unittest.TestSuite() # 调用unittest的TestSuite(),理解为管理case的一个容器(测试套件)
suite.addTest(Test('test01')) # 向测试套件中添加用例,"TestMethod"是上面定义的类名,"test01"是用例名
runner = unittest.TextTestRunner()
runner.run(suite) # 执行套件中的用例
4.run_report.py
# coding: utf-8
# author: hmk import HTMLTestRunner
import unittest
import time, os root_dir = os.path.dirname(os.path.abspath(__file__)) # 获取当前脚本的目录
case_dir = root_dir + '/test_suits' # 根据项目所在路径,找到用例所在的相对项目的路径
# case_dir1 = 'E:/5.coding\电子证照库接口/test_suits\电子证照类'
print(root_dir)
print(case_dir) suits = unittest.defaultTestLoader.discover(case_dir, pattern='test_*.py', top_level_dir=None) # 加载用例,用例文件名最好不要有数字,否则导致识别不到 suit = unittest.TestLoader().discover(case_dir) # 加载用例 """
1.case_dir即测试用例所在目录
2.pattern='test_*.py' :表示用例文件名的匹配原则,“*”表示任意多个字符
3.top_level_dir=None:测试模块的顶层目录。如果没顶层目录(也就是说测试用例不是放在多级目录
中),默认为 None
""" if __name__ == '__main__':
now_time = time.strftime("%Y-%m-%d %H-%M-%S")
filename = root_dir + '/reports/' + now_time + '_result.html' # 定义报告文件 # fp = open(filename, 'wb')
# runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title='电子证照库接口测试报告',description='测试结果如下: ')
# runner.run(suit)
# fp.close() # 普通方式打开文件 with open(filename, 'wb') as fp:
"""使用withopen操作文件"""
runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title='电子证照库接口测试报告', description='测试结果如下: ')
runner.run(suits)
最后执行run_report.py即可运行全部接口用例,得到测试报告

在实际工作中使用requests+unittest进行接口测试的更多相关文章
- python+requests+unittest API接口测试
黑熊再网上查找了下接口测试相关的资料,大都重点是以数据驱动的形式,见用例维护在文本或表格中,而没有说明怎么样去生成想要的用例, 问题: 测试接口时,比如参数a,b,c,我要先测a参数,有(不传,为空, ...
- Python3 + requests + unittest接口测试
一.缘 起 笔者最近完成了基于Python3 + requests + unittest的接口测试脚本,故在此做一下记录,于己为复盘,于彼为学习和参考 二.思 路 接口测试无非三步: 首先,造数据 - ...
- 对比3种接口测试的工具:jmeter+ant;postman;python的requests+unittest或requests+excel
这篇随笔主要是对比下笔者接触过的3种接口测试工具,从实际使用的角度来分析下3种工具各自的特点 分别为:jmeter.postman.python的requests+unittest或requests+ ...
- [工作中的设计模式]责任链模式chain
一.模式解析 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知 ...
- requests+unittest+ddt+xlrd+pymysql+BeautifulReport数据驱动
# ddcapitestpython XXX接口自动化测试 # 一.数据驱动的思路 1.采用requests+unittest+ddt+xlrd+pymysql+BeautifulReport 2.r ...
- 随机记录工作中常见的sql用法错误(一)
没事开始写博客,留下以前工作中常用的笔记,内容不全或者需要补充的可以留言,我只写我常用的. 网上很多类似动软生成器的小工具,这类工具虽然在表关系复杂的时候没什么软用,但是在一些简单的表结构关系还是很方 ...
- 工作中常用的js、jquery自定义扩展函数代码片段
仅记录一些我工作中常用的自定义js函数. 1.获取URL请求参数 //根据URL获取Id function GetQueryString(name) { var reg = new RegExp(&q ...
- 工作中那些提高你效率的神器(第二篇)_Listary
引言 无论是工作还是科研,我们都希望工作既快又好,然而大多数时候却迷失在繁杂的重复劳动中,久久无法摆脱繁杂的事情. 你是不是曾有这样一种想法:如果我有哆啦A梦的口袋,只要拿出神奇道具就可解当下棘手的问 ...
- 工作中那些提高你效率的神器(第一篇)_Everything
引言 无论是工作还是科研,我们都希望工作既快又好,然而大多数时候却迷失在繁杂的重复劳动中,久久无法摆脱繁杂的事情. 你是不是曾有这样一种想法:如果我有哆啦A梦的口袋,只要拿出神奇道具就可解当下棘手的问 ...
随机推荐
- [java 基础]反射入门
原文 概况 使用java的反射,可以让我们检查(或者修改)类,接口,字段,方法的特性.当你在编译期不知道他们的名字的时候非常有用. 除此之外,可以使用反射来创建实例,调用方法或者get/set 字段值 ...
- css兄弟选择器,+ ~选择器的区别
壹 ❀ 引 实习生在写搜索框下拉提示时,遇到了不知道怎么解决的问题,所以来问我.效果不难,鼠标选中输入框(focus)时,展示搜索关键字相关提示,看了眼dom结构是这样的: 在她的理解里面,选中父元 ...
- spring cloud 2.x版本 Gateway熔断、限流教程
前言 本文采用Spring cloud本文为2.1.8RELEASE,version=Greenwich.SR3 本文基于前两篇文章eureka-server.eureka-client.eureka ...
- IT兄弟连 HTML5教程 HTML5行业的发展预测
现在的互联网市场上,HTML5在快速地成长,甚至是未来几年里将会有很多公司进入HTML5这个领域,HTML5也会像传统的Flex,Flash,Silverlight和Objective-C那样,更容易 ...
- Springboot 打包自带启动脚本
一直以来,我都是 gradlew build java -jar xxx.jar 来启动springboot项目的.今天突然发现,springboot自动封装了一个bootJar的任务脚本. demo ...
- Web前端基础(2):HTML(二)
1. body中的相关标签 1.1 标题标签:hn HTML提供<hn>系列标签,用于修饰标签,包含:<h1>.<h2>.<h3>.<h4> ...
- 盲法介绍及python盲打练习系统
目录 一:盲打简介与优点 二:如何练习 三:键盘字母排列顺序的口诀 四:python打字练习系统 一:盲打简介与优点 简介:盲打是指打字的时候不用看键盘或看稿打字时的视线不用来回于文稿和键盘之间的 ...
- C# 结构与类
结构是一种可以包含数据成员和方法成员的值类型数据结构.为结构分配数据时不需要从托管堆中分配内存,结构类型的变量直接包含了该结构的数据.结构中可以包含构造函数,常量,字段方法,属性,运算符,事件和嵌套类 ...
- 边框渐变背景色border-image: linear-gradient()
前言 前几天无意间听说了边框渐变背景色,网上查了下,没有发现与之有关的介绍,亲测之后和大家分享一下. 边框渐变背景色 写法 border-image: gradient top right botto ...
- 干货:Wireshark使用技巧-显示规则
- 显示规则使用 在Wireshark界面对已经抓取的报文在界面的显示进行控制的规则,称为显示规则,显示规则只是让一部分不符合规则的报文不被显示,但未被丢弃,这些报文仍然存在在Wireshark的系统 ...