Pytest接口自動化框架


預研背景

目前系統研發多為前后端分離,當后端接口研發完成后,可以不依賴前端界面通過接口測試提前發現問題並解決。同時由於軟件迭代周期不斷縮短,開發新功能后又擔心影響原有功能,可以通過接口自動化進行原有功能快速回歸測試,將更多精力專注於迭代功能測試,這樣才能放心地發布產品。由此看來,接口自動化測試可以減輕工作量,提高測試效率和產品質量。市面上的主流接口自動化測試工具或框架很多,需要調研對比各自的特點,挑選出適合項目的工具快速完成自動化測試。

預研目標

體驗工具主要特性功能使用及便利性,體驗內容包含如下:

l 單接口測試

l 多接口組合測試

l 測試報告

l 測試用例管理

l 日志查看

l 腳本調試

l 持續集成

 

工具/框架介紹

Pytest是一個軟件測試框架。它是一款命令行工具,可以直接測試各類程序自動找到測試用例執行,並且匯報測試結果。

主要特性:

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安裝

通過命令行安裝requests

pip install request

3Pytest安裝

通過命令行安裝Pytest

    pip install pytest

 

 

l 命令行檢查安裝版本

pytest --version

 

 

4Pycharm配置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持續集成。

安裝allure-pytest插件,通過allure標簽自定義完善測試報告

import allure

@allure.feature(‘XX’)

@allure.story(‘XX’)

@allure.attach(‘XX’)

執行pytest test.py --alluredir report/allure_raw生成運行后原始結果

安裝Allure工具並配置環境變量,確保allure命令可用

allure generate <allure測試結果目錄> -o <存放報告的目錄> --clean 生成html測試報告

 

 

 

測試用例管理

  • 測試用例編寫命名規則

測試文件應命名為st_xx.pyxx_test.py

測試類命令以Test開頭

測試函數、測試類方法命令以test開頭

 

  • pytest提供標記機制,使用marker對測試函數標記指定運行用例

比如選擇部分測試用例作為冒煙測試,可以對它們添加@pytest.mark.smoke裝飾,運行時在命令中指定-m smoke就可以

通過@pytest.mark.run(order=X)來標記用例執行順序

通過@pytest.mark.skip()@pytest.mark.skipif()來跳過不想執行的測試用例

 

  • 運行測試用例方式

運行pytest時可以指定目錄和文件。如果不指定,pytest會搜索當前目錄及其子目錄中以test_開頭或以_test結尾的測試函數。

l 命令方式執行

pytest -v -s xx.py

l Pytest.main主程序執行,參數和命令方式一致

 

 

測試方法優化

在編寫第一個自動化腳本中都對應應用

使用fixture配置、傳遞初始化測試數據

通過confest.py共享fixture

l @pytest.mark.parametriz()數據參數化允許傳遞多組數據執行批量測試

 

日志查看

Pycharm執行pytest用例可以在終端界面輸出詳細日志

 

 

 

腳本調試

 

持續集成

l Jenkins上創建工程,配置接口自動化工程代碼庫

 

 

l 設置需被執行測試環境及調用主程序執行

 

 

 

 

 

l Jenkins安裝Allure插件,設置allure report原始執行結果路徑

 

 

l Jenkins自動構建運行用例並生成測試報告

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM