1. 程式人生 > 其它 >Python:自動化框架pytest的安裝與使用

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.登入測試]