Python:自動化框架pytest的安裝與使用
pytest可以用來做系統測試 的自動化, 它的特點如下:
-
用 Python 編寫測試用例,簡便易用
-
可以用 檔案系統目錄層次 對應 手工測試用例 層次結構
-
靈活的 初始化清除 機制
-
可以靈活挑選測試用例執行
-
利用第三方外掛,可以生成不錯的報表
安裝
直接執行如下命令即可安裝 pytest:
python3 -m pip install pytest
一般還需要產生測試報表,所以要安裝一個第三方外掛pytest-html
,使用如下命令安裝:
python3 -m pip install pytest-html
使用
在pytest 框架中尋找測試項 的具體規則:
-
如果未指定命令列引數,則從 testpath(如果已配置)或當前目錄開始收集,如果命令列引數, 指定了 目錄、檔名 或 node id 的任何組合,則按引數來找
-
尋找過程會遞迴到目錄中,除非它們匹配上 norecursedirs
-
在這些目錄中,搜尋由其測試包名稱匯入的
test_*.py
或*_test.py
檔案
從這些檔案中,收集如下測試項:
- test為字首 的
函式
- Test為字首的
類
裡面的test為字首的方法
常用引數:
如果我們希望 顯示測試程式碼中print的內容,因為這些列印語句在除錯程式碼時很有用,可以加上命令列引數 -s,如下
pytest -s
執行 pytest 時, 如果命令列沒有指定目標目錄 或者 檔案, 它會自動搜尋當前目錄下所有符合條件的檔案、類、函式。如果我們希望得到更詳細的執行資訊,包括每個測試類、測試函式的名字,可以加上引數 -v,這個引數可以和 -s 合併為 -sv,如下:
pytest -sv
為了防止 pytest 到其他目錄中找測試用例項,執行測試時,我們可以在命令列加上目標目錄 cases ,就是這樣
pytest cases
要產生報告,在命令列加上 引數--html=report.html --self-contained-html
,如下
pytest cases --html=report.html
初始化和清除模組:這樣就會產生名為 report.html 的測試報告檔案,可以在瀏覽器中開啟。
- 模組級別的初始化、清除 在 整個模組所有用例 執行前後 分別
執行1次,
它主要是用來為該模組
中 所有的測試用例做公共的
初始化 和 清除 - 類級別的初始化、清除 在 整個模組所有用例 執行前後 分別
執行1次
類
中的所有測試用例做公共的
初始化 和 清除 - 方法別的初始化、清除 在 整個模組所有用例 執行前後 分別
執行1次,它主要是用來為該 方法中的內容做
公共的
初始化 和 清除 目標級別的 初始化清除,就是針對整個目錄執行的初始化、清除
如下定義 setup_module 和 teardown_module 全域性函式:
def setup_module():
print('\n *** 初始化-模組 ***')
def teardown_module():
print('\n *** 清除-模組 ***')
pytest 可以靈活的挑選測試用例執行挑選測試用例執行:
指定一個模組
可以像這樣只挑選一個模組執行:
pytest cases\登入\test_錯誤登入.py
指定目錄
pytest cases
也可以指定多個目錄
pytest cases1 cases2
指定模組裡面的函式或者類
指定一個類
pytest cases\登入\test_錯誤登入.py::Test_錯誤密碼
也可以指定類裡面的方法
pytest cases\登入\test_錯誤登入.py::Test_錯誤密碼::test_C001001
根據名字
可以使用 命令列引數 -k 後面加名字來挑選要執行的測試項
比如像這樣後面跟測試函式名字的一部分:
pytest cases
也可以指定多個目錄
pytest cases1 cases2
pytest -k C001001 -s
注意,-k 後面的名字
可以是測試函式的名字,可以是類的名字,可以是模組檔名,可以是目錄的名字
是大小寫敏感的
不一定要完整,只要能有部分匹配上就行
可以用 not 表示選擇名字中不包含,比如
pytest -k "not C001001" -s
可以用 and 表示選擇名字同時包含多個關鍵字,比如
pytest -k "錯 and 密碼2" -s
可以用 or 表示選擇名字 包含指定關鍵字之一即可,比如
pytest -k "錯 or 密碼2" -s
根據標籤
可以這樣給 某個方法加上標籤 webtest
import pytest
class Test_錯誤密碼2:
@pytest.mark.webtest
def test_C001021(self):
print('\n用例C001021')
assert 1 == 1
然後,可以這樣執行指定標籤的用例
pytest cases -m webtest -s
也可以這樣給整個類加上標籤
@pytest.mark.webtest
class Test_錯誤密碼2:
def test_C001021(self):
print('\n用例C001021')
assert 1 == 1
可以這樣定義一個全域性變數 pytestmark 為 整個模組檔案 設定標籤
import pytest
pytestmark = pytest.mark.網頁測試
如果你需要定義多個標籤,可以定義一個列表
import pytest
pytestmark = [pytest.mark.網頁測試, pytest.mark.登入測試]