接口测试入门总结

一、如何理解接口?

看下图中“A”线,可以理解为接口就是一个电灯的开关,它在接口里面给你提供了一个参数,参数的值一个是“开”,一个是“关”。

![]()

说起来,怎么才能让灯亮?一个灯头接两根线,一根线接火线,一根线接零线这时灯就亮了。反之,不接零线、火线灯就灭了。

其实接口呢,就把这些复杂的操作简化了,让你看到的就只有一个开关,而你来操作这个开关就好了。我们做接口测试也只需要测试这个开关就完成任务了,接口测试就是这么简单。

  1. 当你访问“<http://127.0.0.1:8080/light?opt=open&gt;”,让零线、火线连通,此时灯亮
  2. 当你访问“<http://127.0.0.1:8080/light?opt=close&gt;”,让零线、火线断开,此时灯灭

结论:开关对应的就是一个接口(api),开灯(按下开的键)对应接口opt的参数为open,关灯(按下关的键)对应接口opt的参数就为close!

二、请求结构

看到这里我们大致就明白了接口测试是怎么一回事了。接下来需要理解一下HTTP的URL是怎么组成为一个接口的。如图:

![]()

1.一个URL就是一个接口,接口大致会分为一下几个部分:

  1. 请求协议:

    • http — 普通的http请求
    • https — 加密的http请求,传输数据更加安全
    • ftp — 文件传输协议,主要用来传输文件
  2. 请求IP:就是指提供接口的系统所部署的服务器地址,也可以是域名
  3. 请求端口:如果不填端口,默认是80,否则需要填写端口号
  4. 接口路径:指系统提供的接口在什么位置
  5. 接口参数:参数在接口路径后,用“?”来表示路径地址,剩下的都是参数,用“&”来区分参数个数

    如下示例:

    > <http://127.0.0.1:8080/light?opt=open&amp;use=yy&amp;pwd=123456&gt;

  6. 接口HTTP参数
  • http请求方式
    • GET --- 通过请求URI得到资源
    • POST --- 用于添加新的内容
    • PUT --- 用于修改某个内容
    • DELETE --- 删除某个内容
    • CONNECT --- 用于代理进行传输,如使用SSL
    • OPTIONS --- 询问可以执行哪些方法
    • PATCH --- 部分文档更改
    • PROPFIND (wedav) --- 查看属性
    • PROPPATCH (wedav) --- 设置属性
    • MKCOL (wedav) --- 创建集合(文件夹)
    • COPY (wedav) --- 拷贝
    • MOVE (wedav) --- 移动
    • LOCK (wedav) --- 加锁
    • UNLOCK (wedav) --- 解锁
    • TRACE --- 用于远程诊断服务器
    • HEAD --- 类似于GET, 但是不返回body信息,用于检查对象是否存在,以及得到对象的元数据
  • http请求头

请求头包含许多有关的客户端环境和请求正文的有用信息。例如,请求头可以声明浏览器所用的语言,请求正文的长度。示例:

Accept:image/gif.image/jpeg./

Accept-Language:zh-cn

Connection:Keep-Alive

Host:localhost User-Agent:Mozila/4.0(compatible:MSIE5.01:Windows NT5.0)

Accept-Encoding:gzip,deflate

  • http请求体

请求体就是请求等正文,可以有很多种请求体:

    • json格式
    • xml格式
    • html格式
    • 二进制格式( 多数用于图片 )
    • 字符串格式

看到上面的请求结构,就能进行接口测试,只需要修改接口的参数,就可以像功能测试一样测,可以使用各种测试用具辅助测试,测试之前先上被测试代码,大家练习的时候可以copy代码,运行代码后就可以开始测试了。

import flask
from flask import jsonify
server = flask.Flask(__name__)

@server.route('/light', methods=['get'])
def light():
    opt = flask.request.values.get(&quot;opt&quot;)
    if opt == 'open':
        return jsonify({&quot;code&quot;: 0, &quot;success&quot;: &quot;灯亮啦!&quot;})
    elif opt == 'close':
        return jsonify({&quot;code&quot;: 0, &quot;success&quot;: &quot;关灯啦!&quot;})
    else:
        return jsonify({&quot;code&quot;: 1, &quot;error&quot;: &quot;怕是开关被你弄坏了!&quot;})

if __name__ == '__main__':
    server.run(port=80, debug=True)

三、接口测试

1.工具测试

接口测试工具目前有很多工具,比如postman、Jmeter、soapUI、fildder等等,这里使用postman进行简单的测试

![]( "AZ事业部 > 接口测试总结 > image2020-4-24_11-46-26.png")

![]( "AZ事业部 > 接口测试总结 > image2020-4-24_11-47-22.png")

2.代码测试

这里使用Python语言来进行接口测试,使用”requests”库来编写代码比较简答易懂,如果没有安装”requests”库,可以打开cmd,输入”pip install requests”来安装,这里直接上代码

import requests

# 接口url
url = 'http://127.0.0.1:80/light'

# 接口参数(开灯)
params_open = {&quot;opt&quot;: &quot;open&quot;}

# 接口参数(关灯)
params_close = {&quot;opt&quot;: &quot;close&quot;}

# 接口参数(异常)
params_error = {&quot;opt&quot;: &quot;broken&quot;}

# 发送开灯接口
res_open = requests.request(method='get', url=url, params=params_open)
# 获取开灯响应结果
print(&quot;开灯响应结果:&quot;, res_open.json())

# 发送关灯接口
res_close = requests.request(method='get', url=url, params=params_close)
# 获取关灯响应结果
print(&quot;关灯响应结果:&quot;, res_close.json())

