unittest和pytest是Python的2個強大的測試框架,常常用來作UI自動化或接口自動化。unittest是PyCharm的默認集成工具,也是咱們大多數人入門自動化的首選框架。pytest提供了更豐富的功能,相對的上手難度也要高一點。若是學了pytest後,想快速用pytest寫項目,用於工做實踐,那麼能夠試試我寫的這款測試工具:tep
,try easy pytest。html
在Google中輸入python tep
:python
tep是一款測試工具,不是測試框架,它作的事情只是幫助你更輕鬆的使用pytest寫項目代碼,主要功能以下:mysql
tep已經上傳到了PyPI(Python Package Index):git
能夠使用pip
命令安裝:github
pip install tep
外網速度慢,pandas
可能安裝失敗,推薦用國內鏡像:sql
pip --default-timeout=6000 install -i https://pypi.tuna.tsinghua.edu.cn/simple tep
因爲集成了第三方包,安裝可能會花幾分鐘,請耐心等待。shell
Python版本
3.6+
數據庫
安裝完成後,檢查是否安裝成功:json
tep -V 0.5.3
或者:api
tep --version 0.5.3
使用-U
參數:
pip install -U tep
或者指定版本:
pip install tep==0.5.3
tep提供了腳手架,預置了項目結構和代碼,打開cmd,使用startproject
命令快速建立項目:
cd some_directory tep startproject project_name
建立後的項目結果以下:
當前版本主要用來作接口自動化,建議把不一樣業務系統建成多個項目。
tep已經預置了登陸相關代碼,只須要打開fixtures\fixture_admin.py
,修改2個地方的代碼,就能夠完成登陸請求。
編輯fixtures/fixture_admin.py
:
@pytest.fixture(scope="session") def env_vars(config): class Clazz: def __init__(self): env = config["env"] self.mapping = { "qa": { "domain": "https://qa.com", "mysql_engine": mysql_engine("127.0.0.1", # host "2306", # port "root", # username "123456", # password "test") # db_name }, "release": { "domain": "https://release.com", "mysql_engine": mysql_engine("127.0.0.1", "2306", "root", "123456", "release") } # Add your env and variables } self.domain = self.mapping[env]["domain"] self.mysql_engine = self.mapping[env]["mysql_engine"] # Add properties def add(self, env, key, value): self.mapping[config["env"]][key] = value return Clazz()
mapping
是個字典,預置了2個環境:qa
和release
,每一個環境預置了2個變量:domain
和mysql_engine
。
domain
url = domain +uri
,例如https://qa.com/api/users/login/
的domain是``https://qa.com,uri是
/api/users/login/`。
首先把qa
環境的domain
值改成你的測試域名。
繼續編輯fixtures/fixture_admin.py
:
def _jwt_headers(token): return {"Content-Type": "application/json", "authorization": f"Bearer {token}"} @pytest.fixture(scope="session") def login(): # 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
在# Code your login
處開始修改代碼,替換API路徑/api/users/login/
和請求參數json
。若是你的登陸接口不會返回token,那麼修改jmespath.search("token", response.json())
爲實際響應取值。
tep預置登陸返回了2個值:
token
和jwt_headers
。
打開tests/login_test.py
:
from loguru import logger def test_login(login): logger.info(login.token)
執行後就會調用登陸接口發起請求。
遇到問題沒法解決請留言或加羣。
測試用例所有放在tests
目錄下:
每一個.py
模塊以test_
前綴或_test
後綴命名,每一個test
函數以test
前綴命名。只要遵循這個規則,目錄層次不影響。示例:
建議每一個
.py
模塊只包含1個test
函數,也就是1條測試用例。
每條測試用例能夠包含單個或多個接口請求。tep預置了1個POST請求示例代碼,打開tests/post_test.py
:
import jmespath from loguru import logger from tep.client import request def test_post(faker_ch, url, login): # description logger.info("test post") # data fake = faker_ch # request response = request( "post", url=url("/api/users"), headers=login.jwt_headers, json={ "name": fake.name() } ) # assert assert response.status_code < 400 # extract user_id = jmespath.search("id", response.json())
每一個請求由5部分組成,從上往下分別是描述、數據、請求、斷言和提取。
借鑑了JMeter元件和參數化關聯的設計思想。
描述
描述這個請求是幹嗎的。
數據
初始化局部變量,例如使用faker庫造測試數據。
請求
若是須要打印請求日誌,能夠from tep.client import request
,tep.client.request
對requests.request
除了記錄日誌外,沒有作任何修改。
若是請求報錯了,那麼極可能是代碼寫錯了。
也能夠直接使用原生request
,from requests import request
。
不一樣請求方法的代碼以下:
request("get", url="", headers={}, json={}) request("post", url="", headers={}, params={}) request("put", url="", headers={}, json={}) request("delete", url="", headers={}) # 上傳excel request("post", url="", headers={}, files={ "file": ( file_name, open(file_path, "rb"), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" ) }, verify=False )
更多用法參考
requests.request
。
斷言
斷言使用Python標準斷言assert 表達式
,表達式跟if
語句表達式如出一轍。
提取
推薦使用jmespath
提取JSON數據,也能夠使用Python[]
中括號提取。
單個測試用例,在PyCharm中執行就能夠了。多個測試用例批量執行,須要打開左下角的Terminal
,輸入命令來執行:
# 先進入tests目錄 cd tests # 批量執行 pytest
若是隻想統計用例條數,不執行代碼,那麼能夠使用如下命令:
pytest --co
tep提供了--tep-reports
參數來生成allure測試報告:
pytest --tep-reports
報告文件存放在根目錄的reports/
中:
右鍵index.html
選擇:
就會打開瀏覽器顯示測試報告了:
默認allure報告右上角的
TREND
是沒法顯示數據的,--tep-reports
修復了這個問題,根據history數據生成TREND
走勢圖。
編輯fixtures/fixture_admin.py
,在mapping
字典中# Add your env and variables
處添加環境變量,在# Add properties
處添加屬性,參考domain
和mysql_engine
。示例:
使用add()
方法動態添加環境變量:
env_vars.add("my_var", 789)
env_vars
返回了類對象實例,經過.
運算符來使用環境變量:
env_vars.domain env_vars.mysql_engine env_vars.my_var
不須要import,而是給test函數添加參數,如
def test(env_vars):
在conf.yaml
文件中配置:
env: qa
默認爲qa
環境。
經過fixture技術,咱們能夠把重複代碼提取出來,在團隊間進行復用。tep重度使用了這個技術,在fixtures
目錄中,除了預置的fixture_admin.py
,能夠繼續添加團隊成員的fixture:
新添加的fixture_your_name.py
須要到根目錄的conftest.py
中註冊才能生效:
# Import fixtures exec("from .fixtures.fixture_admin import *") exec("from .fixtures.fixture_your_name import *")
conftest.py模塊中建議所有定義成fixture,不對外提供function。
爲了不命名衝突和代碼跟蹤,團隊成員的公共函數命名建議加上_yourname
後綴。
首先在fixtures\fixture_admin.py
中修改mysql_engine
:
"mysql_engine": mysql_engine("127.0.0.1", # host "2306", # port "root", # username "123456", # password "test") # db_name
依次填寫主機名、端口、用戶名、密碼、數據庫名。
接着使用pandas來訪問數據庫,tests\mysql_test.py
預置了示例代碼:
from loguru import logger def test_mysql(pd, env_vars): logger.info(pd.read_sql("select 1 from dual", env_vars.mysql_engine))
返回的數據能夠經過data["列名"]["行號"]
的方式讀取。
若是想在console中以表格方式顯示錶數據,能夠使用tep.dao.print_db_table()
函數,如:
from loguru import logger from tep.dao import print_db_table def test_mysql(pd, env_vars): data = pd.read_sql("select 1 from dual", env_vars.mysql_engine) logger.info(print_db_table(data))
tep使用了Poetry來管理包和依賴:
目前已集成:
# 造測試數據 faker = "^4.1.1" # 提取JSON數據 jmespath = "^0.10.0" # 屏蔽HTTPS警告 urllib3 = "^1.25.9" # HTTP/HTTPS請求 requests = "^2.24.0" # HTML測試報告 allure-pytest = "^2.8.16" allure-python-commons = "^2.8.16" # 打印日誌 loguru = "^0.5.1" # 訪問數據庫 pandas = "^1.1.0" # 配置文件 pyyaml = "^5.3.1" # 爲pandas訪問數據庫提供engine sqlalchemy = "^1.3.22" # 把數據庫表打印成表格 texttable = "^1.6.3" # 支持sqlalchemy使用 pymysql = "^0.10.1"
最先寫這個工具的想法是以項目工程方式使用pytest,並結合第三方包完成接口自動化落地。若是你也有相似的想法,那麼能夠參考tep的作法。tep用戶手冊是針對於tep工具自己的使用說明,不包含pytest框架搭建和基本使用,若是想入門pytest並深度學習,能夠閱讀我寫的pytest系列文章,共8篇。tep的最新版本是0.5.3
,還不夠穩定,也存在bug,我會堅持維護下去,既是實用工具,也是技術沉澱。對tep有任何建議或問題,歡迎公衆號後臺回覆「加羣」討論哦:
參考資料: