0 引言
最近接触了API接口测试项目,一开始使用Postman测试,感觉还挺好用,但是时间一长,突然发现每次操作起来挺麻烦,特别是修改配置文件。于是乎打算写成自动化测试脚本,尝试了很多方法之后,最终选定python语言、unittest框架及其参数化、HTMLTestRunner测试报告框架、以及ssl验证过程(针对https验证),下面详细地介绍下整个学习过程及对应的代码实现。
1 requests模块
python中对于请求http协议,有很多模块,比如urllib、requests等模块,如果你只是用来请求http协议,测试一下接口的返回及内容的话,推荐使用requests模块。为什么这么说呢?因为简洁就是美,requests有一个返回状态码status_code,来验证请求是否成功,而且返回的内容可以用text,content或者json()格式表示,非常方便。下面简单介绍一下requests模块。直接上代码:
import requests
def Get(url, para, headers):
try:
req = requests.get(url=url, params=para, headers=headers)
return req
except requests.RequestException as e:
print(e)
if __name__=='__main__':
url = "http://www.baidu.com"
params = None
headers = None
req = Get(url, params, headers)
print(req.status_code)
print(req.text)
输出为:
200
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta...(省略)
这表明我们的请求成功了,状态码为200,内容为网页格式。这里我只是对requests.get()方法做了一个封装,当然你也可以不用这个封装,直接用下面这个代码进行测试。
import requests
if __name__=='__main__':
url = "http://www.baidu.com"
params = None
headers = None
req = requests.get(url, params, headers)
print(req.status_code)
print(req.text)
输出结果也是一样的。至于其他的方法如post,put,delete等也基本类似,这里不做过多说明。提醒大家注意,在实际的api接口测试中,像headers,data等值一定要根据实际的请求参数来,不可多加,但是也不能少加,很多时候请求结果不正确或者请求失败,就是由于请求体不全或者超过了规定的参数导致的;另外一点,大家要注意,如果你的headers中的请求方法是json格式,如application/json的,那么你的headers、data等参数的数据构成中,如果使用字典封装,一定要记得两边都用双引号括起来,否则无法识别,最一劳永逸的方法就是,养成用双引号封装字典的习惯。requests模块就先介绍到这里。更多详细的requests模块介绍,请参考官方文档Request2.18.1
2 unittest框架及参数化
unittest框架是python中做单元测试的框架,它的语法也非常简单,只要你是以test方法开头的函数,并且在运行的时候选择unittest运行,那么它就将运行结果详细的在运行框中描述出来。我们还是举一个例子吧:
import unittest
class APITest(unittest.TestCase):
def setUp(self):
pass
def tearDown(self):
pass
def sub(self,a,b):
c = a + b
return c
def test_sub(self):
d = self.sub(4,5)
self.assertEqual(d, 9)
if __name__=='__main__':
unittest.main()
简单解释下这段代码,首先我们创建一个类APITest,这个类继承自unittest.TestCase类,也就是unittest框架中的测试集类。然后我们在这个类中创建了一个sub方法,它有两个参数a,b,返回值是a和b的和。接着我们在test_sub中,测试我们刚才的sub方法,设定a=4,b=5,然后断言sub方法的返回值是否与给定的9相等,这里assertEqual(m, n)是unittest中断言两个值相等的方法,上述这段代码的运行结果如下:
Ran 1 test in 0.000s
OK
以上就是最传统的unittest框架的应用,但是这个框架有一个缺陷,就是不能自己传入参数,如果针对一个接口,我们设计了很多测试用例,实际上就是改变了一下参数组合,那么就需要写很多这样的用例。这样做很