接口自动化测试:python+json+requests+数据驱动
接口测试是单元测试的一个子集,但又不等同于单元测试。从测试的角度
来看,接口测试的价值在于其测试投入比单元测试少,而且技术难度也比单元测
试小。一般来说,接口测试的粒度要比单元测试更粗,它主要是基于子系统或者
子模块的接口层面的测试。因此,接口测试需要测试的接口或者函数的数量会远
远小于单元测试,与此同时,接口定义的稳定性会远远高于类级别的函数。所以,
接口测试用例代码的改动量也远远小于单元测试,代码维护成本会比单元测试少
很多,因而测试的投入量会小很多。从另外一个层面来看,借助于接口测试,可
以保证子系统或子模块在各种应用场景下接口调用的正确性,那么子系统或子模
块的产品质量也可以得到充分的保证。因此,接口测试是一种适度的白盒测试技
术,准确说它是一种灰盒测试,投入产出是非常理想的。
总的来说,接口测试是保证高复杂性系统质量的内在要求和低成本的经
济利益的驱动作用下的最佳解决方案。主要体现在下面的二个方面:
首先,接口测试节省了测试成本。
其次,接口测试不同于传统开发的单元测试,接口测试是站在用户的角
度对系统接口进行全面高效持续的检测。
(ps:以上有网络搜索和自己的总结)
好了,话不多说,接下来我们测试接口的整体思路是这样的:
1、把接口的相关数据保存在json文件中。
2、我们通过去读这个json文件,来读取接口的相关信息,包括:路径、参数、请求方式、比对值等。
3、基于requests封装一个发送请求的方法。
4、使用装饰器来进行具体的测试。
{
"test_1_ip_api": {
"url": "http://httpbin.org/ip",
"assert": {
"origin":"183.16.188.172"
},
"method": "get",
"params": {
"a":"b"
},
"case": "测试httpbin的ip接口返回正常"
}
}
以上就是Json文件的格式,一条这样的数据,代表一条用例:
test_1_ip_api:算作是一个标识。
url:接口的路径。
assert:最后接口的比对值。
method:接口请求方式。
params:请求参数。ps:如果请求方式为post此处为data。
case:此条用例的名字,也就是测试的点。
(注:有些可能需要添加headers,这个用户自己添加一下就行了,但是后面的代码稍微修改一下。)
当然有了文件,那么我们就需要把这个数据给读出来。见如下代码。
class ReadCaseData(object): def __init__(self,filename):
self.filename = filename
self.path = os.path.join(get_super_path(),'data',self.filename)
@property
def read_case_json(self) -> dict:
'''
获取指定文件的json数据
:return:
'''
try:
my_json = open(self.path,encoding='utf-8')
json_data = json.load(my_json)
return json_data
except Exception as err:
print(str(err)) def get_case_content(self,first_key,second_key):
'''
获取json相应值
'''
return self.read_case_json[first_key][second_key] def get_assert_keys(self,first_key):
'''
根据用例名取assert的keys
'''
return self.get_case_content(first_key,'assert').keys() def get_assert_value(self,first_key,assert_key):
'''
取assert的具体值
'''
return self.read_case_json[first_key]['assert'][assert_key] def get_case_name(self,first_key):
'''
获取用例名
'''
return self.get_case_content(first_key,'case')
以上就是读取json文件的各种数据,并根据需要封装了一些方法。(思路:会根据不同的json文件数据,给这个json文件取相应的文件名,那么此处的类就是把这个文件名初始化,然后读取此文件相关的一些数据。)
(注:1、get_super_path()是写的一个获取根目录的方法。)
那么数据读出来了,要怎么运用呢,那么我们就需要借用一下requests(这个库应该不用说了,您如果在找这样的文章,那么我肯定知道这个库罗。)。
def get_base_url():
if IniHelper('server.ini').get_value('server', 'select') == 'test':
return IniHelper('server.ini').get_value('server', 'test')
elif IniHelper('server.ini').get_value('server', 'select') == 'formal':
return IniHelper('server.ini').get_value('server', 'formal')
else:
raise AttributeError("配制文件读取出错!请检查!") class Myrequests(ReadCaseData): def __init__(self, filename, case_name):
ReadCaseData.__init__(self, filename)
self.case_name = case_name
self.base_url = get_base_url() def make_requests_template(self):
'''
根据读取到的json文件中的method,来发送不到的请求,目前只能发送get和post请求
:return:
'''
if self.get_case_content(self.case_name, 'method').lower() == 'get':
body = {}
body['url'] = self.base_url + self.get_case_content(self.case_name, 'url')
body['params'] = self.get_case_content(self.case_name, 'params')
return self.get(**body)
elif self.get_case_content(self.case_name, 'method').lower() == 'post':
body = {}
body['url'] = self.base_url + self.get_case_content(self.case_name, 'url')
body['params'] = self.get_case_content(self.case_name, 'data')
return self.post(**body)
else:
raise AttributeError("错误的请求方法, 请检查配置文件中的请求方法, 目前只支持['GET', 'POST']") def get(self, **kw):
'''
使用requests发送get请求
:param kw: 参数需要传一个字典表
:return:
'''
return requests.get(**kw) def post(self, **kw):
'''
使用requests发送post请求
:param kw:参数需要传一个字典表
:return:
'''
return requests.post(**kw) @property
def get_json(self):
'''
返回接口的json数据
:return:
'''
try:
return self.make_requests_template().json()
except Exception as e:
print('json format error' + str(e)) @property
def get_status_code(self):
'''
返回接口发送后的status_code值
:return:
'''
return self.make_requests_template().status_code
这里首先是继承了我们刚刚封装的读取的json文件的类,因为继承过后就可以使用他的一些方法,然后通过读取里面的数据来发送请求等。
注:我这里的接口的服务器地址是通过读取配置文件里的,这个代码就不分享了,大家网找一下,很多。(随意啦)
ps:1、IniHelper是封装的一个读取配置文件的类。
2、此处只封装了get和post,当然也可以继续添加其它(比如:put、delete等等!!)
数据也读出来了,发送请求的方法也封装好了,那么接下来要怎么用这些数据来测试呢?
def test_case_run(data_file_name, test_case_key):
def _test_case_run(func):
def wrap(self):
r = Myrequests(filename=data_file_name, case_name=test_case_key)
self.r = r
self._testMethodDoc = r.get_case_name(test_case_key)
self.status_code = r.get_status_code
self.json = r.get_json
self.assert_key = r.get_assert_keys(test_case_key)
log.get_log(test_case_key).info(f'开始测试:{test_case_key}')
log.get_log(test_case_key).info('比对:status_code')
self.assertEqual(r.get_status_code, 200)
for key in r.get_assert_keys(test_case_key):
log.get_log(test_case_key).info(f'比对:{key}')
self.assertEqual(get_dict_value(key, **r.get_json), r.get_assert_value(test_case_key, key))
func(self) return wrap return _test_case_run
以上就是根据读取的数据和发送请求的方法封装的一个装饰器。
其中:
log:这个是基于logging封装的记录log的类。
get_assert_value():这个是写的一个根据json数据里读出来的assert的数据里面的Key,来获取实际接口里面返回的value的方法。
(注:1、json里面的assert的数据至少一条,有可能多条。2、使用Key从实际结果中获取value时,可能是多级字典,因此此方法使用了递归)
最后就是我们使用python的unittest来进行测试了。
from src.testcase.method.base_test import BaseTest
from src.testcase.method import wraps
import unittest class TestApi(BaseTest): @wraps.test_case_run('data.json', 'test_1_ip_api')
def test_01(self):
self._testMethodDoc = self._testMethodDoc @wraps.test_case_run('data.json', 'test_2_headers_api')
def test_02(self):
self._testMethodDoc = self._testMethodDoc @wraps.test_case_run('data.json', 'test_3_post_api')
def test_03(self):
self._testMethodDoc = self._testMethodDoc if __name__ == '__main__':
unittest.main(verbosity=2)
以上就是实际具体的用例,我们在每一条case上使用装饰器,然后装饰器有二个参数,这里说明一下:1、就是此case对应的文件名。2、就是此case在json文件中对应的标识。
建议:
1、每一个接口对应一个json文件,然后在这个json文件中为每一条case添一个标识。(文中的Json文件就是一个接口对应的一条case。)
2、所有的json文件放在同一个文件夹下。
3、每一个接口对应一个测试文件。
4、结果最后采用htmltestrunner的html报告输出。
5、把报告通过email发送。
6、使用jenkins在服务器部署。
欢迎大家指证!!!
接口自动化测试:python+json+requests+数据驱动的更多相关文章
- 接口自动化-python unittest+requests+HTMLrunner
从2015年毕业入行软件测试,快满4年了,之前技术分享都在百度贴吧上面,现在正式开始在博客中记录工作技术,努力成长,加油 接口测试的步骤1.组装好该接口需要的参数数据2.使用get或post附带参数数 ...
- python + Jenkins + requests 数据驱动接口测试 环境部署
** Jenkins安装: * 安装包选择:Jenkins.war * windows下有msi和war两种格式,我使用的是war,下载下来丢到xmapp的指定目录就行,操作方便一点 * m ...
- 如何简单实现接口自动化测试(基于 python) 原博主地址https://blog.csdn.net/gitchat/article/details/77849725
如何简单实现接口自动化测试(基于 python) 2017年09月05日 11:52:25 阅读数:9904 GitChat 作者:饿了么技术社区 原文:如何简单实现接口自动化测试(基于 python ...
- 利用Python如何实现数据驱动的接口自动化测试
前言 大家在接口测试的过程中,很多时候会用到对CSV的读取操作,本文主要说明Python3对CSV的写入和读取.下面话不多说了,来一起看看详细的介绍吧. 1.需求 某API,GET方法,token,m ...
- 使用python+requests+unittest实现接口自动化测试
这两天一直在找直接用python做接口自动化的方法,在网上也搜了一些博客参考,今天自己动手试了一下. 一.整体结构 上图是项目的目录结构,下面主要介绍下每个目录的作用. Common:公共方法:主要放 ...
- python+requests接口自动化测试
转自https://my.oschina.net/u/3041656/blog/820023 原来的web页面功能测试转变成接口测试,之前大多都是手工进行,利用postman和jmeter进行的接口测 ...
- python+requests接口自动化测试框架实例详解
python+requests接口自动化测试框架实例详解 转自https://my.oschina.net/u/3041656/blog/820023 摘要: python + requests实 ...
- Python接口自动化测试框架: pytest+allure+jsonpath+requests+excel实现的接口自动化测试框架(学习成果)
废话 最近在自己学习接口自动化测试,这里也算是完成一个小的成果,欢迎大家交流指出不合适的地方,源码在文末 问题 整体代码结构优化未实现,导致最终测试时间变长,其他工具单接口测试只需要39ms,该框架中 ...
- 【接口自动化】Python+Requests接口自动化测试框架搭建【一】
公司项目启用新框架,前后端分离,所以接口测试成为测试工作中不可缺失的一个环节,现在将从0开始搭建接口自动化测试框架的路程,一步步记录下来. 开发语言我们采用Python+第三方库Requests,测试 ...
随机推荐
- Spring Boot + Freemarker多语言国际化的实现
最近在写一些Web的东西,技术上采用了Spring Boot + Bootstrap + jQuery + Freemarker.过程中查了大量的资料,也感受到了前端技术的分裂,每种东西都有N种实现, ...
- js和jquery实现显示隐藏
(选择的重要性) 当点击同一个按钮的时候实现显示影藏 <a id="link" class="b-btn-four task-resolve add-sub-tas ...
- 阿里聚安全·安全周刊】一种秘密窃取数据的新型 Android 木马|iOS 11相机惊现BUG
本周的七个关键词: 新型 Android 木马丨 TLS 1.3 丨 阿里安全图灵实验室 丨 漏洞感染 Linux 服务器 丨 CPU曝极危漏洞 丨 iOS 11相机BUG 丨R2D2技术 - ...
- 以太坊开发DApp实战教程——用区块链、星际文件系统(IPFS)、Node.js和MongoDB来构建电商平台(一)
第一节 简介 欢迎和我们一起来用以太坊开发构建一个去中心化电商DApp!我们将用区块链.星际文件系统(IPFS).Node.js和MongoDB来构建电商平台类似淘宝的在线电商应用,卖家可以自由地出售 ...
- C语言程序设计第三次作业--选择结构(1)
Deadline: 2017-10-29 22:00 一.学习要点 掌握关系运算符和关系表达式 掌握如何判断两个实数相等 掌握常用数学函数的使用 掌握逻辑运算符和逻辑表达式 理解逻辑运算的短路特性 掌 ...
- android数据库持久化框架, ormlite框架,
前言 Android中内置了SQLite,但是对于数据库操作这块,非常的麻烦.其实可以试用第3方的数据库持久化框架对之进行结构上调整, 摆脱了访问数据库操作的细节,不用再去写复杂的SQL语句.虽然这样 ...
- NOIP2016 天天爱跑步 正解
暴力移步 http://www.cnblogs.com/TheRoadToTheGold/p/6673430.html 首先解决本题应用的知识点: dfs序——将求子树的信息(树形)转化为求一段连续区 ...
- pythoncharm 中解决启动server时出现 “django.core.exceptions.ImproperlyConfigured: Requested setting DEBUG, but settings are not configured”的错误
背景介绍 最近,尝试着用pythoncharm 这个All-star IDE来搞一搞Django,于是乎,下载专业版,PJ等等一系列操作之后,终于得偿所愿.可以开工了. 错误 在园子里找了一篇初学者的 ...
- js判断IE浏览器版本(IE8及以下)
var DEFAULT_VERSION = 8.0; var ua = navigator.userAgent.toLowerCase(); var isIE = ua.indexOf("m ...
- Python扩展模块——自动化(testlinkAPI的使用)
使用TESTLINKAPI首先要安装TestLink_API_Python_client-0.6.4(当前最新版本) 目前只使用到了通过api获取testlink中的自定义字段and值 url = ' ...