引言:年初参与到一个后台系统开发的项目中,里面涉及了很多接口,我做为项目组测试人员,需要对这些接口进行测试,一开始使用 postman 工具测试,很是方便 。但随着接口数量的增加,不光要执行手动点击测试,而且,一旦接口参数变动,都重新更改接口参数,次数多了,使得测试效率严重下降 。
后来我将目光转向了自动化测试,考虑到项目组对接口质量要求很高,需要快速开发 。最终选定 Python 作为脚本开发语言,使用其自带的 requests 和 urllib 模块进行接口请求,使用优化后的 unittest 测试框架编写测试接口函数,测试结果选用 htmlTestRunner 框架予以展示,并使用 python 的 ssl 模块支持 https 协议的验证 。接下来,我详细地介绍这些模块,并给出各个模块完整的测试代码 。
文章插图
1、接口请求
python 特别是 python 3.x 中的 urllib 和 requests 模块,是用来请求 url 的两个主要模块 。这两个模块中,如果仅仅是支持 http 协议的 url 请求,推荐使用 requests 模块 。为什么这么说呢?因为爱因斯坦说过一句话:简洁就是美 。requests 模块对 urllib 模块又做了一层封装,使用更加方便 。该模块支持 GET, POST, PUT, DELETE 等请求方法 。请求返回信息包含状态码和消息体,状态码用三位数字表示,消息体可用字符串,二进制或json 等格式表示 。下面用一个例子来介绍一下 requests 模块的使用 。代码如下:
import requests
def get_method(url, para, headers):
try:
req = requests.get(url=url, params=para, headers=headers)
except Exception as e:
print(e)
else:
if req.status_code == "200":
return req
else:
print("Requests Failed.")
if __name__=='__main__':
url = "http://www.google.com"
req = get_method(url=url, para=None, headers=None)
print(req.status_code)
print(req.text)
输出为:
200
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta...(省略)
上述程序输出状态码为 200,表明请求成功,返回消息体为网页内容 。这里我仅对requests 模块中的 get 请求方法做了封装,其它方法(如 post,put,delete 等)的封装类似 。当让你也可以不用封装,直接使用 requests.methodName 来直接调用该方法 。这里提醒一句,在实际的接口测试中,headers 和 data 都是有值的,要确保这些值的填写正确,大部分请求下的请求失败或返回结果错误,基本上都是由于这些值的缺失或错误造成的 。更多关于 requests 模块的介绍,请参考官方文档 。
文章插图
2、测试框架优化
unittest 是 python 中进行单元测试使用广泛的框架,其与 JAVA 中的单元测试框架junit 类似 。该框架使用简单,需要编写以 test 开头的函数,选择 unittest 框架运行测试函数,测试结果在终端显示 。这里举一个简单的例子:
import unittest
class ApiTestSample(unittest.TestCase):
def setUp(self):
pass
def tearDown(self):
pass
def jiafa(self, input01, input02):
result = input01 + input02
return result
def test_jiafa(self):
testResult = self.jiafa(input01=4, input02=5)
self.assertEqual(testResult, 9)
if __name__=='__main__':
unittest.main()
简单解释下这段代码,首先我们创建一个类 ApiTestSample,这个类继承自unittest.TestCase 类 。然后在这个类中写了 jiafa 函数,它有两个参数 input01,input02,返回 input01 与 input02 相加的和 。接着在 test_jiafa 方法中,我们对刚才 jiafa 函数进行了和值校验 。通过给 jiafa 输入两个值,获取其函数返回值,并与真实值做相等判断,以此实现函数单元测试 。这里用到了 unittest 中断言值相等的 assertEqual(m, n)函数,上述代码运行结果如下:
Ran 1 test in 0.000s
OK
以上是 unittest 框架最基本的单元测试应用,但是这个框架有个缺陷,就是不能自己传入参数 。对于接口来说,往往需要传入很多参数,并且这每个参数又有很多取值,如果不对原先的 unittest 框架做改变,不仅无法用来进行接口测试,而且一个个结合参数取值去写测试代码,工作量极其庞大,也没有实现测试数据与脚本没有分离 。基于此,我们对该框架做出一下两点优化 。
1)扩展 unittest.TestCase 类,支持自定义参数输入;
2)测试数据与测试脚本分离,测试数据存储在文件和数据库中,以增强测试脚本复用性;
推荐阅读
- 教你如何优雅地用Python连接MySQL数据库
- 探秘电脑SATA接口:线缆数量减少11倍,传输速度提升5倍
- 怎么用ping命令测试网络承载能力和连通性
- 红茶的茶香味测试吸入红茶香气有缓解压力的作用
- 后端接口都测试什么?怎么测?
- 基于python语言的大数据搜索引擎
- 常见加密方式和Python实现
- 电脑主板上CPU_FAN、SYS_FAN、CHA_FAN、CPU_OPT接口知识科普
- 压力测试工具JMeter使用入门
- 简单函数与温度转换 业余码农成长记——Python学习4