一、如何理解接口?
看下图中“A”线,可以理解为接口就是一个电灯的开关,它在接口里面给你提供了一个参数,参数的值一个是“开”,一个是“关”。
说起来,怎么才能让灯亮?一个灯头接两根线,一根线接火线,一根线接零线这时灯就亮了。反之,不接零线、火线灯就灭了。
其实接口呢,就把这些复杂的操作简化了,让你看到的就只有一个开关,而你来操作这个开关就好了。我们做接口测试也只需要测试这个开关就完成任务了,接口测试就是这么简单。
- 当你访问“http://127.0.0.1:8080/light?opt=open”,让零线、火线连通,此时灯亮。
- 当你访问“http://127.0.0.1:8080/light?opt=close”,让零线、火线断开,此时灯灭。
结论:开关对应的就是一个接口(api),开灯(按下开的键)对应接口opt的参数为open,关灯(按下关的键)对应接口opt的参数就为close!
二、请求结构
看到这里我们大致就明白了接口测试是怎么一回事了。接下来需要理解一下HTTP的URL是怎么组成为一个接口的。如图:
1.一个URL就是一个接口,接口大致会分为一下几个部分:
-
请求协议:
- http — 普通的http请求
- https — 加密的http请求,传输数据更加安全
- ftp — 文件传输协议,主要用来传输文件
-
请求IP:就是指提供接口的系统所部署的服务器地址,也可以是域名
-
请求端口:如果不填端口,默认是80,否则需要填写端口号
-
接口路径:指系统提供的接口在什么位置
-
接口参数:参数在接口路径后,用“?”来表示路径地址,剩下的都是参数,用“&”来区分参数个数
如下示例:
-
接口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("opt") if opt == 'open': return jsonify({"code": 0, "success": "灯亮啦!"}) elif opt == 'close': return jsonify({"code": 0, "success": "关灯啦!"}) else: return jsonify({"code": 1, "error": "怕是开关被你弄坏了!"}) if __name__ == '__main__': server.run(port=80, debug=True)
三、接口测试
1.工具测试
接口测试工具目前有很多工具,比如postman、Jmeter、soapUI、fildder等等,这里使用postman进行简单的测试
2.代码测试
这里使用Python语言来进行接口测试,使用”requests”库来编写代码比较简答易懂,如果没有安装”requests”库,可以打开cmd,输入”pip install requests”来安装,这里直接上代码
import requests # 接口url url = 'http://127.0.0.1:80/light' # 接口参数(开灯) params_open = {"opt": "open"} # 接口参数(关灯) params_close = {"opt": "close"} # 接口参数(异常) params_error = {"opt": "broken"} # 发送开灯接口 res_open = requests.request(method='get', url=url, params=params_open) # 获取开灯响应结果 print("开灯响应结果:", res_open.json()) # 发送关灯接口 res_close = requests.request(method='get', url=url, params=params_close) # 获取关灯响应结果 print("关灯响应结果:", res_close.json()) # 发送异常操作接口 res_error = requests.request(method='get', url=url, params=params_error) # 获取异常操作响应结果 print("异常操作响应结果:", res_error.json())
执行代码后得到以下结果:
3.unittest框架测试
unittest是python语言中的自带的一款单元测试框架,无需安装
unittest的测试大致分为以下步骤:
- 引入unittest模块
- 创建测试类,类名以Test开头,遵循大驼峰命名规则,并且继承TestCase类
- 创建前置(setup/setupclass)和后置(teardown/teardownclass)
- 创建测试用例
- 创建main方法
- 执行测试
代码参考如下:
import requests import unittest # 引入unittest模块 class TestLight(unittest.TestCase): # 继承TestCase类 def setUp(self): # 前置 print("开始执行测试") def tearDown(self): # 后置 print("测试执行结束") def test_01_open(self): # 测试用例1 ''' 开灯测试 ''' url = 'http://127.0.0.1:80/light' # url method = 'get' # 请求方法 data = {"opt": "open"} # 请求参数 res = requests.request(method=method, url=url, params=data) # 发送请求 actual = res.json() # 实际响应结果 expect = {'code': 0, 'success': '灯亮啦!'} # 期望结果 try: self.assertEqual(expect, actual) # 断言 print("测试通过") except AssertionError as e: print("测试失败") raise e def test_02_close(self): # 测试用例2 ''' 关灯测试 ''' url = 'http://127.0.0.1:80/light' method = 'get' data = {"opt": "close"} res = requests.request(method=method, url=url, params=data) actual = res.json() expect = {'code': 0, 'success': '关灯啦!'} try: self.assertEqual(expect, actual) print("测试通过") except AssertionError as e: print("测试失败") raise e def test_03_error(self): # 测试用例3 ''' 异常操作测试 ''' url = 'http://127.0.0.1:80/light' method = 'get' data = {"opt": "broken"} res = requests.request(method=method, url=url, params=data) actual = res.json() expect = {'code': 1, 'error': '怕是开关被你弄坏了!'} try: self.assertEqual(expect, actual) print("测试通过") except AssertionError as e: print("测试失败") raise e if __name__ == '__main__': unittest.main() # 用例执行主入口
执行测试代码得到以下结果: