接口测试基础篇(史上最详细)
接口测试基础篇
有很多小伙伴想要基础版本,从0到1,今天它来了~
用十个特别简单的案例,让你清晰的从0到1接触到接口测试
最好自己动手去写一遍这十个案例,光看是不行的
从刚开始特别简单的案例,到最后略有难度的接口小案例,让你快速清晰的学习接口!
对于接口测试,很多同学可能会说接口真的有测试的必要吗?我只把功能测试好了不就ok了吗?
答案当然是否定的,接口测试的重要性如下:
那么接口提测的标准是什么呢?
首先对于接口文档的要求如下:
接口名称
接口类型
输入参数
- 每个参数名;
- 每个参数类型;
- 每个参数业务含义;
- 每个是否可空;
- 每个字段长度(可选,一般需要提供,有严格要求的字段需特别注明);
接口通用基本要求:
- 返回json字段信息,不可出现 关键字类型,如 object,interface,public,java等各类语言代码中关键字类型
- 涉及金额等信息时应采取加密方式,后端需进行校验,防止通过接口拦截造成损失
- HTTPS方式传输
- 请求方式,一般获取数据是get,提交表单是post
- 信息存取可采取对称加密和非对称加密的结合(可选,也可选一种)
- 接口进行手机号正则验证,字符串和上传文件图片等提前规划大小限制
- 检查数据正确性,每个接口从数据存取数据等是否正确,是否在正确的数据库表取数据等
- 为空等验证一定要做,正确状态码和错误状态码一定全部记录下来,状态码代表的意思等
以上是小白自己总结和平常工作整理的,如有不对请大家指正,希望和大家一起学习进步,共同成长,谢谢
接下来用几个特别简单的案例,来接触学习接口测试之旅吧
如果你是第一次接触开发语言也不要紧,多写多思考,没有人天生就会写代码,都是慢慢学习出来的,在这里python环境如何搭建等就不在累述了,网上能搜到很多如何安装资料
建议如下:
- 使用最新的python版本进行学习
- 代码一定要多写多练多思考
- 学习心得,两个点第一点,多去思考,第二点多敲
准备开始吧,接口用特别简单容易理解的几种案例,带你对接口测试有一个简单的了解
环境:python3.7版本
系统:w7
工具:PyCharm
python官方文档:https://www.python.org/
在接口测试之初呢小白也是懵懵懂懂,接下来开始和小白一起学习研究接口测试吧~
1.第一个案例(发送一个get请求)
# coding=utf-8
import requests
# 请求的链接
url = 'http://suggest.taobao.com/sug?code=utf-8&q=裤子&callback=cb 用例'
# 发送get请求
r = requests.post(url)
# 请求的状态码 200代表成功
status = r.status_code
print(status)
# 请求的内容
j = r.json()
print(j)
输出结果如下:
image
2.第二个案例(发送一个post请求)
# 请求的链接
url = 'http://suggest.taobao.com/sug'
# post请求以字典格式传入
data = {'code': 'utf-8', 'q': '裤子', 'callback': 'cb 用例'}
# 发送post请求
r = requests.post(url, data)
# 请求的状态码 200代表成功
status = r.status_code
print(status)
# 请求的内容
print(r.content)
输出结果如下:
image
(接口只返回了一个b,这里只需要明白遇到post接口怎么去请求就好了~)
3.第三个案例(进行接口状态码断言)
# coding=utf-8
import requests
# 请求的链接
url = 'http://suggest.taobao.com/sug?code=utf-8&q=裤子&callback=cb 用例'
# 发送请求
r = requests.post(url)
# 请求的状态码 200代表成功
status = r.status_code
# 进行接口的状态码断言,等于200则认为通过,不是200不通过
if status == 200:
print('用例测试通过')
else:
print('测试不通过')
print(status)
# 请求的内容
j = r.json()
print(j)
输出结果如下:
image
4.第四个案例(进行接口内容断言-正常情况)
# coding=utf-8
import requests
# 请求的链接
url = 'http://suggest.taobao.com/sug?code=utf-8&q=裤子&callback=cb 用例'
# 发送请求
r = requests.post(url)
# 请求的状态码 200代表成功
status = r.status_code
# 进行接口的状态码断言,等于200则认为通过,不是200不通过
if status == 200:
print('用例测试通过')
else:
print('测试不通过')
print(status)
# 请求的内容
j = r.json()
# 判断接口返回内容里面,有没有 裤子女夏 内容
if '裤子女夏' in str(j):
print('存在此数据')
else:
print('不存在此数据')
print(j)
输出结果如下:
image
5.第五个案例(进行接口内容断言-异常情况)
在这里修改了上面的 裤子女夏 修改为 裤子女夏1
# coding=utf-8
import requests
# 请求的链接
url = 'http://suggest.taobao.com/sug?code=utf-8&q=裤子&callback=cb 用例'
# 发送请求
r = requests.post(url)
# 请求的状态码 200代表成功
status = r.status_code
# 进行接口的状态码断言,等于200则认为通过,不是200不通过
if status == 200:
print('状态码校验过')
else:
print('状态码校验不通过')
print(status)
# 请求的内容
j = r.json()
# 判断接口返回内容里面,有没有 裤子女夏 内容
# 裤子女夏 增加了一个1
if '裤子女夏1' in str(j):
print('存在此数据')
else:
print('不存在此数据')
print(j)
输出结果如下:
image
6.第六个案例(接口的小封装-接口和逻辑代码分开控制-~)
增加config.py主要存放接口
# coding=utf-8
# baseurl 一般接口都是分测试接口和正式接口的,只需要修改ip即可
baseurl = 'http://suggest.taobao.com'
# 假装是登录接口 baseurl=于楼上
url_login = baseurl + '/sug?code=utf-8&q=裤子&callback=cb 用例'
# 假装是注冊接口
url_register = baseurl + '/sug?code=utf-8&q=裤子&callback=cb 用例'
# 假装是首页接口
url_home = baseurl + '/sug?code=utf-8&q=裤子&callback=cb 用例'
增加testapi.py
# coding=utf-8
import requests
# 引入config配置接口的文件
import config
# 发送请求 使用config.来调用想要的接口 调用首页接口
r = requests.get(config.url_home)
# 请求的状态码 200代表成功
status = r.status_code
# 进行接口的状态码断言,等于200则认为通过,不是200不通过
if status == 200:
print('状态码校验过')
else:
print('状态码校验不通过')
print(status)
# 请求的内容
j = r.json()
# 判断接口返回内容里面,有没有 裤子女夏 内容
# 裤子女夏 增加了一个1
if '裤子女夏1' in str(j):
print('存在此数据')
else:
print('不存在此数据')
print(j)
输出结果如下:
image
用心的同学已经发现了,这样的话每次接口变了链接等,只需要修改config文件即可 不用去逻辑代码里面去找了
7.第七个案例(接口的小封装-接口和逻辑代码分开控制-~)
不知道有没有同学发现,如果是post接口的话,参数还是需要在逻辑代码单独写吗?
接下来咱们解决这个事情~~,参数也进行分离化
config.py进行修改如下
# coding=utf-8
# baseurl 一般接口都是分测试接口和正式接口的,只需要修改ip即可
baseurl = 'http://suggest.taobao.com'
# 假装是登录接口
url_login = baseurl + '/sug?code=utf-8&q=裤子&callback=cb 用例'
# 假装是注冊接口 假装是post请求 拼接成字典格式,通过吗,通过key value的形式获取
# 注册接口是key 链接是value
url_register = {'注册接口': baseurl + '/sug', 'parmras': {'code': 'utf-8', 'q': '裤子', 'callback': 'cb 用例'}}
# 假装是首页接口
url_home = baseurl + '/sug?code=utf-8&q=裤子&callback=cb 用例'
testapi.py 修改如下
# coding=utf-8
import requests
# 引入config配置接口的文件
import config
# 发送post请求,通过config文件获取接口url 和接口的参数 ,如果参数更改了,咱们就修改config文件就可以了
r = requests.post(config.url_register['注册接口'], config.url_register['parmras'])
# 请求的状态码 200代表成功
status = r.status_code
# 进行接口的状态码断言,等于200则认为通过,不是200不通过
if status == 200:
print('状态码校验过')
else:
print('状态码校验不通过')
# 输出状态码
print(status)
# 因为展示测试的接口没有json,所以只能输出content啦~
print(r.content)
输出结果:
image
总结:用到了 字典 的小知识点,还用到了引用包的小知识点,不会的同学 可以评论区留言,或者加qq群一起学习讨论
另外网上有很多基础知识~一搜一堆的!!
8.第八个案例(接口的小封装-执行多个接口~)
这次只需要修改testapi.py即可 代码如下:
# coding=utf-8
import requests
# 引入config配置接口的文件
import config
# 测试注册接口的函数
def test_register():
# 发送post请求,通过config文件获取接口url 和接口的参数 ,如果参数更改了,咱们就修改config文件就可以了
r = requests.post(config.url_register['注册接口'], config.url_register['parmras'])
# 请求的状态码 200代表成功
status = r.status_code
# 进行接口的状态码断言,等于200则认为通过,不是200不通过
if status == 200:
print('状态码校验过')
else:
print('状态码校验不通过')
# 输出状态码
print(status)
# 因为展示测试的接口没有json,所以只能输出content啦~
print(r.content)
# 测试登录接口的函数
def test_login():
# 因为发送的get请求,参数是跟在接口的后面的,所以不用通过字典的形式获取
r = requests.post(config.url_login)
# 请求的状态码 200代表成功
status = r.status_code
# 进行接口的状态码断言,等于200则认为通过,不是200不通过
if status == 200:
print('状态码校验过')
else:
print('状态码校验不通过')
# 输出状态码
print(status)
# 因为展示测试的接口没有json,所以只能输出content啦~
print(r.json())
# 预期结果 在接口返回结果后,查看接口里面有没有此值,也就是传说的断言了
expected = '裤子男夏季'
# 将接口返回的信息转为字符串类型,in 是判断接口的返回值里面 存不存在 预期结果的值,存在就通过 不存在就不通过
if expected in str(r.json()):
print('断言通过')
else:
print('断言不通过')
# 调用执行测试接口
test_register()
print('执行了 测试注册接口的函数')
# 调用执行登录接口
test_login()
print('执行了 测试登录接口的函数')
总结:本次使用函数体的小知识点,和调用函数的小知识,如果感觉到自己不会学习赶紧去补充下自己的知识吧~
输出结果如下:
image
9.第九个案例(接口的小封装-增加)
本次引用unittest测试框架,进行断言
testapi.py修改如下
# coding=gbk
import requests
# 引入config配置接口的文件
import config
# 增加单元测试框架
import unittest
from applet import HMLRunner
"""
注意事项:unittest这个框架只支持test开头的函数体才会去执行哦
"""
# 创建一个类型,执行用例的类,继承unittest的testcase类
class Testcase(unittest.TestCase):
# 测试注册接口的函数
def test_register(self):
# 发送post请求,通过config文件获取接口url 和接口的参数 ,如果参数更改了,咱们就修改config文件就可以了
r = requests.post(config.url_register['注册接口'], config.url_register['parmras'])
# 请求的状态码 200代表成功
status = r.status_code
# 使用unittest的断言
self.assertEqual(200, r.status_code)
# 输出状态码
print(status)
# 因为展示测试的接口没有json,所以只能输出content啦~
print(r.content)
print(r.text)
# 测试登录接口的函数
def test_login(self):
# 因为发送的get请求,参数是跟在接口的后面的,所以不用通过字典的形式获取
r = requests.post(config.url_login)
# 请求的状态码 200代表成功
status = r.status_code
# 使用unittest的断言
self.assertEqual(200, r.status_code)
# 输出状态码
print(status)
print(r.json())
# 预期结果 在接口返回结果后,查看接口里面有没有此值,也就是传说的断言了
expected = '裤子男夏季'
# 获取接口的返回信息
j = r.json()
# 输出接口的返回信息
print(j)
# 进行断言操作和接口的返回值,expected是预期结果是咱们提前知道的内容想去判断接口里面有没有此值
# j['result'][1][1]是接口返回的一个,因为接口第一次是字典,所以通过key去取,里面嵌套是数组格式~
self.assertEqual(expected, j['result'][1][0])
print(r.text)
if __name__ == '__main__':
import time
# 定义测试用例的目录为当前目录
test_dir = './'
# 加载测试用例,根据文件路径 执行test开头的py文件
discover = unittest.defaultTestLoader.discover(test_dir, pattern='test*.py')
# 按照一定的格式获取当前的时间
now = time.strftime("%Y-%m-%d %H-%M-%S")
# 定义报告存放路径 目前是存在运行的当前目录
filename = now + 'test_result.html'
# 打开file文件流
fp = open(filename, "wb")
# 定义测试报告
runner = HMLRunner.HTMLTestRunner(stream=fp,
title=u"测试报告(史无前例)",
description=u"测试用例执行情况,qq群:234922431")
# 运行测试
runner.run(discover)
# 关闭报告文件
fp.close()
执行结果如下:
image
看到 Ran 2 tests in 0.212s
意思是执行了两个用例,用时0.212秒
10.第十个案例(没有测试报告是没有灵魂的~加一个测试报告)
注意事项:本次使用HTMLTestRunner,生成测试报告,这个是需要自己安装的哦~
HTMLTestRunner下载地址:https://pypi.org/project/HTMLTestRunner/
如果你不想下载可以加qq群:来拿HTMLTestRunner文件哦
也给你准备了网盘的下载链接:https://pan.baidu.com/s/1jpV98BTJ7iYutbpjJDeY6w
提取码:u8ps
testapi.py代码修改如下
# coding=utf-8
import requests
# 引入config配置接口的文件
import config
# 增加单元测试框架
import unittest
# 引入HTMLTestRunner生成测试报告
import HTMLTestRunner
"""
注意事项:unittest这个框架只支持test开头的函数体才会去执行哦
"""
# coding=gbk
import requests
# 引入config配置接口的文件
import config
# 增加单元测试框架
import unittest
from applet import HMLRunner
"""
注意事项:unittest这个框架只支持test开头的函数体才会去执行哦
"""
# 创建一个类型,执行用例的类,继承unittest的testcase类
class Testcase(unittest.TestCase):
# 测试注册接口的函数
def test_register(self):
# 发送post请求,通过config文件获取接口url 和接口的参数 ,如果参数更改了,咱们就修改config文件就可以了
r = requests.post(config.url_register['注册接口'], config.url_register['parmras'])
# 请求的状态码 200代表成功
status = r.status_code
# 使用unittest的断言
self.assertEqual(200, r.status_code)
# 输出状态码
print(status)
# 因为展示测试的接口没有json,所以只能输出content啦~
print(r.content)
print(r.text)
# 测试登录接口的函数
def test_login(self):
# 因为发送的get请求,参数是跟在接口的后面的,所以不用通过字典的形式获取
r = requests.post(config.url_login)
# 请求的状态码 200代表成功
status = r.status_code
# 使用unittest的断言
self.assertEqual(200, r.status_code)
# 输出状态码
print(status)
print(r.json())
# 预期结果 在接口返回结果后,查看接口里面有没有此值,也就是传说的断言了
expected = '裤子男夏季'
# 获取接口的返回信息
j = r.json()
# 输出接口的返回信息
print(j)
# 进行断言操作和接口的返回值,expected是预期结果是咱们提前知道的内容想去判断接口里面有没有此值
# j['result'][1][1]是接口返回的一个,因为接口第一次是字典,所以通过key去取,里面嵌套是数组格式~
self.assertEqual(expected, j['result'][1][0])
print(r.text)
if __name__ == '__main__':
import time
# 定义测试用例的目录为当前目录
test_dir = './'
# 加载测试用例,根据文件路径 执行test开头的py文件
discover = unittest.defaultTestLoader.discover(test_dir, pattern='test*.py')
# 按照一定的格式获取当前的时间
now = time.strftime("%Y-%m-%d %H-%M-%S")
# 定义报告存放路径 目前是存在运行的当前目录
filename = now + 'test_result.html'
# 打开file文件流
fp = open(filename, "wb")
# 定义测试报告
runner = HMLRunner.HTMLTestRunner(stream=fp,
title=u"测试报告(史无前例)",
description=u"测试用例执行情况,qq群:234922431")
# 运行测试
runner.run(discover)
# 关闭报告文件
fp.close()
展示效果如下:
image
总结:可能会遇到的小问题:如果是unittest运行的话,不会执行if name == 'main':下面的代码,所以要执行当前整个类才行,alt+shift+f10 选择当前py文件执行就能生成测试报告了~
qq群:234922431
欢迎热爱学习进步的同学,共同成长进步
如果你感觉很简单没有难度,接下来我准备了接口测试实战
框架支持如下功能:
- 支持成千上万条接口用例进行测试(经过测试中配电脑,3分钟执行完成5000条接口测试)
- 详细的Excel测试报告和美观的allure报告输出(这里能让你掌握自定义allure报告)
- 支持不同类型上传文件(base64,file)上传文件格式
- 本框架采用多线程和单例等设计模式,代码简单而简约适合初中级学者,使用学习
- 摆脱普通的测试框架和断言框架的约束,他们能做到的我们一样也可以,学习简单~
接口自动化测试实战
这是一个从0到1的过程,一步一步搭建的测试接口框架,本教程从开始写框架的思路,和实现过程深入解析,并且深入到了每个相关的的各个细节,不论你是刚入门的菜鸟,还是一个懂编码经验的工程师,相信本系列的文章都会对你有所帮助。
你即可以学到从0到1搭建自动化的编码思想,也可以改变成一个接口自动化工具,在需要的时候可以自己更改代码和维护。
你可以收获什么?
1.完善python基础和编程思
2.有一个设计测试框架思维
3.提升自己能力,在也不怕面试没有编码经验
4.一个可以拿出手的项目,简历中的一个亮点
5.干货分享相比搜索到各种知识,这篇文章或许略有难度,但收获一定是你想不到的
快来学习吧,点击开启新的学习篇章:https://www.jianshu.com/p/57e4d0750e87
公众号:关注我为你分享更多测试干货,原创干货,和自动化实战等项目开源
快来学习吧,点击开启新的学习篇章:https://www.jianshu.com/p/57e4d0750e87
转载注明出处