# 发送异常操作接口
res_error = requests.request(method='get', url=url, params=params_error)
# 获取异常操作响应结果
print(&quot;异常操作响应结果:&quot;, res_error.json())

执行代码后得到以下结果:

![]( "AZ事业部 > 接口测试总结 > image2020-4-24_11-59-33.png")

3.unittest框架测试

unittest是python语言中的自带的一款单元测试框架,无需安装

unittest的测试大致分为以下步骤:

  1. 引入unittest模块
  2. 创建测试类,类名以Test开头,遵循大驼峰命名规则,并且继承TestCase类
  3. 创建前置(setup/setupclass)和后置(teardown/teardownclass)
  4. 创建测试用例
  5. 创建main方法
  6. 执行测试

代码参考如下:

import requests
import unittest  # 引入unittest模块

class TestLight(unittest.TestCase):  # 继承TestCase类

    def setUp(self):  # 前置
        print(&quot;开始执行测试&quot;)

    def tearDown(self):  # 后置
        print(&quot;测试执行结束&quot;)

    def test_01_open(self):  # 测试用例1
        '''
        开灯测试
        '''
        url = 'http://127.0.0.1:80/light'  # url
        method = 'get'  # 请求方法
        data = {&quot;opt&quot;: &quot;open&quot;}  # 请求参数
        res = requests.request(method=method, url=url, params=data)  # 发送请求
        actual = res.json()  # 实际响应结果
        expect = {'code': 0, 'success': '灯亮啦!'}  # 期望结果
        try:
            self.assertEqual(expect, actual)  # 断言
            print(&quot;测试通过&quot;)
        except AssertionError as e:
            print(&quot;测试失败&quot;)
            raise e

    def test_02_close(self):  # 测试用例2
        '''
        关灯测试
        '''
        url = 'http://127.0.0.1:80/light'
        method = 'get'
        data = {&quot;opt&quot;: &quot;close&quot;}
        res = requests.request(method=method, url=url, params=data)
        actual = res.json()
        expect = {'code': 0, 'success': '关灯啦!'}
        try:
            self.assertEqual(expect, actual)
            print(&quot;测试通过&quot;)
        except AssertionError as e:
            print(&quot;测试失败&quot;)
            raise e

    def test_03_error(self):  # 测试用例3
        '''
        异常操作测试
        '''
        url = 'http://127.0.0.1:80/light'
        method = 'get'
        data = {&quot;opt&quot;: &quot;broken&quot;}
        res = requests.request(method=method, url=url, params=data)
        actual = res.json()
        expect = {'code': 1, 'error': '怕是开关被你弄坏了!'}
        try:
            self.assertEqual(expect, actual)
            print(&quot;测试通过&quot;)
        except AssertionError as e:
            print(&quot;测试失败&quot;)
            raise e

if __name__ == '__main__':
    unittest.main()  # 用例执行主入口

执行测试代码得到以下结果:

![]( "AZ事业部 > 接口测试总结 > image2020-4-24_12-18-33.png")

声明:该文章系转载,转载该文章的目的在于更广泛的传递信息,并不代表本网站赞同其观点,文章内容仅供参考。

本站是一个个人学习和交流平台,网站上部分文章为网站管理员和网友从相关媒体转载而来,并不用于任何商业目的,内容为作者个人观点, 并不代表本网站赞同其观点和对其真实性负责。

我们已经尽可能的对作者和来源进行了通告,但是可能由于能力有限或疏忽,导致作者和来源有误,亦可能您并不期望您的作品在我们的网站上发布。我们为这些问题向您致歉,如果您在我站上发现此类问题,请及时联系我们,我们将根据您的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

本周热议
python每日一练之单元测试
zookeeper 实现一个简单的服务注册与发现(C++) 三:服务发现
zookeeper 实现一个简单的服务注册与发现(C++) 二:注册
zookeeper 实现一个简单的服务注册与发现(C++) 一:与zk保持连接
Java+MySQL笔记
一些零散笔记
TCP/IP协议栈相关知识点总结
Dart学习手册
9.ubuntu文件文本编码的查看与转换,乱码问题
C++输入输出流
扩展2
69-django-forms组件源码刨析、cookie与session
67-django-前后端传数据编码格式、ajax传json格式数据、ajax传文件数据、ajax与sweetalert结合二次确认、django自带的序列化组件、批量插入、分页器
66-django-模型层之choices参数、多对多三种创建方式、数据库三大设计范式、Ajax
64-django-模型层(ORM语法)单表查询、常见十几种查询方法、双下划线查询、多表操作、外键字段增删改查、跨表查询
62-django-无名有名分组反向解析、路由分发、名称空间、伪静态、pycharm虚拟环境、django版本区别、视图层之三板斧、JsonResponse、form表单上传文件、FBV与CBV
61-django-数据增删改、orm创建表关系、django请求生命周期流程图、路由层之路由匹配、无名分组、有名分组
60-django-静态文件配置、request对象方法初识、pycharm链接数据库(MySQL)、django链接数据库(MySQL)、orm简介、orm数据增删改查
巴基斯坦 4400 万移动用户信息泄露,黑客欲以 210 万美元比特币价格出售
支付宝杭州健康码出现异常 地铁大厅人满为患
HaowuliaoA

微信扫码关注 HaowuliaoA 订阅号

友情链接

支付猫
链才网-区块链英才
phpEnv集成环境
广州翻译公司
Lion技术博客
花香诱人醉
LyApi框架
凉风有信
快斗博客
佩晨的博客
蛙导
layui
WebIM
layer
layDate
申请友链
QQ联系