预研背景
目前系统研发多为前后端分离,当后端接口研发完成后,可以不依赖前端界面通过接口测试提前发现问题并解决。同时由于软件迭代周期不断缩短,开发新功能后又担心影响原有功能,可以通过接口自动化进行原有功能快速回归测试,将更多精力专注于迭代功能测试,这样才能放心地发布产品。由此看来,接口自动化测试可以减轻工作量,提高测试效率和产品质量。市面上的主流接口自动化测试工具或框架很多,需要调研对比各自的特点,挑选出适合项目的工具快速完成自动化测试。
预研目标
体验工具主要特性功能使用及便利性,体验内容包含如下:
l 单接口测试
l 多接口组合测试
l 测试报告
l 测试用例管理
l 日志查看
l 脚本调试
l 持续集成
工具/框架介绍
Pytest是一个软件测试框架。它是一款命令行工具,可以直接测试各类程序自动找到测试用例执行,并且汇报测试结果。
l 主要特性:
1) 易于上手,入门简单
2) 能支持简单的单元测试和复杂的功能测试
3) 测试用例编写简单可读性强,支持参数化
4) 灵活指定用例执行方式、顺序等
5) 丰富的基础库,可以大幅提高用户编写测试用例效率
6) 详细的日志输出
7) 灵活、扩展性好,可以很容易地融入已有的开发测试流程如可运行由unittest和node编写的测试用例
8) 很容易与其他工具集成到一起使用,比如和jenkins持续集成、allure测试报告展示等
官网:https://docs.pytest.org/en/latest/index.html
工具/框架环境搭建
使用Python3+Pytest+Request+Jenkins+Allure框架来进行接口自动化测试,并实现持续集成,自动生成html测试报告。
1、Python安装
它不依赖与Python版本,Python2(2.6及更高版本)和Python3(3.3及更高版本)都可以安装最新版本的pytest。
l 检查本地是否已有python环境:
python --version
l python3安装(若已经安装,此步忽略)
安装可参考:https://blog.csdn.net/weixin_40844416/article/details/80889165
1、requests安装
l 通过命令行安装requests
pip install request
3、Pytest安装
l 通过命令行安装Pytest
pip install pytest
l 命令行检查安装版本
pytest --version
4、Pycharm配置pytest运行程序
Pycharm File->Settings->Tools->Python Integrated Tools,选择需运行pytest项目,Default test runner下拉选择pytest,设置完成后,编写pytest用例即可直接使用pytest运行
编写第一个自动化脚本
脚本实现的用户场景:获取Token-》发起一个HTTP请求-》对响应结果进行断言
详细步骤:
1、每个接口都需要用到token,通过conftest.py共享fixture,@pytest.fixture标记返回封装获取token值函数
conftest.py:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
1.import pytest 2.import requests 3. 4.authentication_url_path = "/v1/tokens" 5. 6.json_login = { 7. "authType" : "password" , 8. "params" : { 9. "username" : "zhuxuefei" , 10. "password" : "jixlb2tIrjF5t/bYQTXz4Q==" 11. } 12. } 13. 14.def pytest_addoption(parser): 15. parser.addoption( "--ip" , action = "store" , default = "XX.XX.XX.XX" , help = "please input target VM ip." ) 16. parser.addoption( "--port" , action = "store" , default = "api" , help = "please input target service port." ) 17. 18. 19. @pytest.fixture(scope = "session" ) 20.def ip(request): 21. return request.config.getoption( "--ip" ) 22. 23. 24. @pytest.fixture(scope = "session" ) 25.def port(request): 26. return request.config.getoption( "--port" ) 27. 28. 29. @pytest.fixture(scope = "session" ) 30.def uri(ip,port): 31. uri = "http://%s/%s" % (ip, port) 32. return uri 33. 34. 35. @pytest.fixture(scope = "session" ) 36.def auth_token(uri): 37. headers = { "User-Agent" : "automation" , 38. "content-type" : "application/json;charset=UTF-8" 39. } 40. 41. post_response = requests.post(url = uri + authentication_url_path, 42. json = json_login, 43. headers = headers) 44. 45. assert post_response.status_code = = requests.status_codes.codes.OK 46. resp_payload = post_response.json() 47. assert resp_payload[ 'status' ] = = 200 # to be defined. 48. auth_token = resp_payload[ 'data' ][ 'key' ] 49. 50. return auth_token 51. 52. @pytest.fixture(scope = "session" ) 53.def headers(uri): 54. headers = { "User-Agent" : "automation" , 55. "content-type" : "application/json;charset=UTF-8" 56. } 57. 58. post_response = requests.post(url = uri + authentication_url_path, 59. json = json_login, 60. headers = headers) 61. 62. assert post_response.status_code = = requests.status_codes.codes.OK 63. resp_payload = post_response.json() 64. assert resp_payload[ 'status' ] = = 200 # to be defined. 65. auth_token = resp_payload[ 'data' ][ 'key' ] 66. 67. headers = { "User-Agent" : "automation" , 68. "content-type" : "application/json;charset=UTF-8" , 69. "T-AUTH-TOKEN" : auth_token} 70. return headers |
2、将获取token值fixture函数传递给http请求接口
3、用例数据写在excel文件中,实现读取测试用例逻辑,将测试用例数据通过@pytest.mark.parametrize()传入测试函数,循环执行测试数据
1
|
param_create_vlanpool = read_excel_tuple(excelFile, '创建VLAN池' ) |
4、每次执行assert断言用例结果
用例名称以test开头,如test_create_vlanpool.py:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
1. @pytest.mark.parametrize( 'name,tag,ResourcePoolName,vlanTagStart,vlanTagEnd' , param_create_vlanpool) 2.def test_create_vlanpool(uri, headers, name, tag, ResourcePoolName, vlanTagStart, vlanTagEnd): 3. resourcepoolid = get_resourcepoolid(uri, headers, ResourcePoolName) 4. param = { 5. 'name' : name, # VLAN池名称 6. 'tag' : tag, 7. 'vlanPoolResourcePoolList' : [{ 'resourcePoolId' : resourcepoolid}], #作用域调用资源池ID 8. 'vlanTagEnd' : vlanTagStart, # 结束VLAN ID 9. 'vlanTagStart' : vlanTagEnd # 起始VLAN ID 10. } 11. create_vlanpool_response = requests.post( 12. url = uri + create_vlanpool_url_path, 13. headers = headers, 14. json = param 15. ).json() 16. print (create_vlanpool_response) 17. code = create_vlanpool_response[ 'status' ] 18. allure.attach( "请求响应code" , str (create_vlanpool_response[ 'status' ])) 19. allure.attach( "请求响应结果" , str (create_vlanpool_response)) 20. my_log().info(create_vlanpool_response) |
5、Pycharm的Terminal页面进入该py文件路径下,执行pytest test_create_vlanpool.py或直接右击测试用例Run ‘pytest’ in ‘test_create_vlanpool.py.py’运行用例
编写业务场景接口组合测试脚本
测试报告查看
利用Allure框架生成高大上的html报告,allure还支持使用Jenkins持续集成。
l 安装allure-pytest插件,通过allure标签自定义完善测试报告
import allure
@allure.feature(‘XX’)
@allure.story(‘XX’)
@allure.attach(‘XX’)
l 执行pytest test.py --alluredir report/allure_raw生成运行后原始结果
l 安装Allure工具并配置环境变量,确保allure命令可用
allure generate <allure测试结果目录> -o <存放报告的目录> --clean 生成html测试报告
测试用例管理
- 测试用例编写命名规则
l 测试文件应命名为st_xx.py或xx_test.py
l 测试类命令以Test开头
l 测试函数、测试类方法命令以test开头
- pytest提供标记机制,使用marker对测试函数标记指定运行用例
l 比如选择部分测试用例作为冒烟测试,可以对它们添加@pytest.mark.smoke装饰,运行时在命令中指定-m smoke就可以
l 通过@pytest.mark.run(order=X)来标记用例执行顺序
l 通过@pytest.mark.skip()、@pytest.mark.skipif()来跳过不想执行的测试用例
- 运行测试用例方式
运行pytest时可以指定目录和文件。如果不指定,pytest会搜索当前目录及其子目录中以test_开头或以_test结尾的测试函数。
l 命令方式执行
pytest -v -s xx.py
l Pytest.main主程序执行,参数和命令方式一致
测试方法优化
在编写第一个自动化脚本中都对应应用
l 使用fixture配置、传递初始化测试数据
l 通过confest.py共享fixture
l @pytest.mark.parametriz()数据参数化允许传递多组数据执行批量测试
日志查看
Pycharm执行pytest用例可以在终端界面输出详细日志
脚本调试
持续集成
l Jenkins上创建工程,配置接口自动化工程代码库
l 设置需被执行测试环境及调用主程序执行
l Jenkins安装Allure插件,设置allure report原始执行结果路径
l Jenkins自动构建运行用例并生成测试报告
1.1进程和多线程概述
1.2什么是操作系统
06.避免创建不必要的对象
05.依赖注入优先于硬连接资源
04.使用私有构造器执行非实例化
03.使用私有构造方法或枚类实现 Singleton 属性
02.当构造参数过多时使用builder模式
01.考虑使用静态工厂方法替代构造方法
iiS申请地址