Python接口测试自动化实战及代码示例:含get、post等方法( 四 )


import random
import string
ipAddr = '172.36.17.108'
testData = https://www.isolves.com/it/cxkf/yy/Python/2019-07-17/[
(1, ipAddr, ''.join(random.sample(string.ascii_letters + string.digits, 7)), '', 200),
(2, ipAddr, ''.join(random.sample(string.ascii_letters + string.digits, 7)), '', 200),
(3, ipAddr, ''.join(random.sample(string.ascii_letters + string.digits, 7)), '', 200)
]
suite = unittest.TestSuite()
for i in testData:
suite.addTest(ExtendTestCaseParams.parametrize(TestApiSample, 'test_oauth2_basic',
canshu=i))
currentTime = time.strftime("%Y-%m-%d %H_%M_%S")
path = '../Results'
if not os.path.exists(path):
os.makedirs(path)
report_path = path + '/' + currentTime + "_report.html"
reportTitle = '接口测试报告'
desc = u'接口测试报告详情'
with open(report_path, 'wd') as f:
runner = HTMLTestRunner(stream=f, title=reportTitle, description=desc)
runner.run(suite)
上述代码中,我们对两个接口进行了函数封装,两个接口之间有依赖关系,oauth2_basic()函数在请求之前必须先去请求 register()函数获取数据 。对于这种多接口测试,且接口之间存在互相调用的情况,最好是在调用该接口前时,将互相之间有依赖的接口封装进该接口中,保证接口调用逻辑一致 。其次再针对该接口的其它参数设计测试用例去测试该接口 。

Python接口测试自动化实战及代码示例:含get、post等方法

文章插图
 
5、https 协议请求
前面我们提及的接口测试,仅是关于请求 http 协议的 。然而,http 协议在传输过程中并不安全,通过该协议传输内容容易被截取,由此人们提出了 https 协议 。该协议在原先的 http 协议之外,对传输过程中的内容进行了加密处理,这样就能确保信息在传输过程中的安全 。目前很多公司的访问 url 都已转换到 https 协议 。因此在接口测试中也要考虑到对 https 协议访问的支持 。目前对于 https 协议访问的处理有以下几种方案 。
第一种,对于一般网站访问,无法获得支持 https 协议的证书信息,因此只能选择忽略 ssl 校验;
第二种,对于外部网络访问公司内容网络和内容来说,除了要经过防火墙外,访问具体业务要经过负载均衡器 。而负载均衡器一般要求支持 https 协议,这个时候就需要使用 Python 中的 ssl 模块对证书进行校验;
关于忽略访问 https 协议的证书校验,这里忽略不表 。重点讲解 https 协议证书的校验 。在 Python 中,提供了 ssl 模块,用于对 https 协议证书的认证 。这里以一段代码来展示该模块的应用 。
import ssl
cont = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
cont.check_hostname = False
cont.load_cert_chain(certfile=public_key, keyfile=private_key)
cont.verify_mode = 2
cont.load_verify_locations(ca_key)
上述代码中先生成 ssl 上下文对象 cont,接下来用这个上下文对象 cont 依次进行域名校验、证书导入、验证模式选择及 CA 证书验证 。cont.checkhostname 用于域名校验,值为 True 表示进行主机名校验,值为 False 表示不进行主机名校验 。
cont.loadcertchain(certfile=publickey, keyfile=privatekey),certfile 表示导入公钥证书,keyfile 表示导入私钥证书 。一般情况下,Python 支持的 certfile 证书文件后缀为.crt,keyfile 证书文件后缀为.pem 。cont.verifymode 为验证模式,值为 0 表示不做证书校验,值为 1 表示代表可选,值为 2 表示做证书校验 。cont.loadverifylocations(ca_key)表示导入CA 证书 。一般的证书校验都要经过上述这几个步骤 。此时 ssl 证书的基本配置已完成 。接下来就需要在发送 https 请求时加入证书验证环节,示例代码如下:
req = request.Request(url=url, data=https://www.isolves.com/it/cxkf/yy/Python/2019-07-17/para, headers=headers, method='GET')
response = request.urlopen(req, context=self.context)
整个完整的 ssl 证书验证代码如下:
if __name__=='__main__':
from urllib import parse, request
import ssl
context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
context.check_hostname = False
context.load_cert_chain(certfile=pub_key_cert_file, keyfile=pri_key_pem_file)
context.verify_mode = 2
context.load_verify_locations(ca_file)
req = request.Request(url=url, data=https://www.isolves.com/it/cxkf/yy/Python/2019-07-17/para, headers=headers, method='GET')
response = request.urlopen(req, context=self.context)
上述代码中,我们选择了 python 中 urllib 模块做接口请求,是因为在多次对比了reuests模块和 urllib 对 https 证书验证的支持之后,发现 urllib 模块能够很好地支持 ssl 证书校验 。更多有关 python 中 ssl 模块的信息,请参考 ssl 官方文档


推荐阅读