“摸得着”的接口自动化
基于Python的接口自动化介绍与实践
结果可视化
可持续集成
做接口自动化的同学,基本都会追求结果可视化、项目可持续集成。小编这里就从开头写起,从一个接口测试脚本封装成一个自动化case,最后搭起接口自动化整体的框架。
这里,标准版我们会用到Python、requests、unittest、HTMLTestRunner,简捷版用到开源的utx(utx对Python unittest的功能进行了扩展,更友好、更便捷)。
下面小编就举个例子,看一个脚本走向自动化的路线是怎样的。
最前面,先看下这个例子得到的“摸得着”的结果: 一个接口做成自动化后输出的报告样例。
被测接口: http://notify.mse.sogou.com/weather?city=xxxx
01脚本转自动化case
接口测试层面现在已经有很多工具支持导出测试脚本,比如在测接口时经常使用的Postman。然后需要做的就是使用unittest框架增加判断,目的是基于断言机制来判断接口相应状态、格式、字段类型等和期望输出结果是否一致,如果一致则认为该case通过,不一致则说明该case不通过。
这个例子只判定了最简单的接口状态,判断接口response的status_code是否是200。由脚本添加了断言后的代码如下。
import requests
import unittest
class WeatherInterface(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
print("this is a classmethod: setUpClass")
def testWeather(self):
'''天气接口请求状态'''
url = "http://notify.mse.sogou.com/weather"
querystring = {"city": "北京"}
headers = {
'User-Agent': "PostmanRuntime/7.20.1",
'Accept': "*/*",
'Cache-Control': "no-cache",
'Postman-Token': "04af47a4-dad3-45d3-befc-8062a57cf1bb,e1e29236-292b-4672-8aca-febb9037d31a",
'Host': "notify.mse.sogou.com",
'Accept-Encoding': "gzip, deflate",
'Cookie': "IPLOC=CN1100",
'Connection': "keep-alive",
'cache-control': "no-cache"
}
response = requests.request("GET", url, headers=headers, params=querystring)
print(response.status_code)
self.assertEqual(200, response.status_code)
@classmethod
def tearDownClass(cls) -> None:
print("this is a class method: tearDownClass")
这样我们就有了一条接口的case. 这条case判断了天气接口是否正确地响应200。
unittest
unittest还支持类级别方法,用例级别的方法。
classmethod(setUpClass, tearDownClass)用来准备、初始化整个类执行前的资源/数据 & 结束后的释放、销毁资源/数据。用例层面的方法(setUp, tearDown)用来准备、初始化每条case执行前的资源/数据 & 结束后的释放、销毁资源/数据。
02case加载→执行→生成报告
小编这里整理了两种自动化方案,其一是中规中矩的使用unittest进行case加载、运行并结合HTMLTestRunner生成测试报告;其二使用封装了unittest和HTMLTestRunner的utx。
2.1标准版 - HTMLTestRunner
这里小编使用unittest来加载测试用例,用HTMLTestRunner生成报告。
import time
import unittest
from HTMLTestRunner import HTMLTestRunner
from case import test_weather
if __name__ == "__main__":
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(test_weather.WeatherInterface))
file_name = "Interface-Auto-Result_" + time.strftime("%Y-%m-%d-%H_%M_%S", time.localtime(time.time()))
file_path = "TestReports\\" + file_name +".html"
file_result = open(file_path, 'wb')
runner = HTMLTestRunner(stream=file_result, title="天气接口自动化测试报告", description="用例执行情况")
runner.run(suite)
file_result.close()
运行之后就可以看到测试报告了,小编在运行这个自动化case的时候还碰巧发现了一次接口的404。
2.2简捷版 - utx
前面的unittest + HTMLTestRunner的框架存在一定缺点:
后来小编调研到,有一个开源框架,封装了unittest同时还优化了报告的样式——就是开篇介绍到的简捷版中使用的utx了。
utx支持用例执行顺序和编写顺序一致,能够支持对case打标签定义为不同级别的case,能收集测试代码中的print信息输出到测试报告中,能够显示case的执行进度……
utx可谓是优点多多,使用也很简单,按照样例,步骤如下。
这里小编提供了一个简单的示例,运行后就可以拿到新的样式的测试报告了。目前utx是支持两个样式的测试报告。
from utx import *
if __name__ == "__main__":
setting.run_case = {Tag.ALL} # 运行全部测试用例
setting.check_case_doc = False # 关闭检测是否编写了测试用例描述
setting.full_case_name = True
setting.max_case_name_len = 80 # 测试报告内,显示用例名字的最大程度
setting.show_error_traceback = True # 执行用例的时候,显示报错信息
setting.sort_case = True # 是否按照编写顺序,对用例进行排序
setting.create_report_by_style_1 = True # 测试报告样式1
setting.create_report_by_style_2 = True # 测试报告样式2
setting.show_print_in_console = True
runner = TestRunner()
runner.add_case_dir(r"case")
runner.run_test(report_title='接口自动化测试报告')
【结果样式1】
【结果样式2】
是不是报告更好看了一些?内容也丰富了许多呢?utx还支持更多的设置、功能,而且也在不断更新迭代中,值得一直做自动化测试的、有unittest使用需求的同学尝试应用。
03写在最后
本文仅以入门的“姿势”介绍了如何用Python、requests、unittest、HTMLTestRunner、utx搭建一个入门的接口自动化框架。
实际我们在进行接口自动化搭建、完善过程中是需要支持更多维度的内容,比如接口参数的校验、返回的校验、用例的自动转化等等。测试的路漫漫其修远兮,自动化测试的路更是修远远远远远兮。逐渐将整个项目搭建起来,就可以部署到jenkins上面完成持续继承了,一个自动化可持续集成的接口自动化就初具形态了。
有了本文的介绍,动手用起来吧,在自己的项目中尝试一下接口自动化的乐趣吧~
参考资料
更多学习资料小编敬上:
utx github主页: https://url.cn/5ubYvhk
用Postman生成接口测试脚本: 《小白的极简接口“自动化”》
Python unittest(PyUnit)测试框架攻略: https://url.cn/5XOctlp
HTMLTestRunner改写为Python3版本: https://url.cn/51XrhYk
Python3改写的HTMLTestRunner的下载地址: https://url.cn/5WP3m9M
其他接口测试相关公众号文章 《接口测试&管理续集》、《接口测试之文件重定向法》
【END】