首頁 > 軟體

全網非常詳細的pytest組態檔

2022-07-15 14:03:57

說到設定,大家可能想到的是不經常更改的內容,比如Django裡的settings.py檔案,或者我們做自動化的時候,把測試環境的域名和正式環境的域名放到一個組態檔裡,所有的介面都從這個檔案裡讀取。這樣,如果有一天,我們的域名變了,我們只需要更改設定裡的域名就可以了。pytest裡也有幾個組態檔。

  • pytest.ini:pytest的主組態檔,可以改變pytest的預設行為,有很多可設定的選項。
  • conftest.py:是原生的外掛庫,其中的hook函數和fixture將作用於該檔案所在的目錄以及所有子目錄。
  • __init__.py:每個測試子目錄都包含該檔案時,那麼在多個測試目錄中可以出現同名測試檔案。
  • tox.ini:它與pytest.ini類似,只不過是tox的組態檔,你可以把pytest的設定都寫在tox.ini裡,這樣就不用同時使用tox.ini和pytest.ini兩個檔案

更改預設命令列選項

我們之前已經用過pytest命令列選項了,比如-v/--verbose可以輸出詳細資訊,-l/--showlocals可以檢視失敗測試用例裡堆疊中的區域性變數。你也許經常要用到某些引數,又不想重複輸入,這時可以使用pytest.ini檔案裡的addopts設定。

[pytest]
addopts = -rsxX -l --tb=short --strict

--rsxX表示pytest報告所有測試用例被跳過、預計失敗、預計失敗但實際通過的原因。-l表示pytest報告所有失敗測試的堆疊中的區域性變數。--tb=short表示簡化堆疊回溯資訊,只保留檔案和行數。--strict選項表示禁止使用未在組態檔中註冊的標記。

我們有個test_two.py檔案,裡面有如下程式碼

def inc(x):
    return x + 1

def test_answer():
    assert inc(3) == 55

def test_answer1():
    assert inc(4) == 5

我們沒有新增如上命令執行一遍

再去pytest.int裡新增上上面的程式碼,在去執行一遍

註冊標記來防止拼寫錯誤

在前面我們學過,自定義標記可以簡化測試工作,讓我們用指定的標記執行某個測試子集。但是,標記很容易拼錯,比如把@pytest.mark.smoke拼成@pytest.mark.somke,預設情況下。這不會引起程式錯誤。pytest會以為這是你建立的另一個標記。為了避免拼寫錯誤。可以在pytest.ini檔案裡註冊標記

[pytest]
markers =
    smoke: Run the smoke test functions for tasks project
    get: Run the test functions that test tasks.get()

修改test.two.py

import pytest
def inc(x):
    return x + 1

@pytest.mark.smoke
def test_answer():
    assert inc(3) == 55

@pytest.mark.post
def test_answer1():
    assert inc(4) == 5

標記註冊好後,可以通過pytest --markers來檢視

沒有註冊的標記不會出現在--markers列表裡。如果使用了--strict選項,遇到拼寫錯誤的標記或未註冊的標記就會報錯。

pytest.ini裡寫如下程式碼

[pytest]
markers =
    smoke: Run the smoke test functions for tasks project
    get: Run the test functions that test tasks.get()

上面的程式碼我們在執行的時候,把smoke故意寫錯了,也沒有報錯,只是給我們一個警告,只需要我們在ini裡註冊下就不會有警告了

在去修改pytest.ini裡的程式碼

[pytest]
addopts = -rsxX -l --tb=short --strict
markers =
    smoke: Run the smoke test functions for tasks project
    get: Run the test functions that test tasks.get()

我們在ini里加上了addopts = -rsxX -l --tb=short --strict 這句程式碼之後,如果我們拼錯了就會報錯

指定pytest的最低版本號

有些功能是隨著pytest版本的更新而加入到裡面的,如果我們不想用比較低的版本,可以在設定裡指定最低的版本號。

minversion選項可以指定執行測試用例的pytest的最低版本。

[pytest]
minversion = 4.0

如果使用了老版本的pytest執行該測試,就會得到一個錯誤資訊。

指定pytest忽略某些目錄

pytest執行測試搜尋時,會遞迴遍歷所有子目錄,包括某些你明知道沒必要遍歷的目錄。遇到這種情況,你可以使用norecurse選項簡化pytest的搜尋工作。

norecurse的預設設定是 .* build dist CVS -darcs {arch}和 *.egg。因為有 .*,所以將虛擬環境命名為.venv是一個好注意,所有以.(點)開頭的目錄都不會被存取。如果不是以.(點)開頭,那麼需要把它加入norecursedirs裡。比如我想忽略test_001目錄

[pytest]
norecursedirs = .* venv test_001 *.egg dist build

先來看下目錄結構

test_one.py

import pytest
def test_case_01():
    assert 0 == 0

def test_case_02():
    assert 0 == 0

test_one.py

test_first

import pytest
def inc(x):
    return x + 1

@pytest.mark.smoke
def test_answer():
    assert inc(3) == 55

