預研背景
目前系統研發多為前后端分離,當后端接口研發完成后,可以不依賴前端界面通過接口測試提前發現問題並解決。同時由於軟件迭代周期不斷縮短,開發新功能后又擔心影響原有功能,可以通過接口自動化進行原有功能快速回歸測試,將更多精力專注於迭代功能測試,這樣才能放心地發布產品。由此看來,接口自動化測試可以減輕工作量,提高測試效率和產品質量。市面上的主流接口自動化測試工具或框架很多,需要調研對比各自的特點,挑選出適合項目的工具快速完成自動化測試。
預研目標
體驗工具主要特性功能使用及便利性,體驗內容包含如下:
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.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()傳入測試函數,循環執行測試數據
param_create_vlanpool = read_excel_tuple(excelFile, '創建VLAN池')
4、每次執行assert斷言用例結果
用例名稱以test開頭,如test_create_vlanpool.py:
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自動構建運行用例並生成測試報告