1. 程式人生 > 其它 >【pytest】pytest使用及conftest.py使用

【pytest】pytest使用及conftest.py使用

pytest和自帶的unittest對比

  • unittest
    1、是python整合的,使用方便,也更廣泛。
    2、可以使用@ddt引數化
    3、最多針對(模組)類級別的setup/teardown

  • pytest
    1、支援引數化,但是沒有unittest靈活
    2、用例失敗自動截圖,pytest-html + conftest.py
    3、全域性的setup/teardown conftest.py
    4、用例失敗重跑,pytest-rerunfailures 重跑的外掛

pytest使用

安裝

預設源安裝:
pip install pytest
用國內清華大學的源:
pip install pytest -i https://pypi.tuna.tsinghua.edu.cn/simple


參考:
下載安裝慢,使用使用國內清華大學的源

pytest用例

# AddFunc.py
class AddFunc:

    def __init__(self,a,b,*args):
        self.a = a
        self.b = b
        self.other = args

    def add(self):
        sum_a = self.a + self.b
        if self.other:
            for o in self.other:
                sum_a += o
        return sum_a
# test_add.py
from com.**.** import AddFunc

def test_add_2num():
    a = AddFunc.AddFunc(1,2)
    result = a.add()
    assert result == 3


def test_add_3num():
    a = AddFunc.AddFunc(1,2,3)
    result = a.add()
    assert result == 6


def test_add_4num():
    a = AddFunc.AddFunc(1,2,3,5)
    result = a.add()
    assert result == 11

pytest命令

1、 pytest預設查詢當前路徑下(遞迴查)所有test_*.py*_test.py檔案中所有的test_開頭的用例

2、 在測試檔案中查詢Test開頭的類,以及類中以test開頭的方法,查詢測試檔案中test開頭的函式。
tips: 測試類的不應該有建構函式。
3、執行指定檔案中的用例pytest test_case/test_add.py::test_add_2num

-s: 顯示程式中的print/logging輸出
-v: 豐富資訊模式, 輸出更詳細的用例執行資訊
-q: 安靜模式, 不輸出環境資訊
-k:關鍵字模糊匹配,用and區分:匹配範圍(檔名、類名、函式名)

4、 直接使用python命令python run.py

# run.py
if __name__ == '__main__':
    pytest.main(['-s', '-v']) #執行檔案所在目錄下的所有用例

fixture及conftest.py使用

  • 有獨立的命名,並通過宣告它們從測試函式、模組、類或整個專案中的使用來啟用。
  • 按模組化的方式實現,每個fixture都可以互相呼叫。
  • fixture的範圍從簡單的單元擴充套件到複雜的功能測試,允許根據配置和元件選項對fixture和測試用例進行引數化,或者跨函式function、類class、模組module或整個測試會話session範圍。

fixture使用
conftest使用

import pytest
from selenium import webdriver


@pytest.fixture(scope="session", autouse=True)
def browser():
    '''
    開啟瀏覽器
    定義全域性瀏覽器驅動
    :return:
    '''
    global driver
    driver = webdriver.Chrome()
    driver.maximize_window()
    return driver


@pytest.fixture(scope="session", autouse=True)
def closebrowser():
    print("關閉瀏覽器")
    yield  # 執行到這需要暫停
    driver.quit()