@pytest.mark.post
def test_answer1():
    assert inc(4) == 5

test_first

如果我們不指定norecursedirs就會執行djangotest目錄下的所有檔案

指定norecursedirs

[pytest]
norecursedirs = .* venv test_001 *.egg dist build
addopts = -rsxX -l --tb=short --strict
markers =
    smoke: Run the smoke test functions for tasks project
    get: Run the test functions that test tasks.get()
    smoek: run
    post: Run post

也可以指定多個目錄

[pytest]
norecursedirs = .* venv test_001 test_002 *.egg dist build

指定測試目錄

norecuredirs告訴pytest哪些路徑不用存取,而testpaths則指示pytest去哪裡存取。testpaths是一系列相對於根目錄的路徑,用於限定測試用例的搜尋範圍。只有在pytest未指定檔案目錄引數或測試用例識別符號時,該選項才有作用

如果我們只想執行test_001下的測試用例,則可以把test_001放到testpaths裡

[pytest]
testpaths = test_001

那如果我既指定了testpaths和norecursedirs ,而且兩個是一樣的,結果會怎樣

[pytest]
testpaths = test_001
norecursedirs = .* venv test_001  *.egg dist build

從執行結果可以看出,如果兩個都指定,且衝突的話,是按照指定的testpaths執行的,是不是因為testpaths在上面的原因導致的?我們換一下順序

[pytest]
norecursedirs = .* venv test_001  *.egg dist build
testpaths = test_001

從上面兩次的執行結果可以看出,如果既指定了testpaths和norecursedirs ,而且兩個是一樣的,則是按照testpaths執行的

更改測試搜尋的規則

pytest根據一定的規則搜尋並執行測試,標準的測試搜尋規則如下。

  • 從一個或多個目錄開始查詢。你可以在命令列指定檔名或目錄名。如果未指定,則使用當前目錄
  • 在該目錄和所有子目錄下遞迴查詢測試模組
  • 測試模組是指檔名為test_*.py或*_test.py的檔案
  • 在測試模組中查詢以test_開頭的函數名。
  • 查詢名字以Test開頭的類,其中,首先篩選掉包含__init__函數的類,在查詢類中以Test_開頭的類方法

以上是標準的測試搜尋規則,你也可以更改它們

python_classes

通常pytest的測試搜尋規則是尋找以Test*開頭的測試類,而且這個類不能有__init__()函數。但是,如果把測試類命名為<something>Test或<something>Suite怎麼辦?python_classes就可以解決這個問題。

[pytest]
python_classes = *Test Test* *Suite

這個設定允許我們像下面這樣給類取名

class DeleteSuite():
    def test_delete_1(self):
        pass
    def test_delete_2(self):
        pass

我們修改test_001目錄下的test_onne.py檔案

class DeleteSuite():
    def test_delete_1(self):
        assert True

    def test_delete_2(self):
        assert False

先不新增python_classes執行一下

然後我們新增上python_classes執行一下

[pytest]
python_classes = *Test Test* *Suite

python_files

像pytest_classes一樣,python_files可以更改預設的測試搜尋規則,而不是僅查詢以test_*開頭的檔案和以*_test結尾的檔案

假設你的測試檔案統一命名為check_<something>.py。你不必重新命名所有的測試檔案,只要在pytest.ini檔案裡增加一行設定即可

[pytest]
python_files = test_* *_test check_*

我們將test_one.py改為check_one.py在執行

[pytest]
python_files = test_* *_test check_*
python_classes = *Test Test* *Suite

python_functions

python_functions與之前的兩個設定類似,它只是用來測試函數和方法的命名。more規則以test_*開頭。如果想新增check_*,則只需要新增一行設定

[pytest]
python_functions = test_* check_*

修改test_one.py下的程式碼

class DeleteSuite():
    def check_delete_1(self):
        assert True

    def check_delete_2(self):
        assert False
[pytest]
python_functions = test_* check_*
python_files = test_* *_test check_*
python_classes = *Test Test* *Suite
addopts = -rsxX -l -v --tb=short --strict

禁用XPATH

設定xfail_strict = true將會使那些被標記為@pytest.mark.xfail但實際通過的測試用例也被報告為失敗

[pytest]
xfail_strict = true

很難理解是吧!!!喝杯茶,我給你給個栗子吃

test_one.py程式碼如下,可以看到,我們有兩個測試用例,都是標記的預期失敗,但其中一個是會成功,一個是失敗的,我們不加xfail_strict = true來執行一下

import pytest

@pytest.mark.xfail()
def test_answer():
    assert 5 == 5

@pytest.mark.xfail()
def test_answer1():
    assert 5 != 5

可以看到有一個通過了,有一個失敗了,但是我們如果想把標記為預期失敗的,不管結果是成功還是失敗都標記為失敗,則要在設定里加xfail_strict = true

[pytest]
xfail_strict = true

這樣兩個用例就都是失敗的

到此這篇關於全網非常詳細的pytest組態檔的文章就介紹到這了,更多相關pytest組態檔內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com