pytest內核測試平台落地初體驗
- 2021 年 2 月 3 日
- 筆記
測試平台,有人說它雞肋,有人說它有用,有人說它輪子,眾說紛紜,不如從自身出發,考慮是否要做測試平台:
- 第1階段,用Python+requests寫介面自動化。
- 第2階段,選擇unitttest或pytest,更熟悉pytest選了pytest。
- 第3階段,快速搭建pytest項目腳手架,封裝tep測試工具。
- 第4階段,通過Git管理測試腳本,多分支合併程式碼。
- 第5階段,去除本地環境同步麻煩,方便團隊共享腳本。
需要有個測試平台。
使用篇
環境變數
環境變數是字元串鍵值對,全局作用域。比如不同環境不同域名:
使用:
env_vars.name
。
fixtures
fixtures即pytest的fixture,可以添加自定義函數,供測試用例使用。比如封裝登錄介面返回token:
tep.fixture
提供了url
fixture,自動拼接環境變數env_vars.domain + uri
。
測試用例
在前端網頁寫程式碼,1條用例對應1個pytest的test_name.py
文件。比如調用login
fixture登錄:
本地編寫
PyCharm寫程式碼體驗更好,正確姿勢是從平台下載包含環境變數和fixtures等項目結構程式碼,本地編寫用例,調試,跑通後,粘貼到平台上共享和維護:
本地和平台環境一致,省去前期搭建,關注
tests
用例。
擴展能力
用例是Python程式碼,理論上所有Python能寫出來的,平台都能支援,比如HTTP、WebSocket、Protobuf等協議。
原理篇
pytest內核
vue2-ace-editor
作為前端程式碼編輯組件。- 前端把程式碼通過HTTP請求傳給後端。
- 後端把程式碼存入MySQL資料庫。
- 運行用例,從資料庫取出程式碼,生成pytest文件。
- Shell命令調用
pytest -s test_name.py
,執行測試。 - 後端把運行結果日誌返給前端展示。
之所以要折騰資料庫,是因為每次部署後docker容器裡面的文件會被清掉,只能動態生成。
tep腳手架
測試平台功能是從tep項目腳手架中抽取出來的:
- 把
fixture_env_vars.py
做成了環境變數
功能。 - 把
fixture_login.py
等做成了fixtures
功能。 - 把
tests
做成了測試用例
功能。
運行用例
整體流程如下:
tep startproject project_name
運行用例時,判斷項目目錄是否存在,如果不存在就調用tep startproject project_name
創建項目腳手架。
更新conf.yaml中env
把前端傳的當前運行環境更新到conf.yaml
文件中:
env: qa
動態生成或更新fixture_env_vars.py文件
根據環境變數
功能模組的數據,動態生成fixture_env_vars.py
文件:
#!/usr/bin/python
# encoding=utf-8
from tep.dao import mysql_engine
from tep.fixture import *
@pytest.fixture(scope="session")
def env_vars(config):
class Clazz(TepVars):
env = config["env"]
"""Variables define start"""
# Environment and variables
mapping = {
"qa": {
"domain": "//qa.com",
},
"release": {
"domain": "//release.com",
}
# Add your environment and variables
}
# Define properties for auto display
domain = mapping[env]["domain"]
"""Variables define end"""
return Clazz()
動態生成或更新fixtures目錄下所有文件
根據fixtures
功能模組的數據,動態生成fixture_login.py
等所有文件:
from tep.client import request
from tep.fixture import *
def _jwt_headers(token):
return {"Content-Type": "application/json", "authorization": f"Bearer {token}"}
@pytest.fixture(scope="session")
def login(url):
# Code your login
logger.info("Administrator login")
response = request(
"post",
url=url("/api/users/login"),
headers={"Content-Type": "application/json"},
json={
"username": "admin",
"password": "123456",
}
)
assert response.status_code < 400
response_token = jmespath.search("token", response.json())
class Clazz:
token = response_token
jwt_headers = _jwt_headers(response_token)
return Clazz
conftest.py會自動查找後
import
,tests用例直接使用。
動態生成或更新tests某個test_文件
從資料庫拿到用例程式碼,動態生成test_
文件。
Shell執行pytest命令
從上一步拿到case_path
,調用pytest -s case_path
執行測試。
計劃後續添加suite和marker兩種批量執行用例方式。
小結
本文介紹了我第一次做的測試平台的使用和原理,技術棧為Vue+Django+Django REST Framework+JWT+MySQL+pytest+Git+BitBucket+Drone+Nginx+Docker+K8S,已在公司落地,還未大規模產出,由於服務端有較多磁碟IO讀寫,大量使用後不知道性能如何,目前來看問題不大,需要持續觀察和優化。測試平台底層是pytest
,用到了tep
,那就叫teprunner
。
參考資料: