天天看點

Pytest使用記錄

文章目錄

    • Pytest簡介
    • Pytest安裝指令
    • Pytest編寫規則
    • 項目結構目錄
    • 執行測試方法
    • 常見指令參數
    • Pytest插件使用
      • Pytest-ordering
    • 參考連結

Pytest簡介

Pytest是一個易用、強大、靈活的功能測試架構,并且相容unittest和nose的測試用例。

  • 易用: 用例編寫簡單, 斷言友善
  • 強大: 全能的mark, 強大的fixtures
  • 靈活: 靈活的執行控制及豐富的插件

Pytest安裝指令

pip install pytest
           

Pytest編寫規則

  • 測試檔案以test_開頭,或以_test結尾
  • 測試類以Test開頭,并且不能帶有 init 方法
  • 測試函數以test_開頭
  • 斷言使用python自帶的assert

項目結構目錄

假設我的項目結構如下圖所示,在項目目錄下專門建立了一個test檔案夾,裡面存放的都是與測試相關的檔案。

├── my_project
     ├── src 
     ├── main.py
     └──  test
           ├── pytest.ini
           ├── test_1.py
           └── test_2.py
           

其中,

pytest.ini

為pytest的配置檔案,名稱是固定的不能随便更改,假設配置檔案如下,這裡我隻是簡單配置了下标簽mark,後面會使用到mark:

[pytest]

markers =
  mo1: module 1
           

假設在

main.py

中實作了一個非常簡單的方法:

import math


def func(x: int, y: int):
    return math.pow(x, y)

           

然後在測試檔案中調用該方法,進行測試(在這裡去實作自己需要測試的方法),假設

test_1.py

為(判斷結果是否正确,主要是使用assert語句):

import pytest
from main import func


@pytest.mark.mo1
def test_interface1():
    assert func(1, 1) == 1


@pytest.mark.mo1
def test_interface2():
    assert func(2, 1) == 2


def test_interface3():
    assert func(2, 2) == 4
           

注意,其中有些函數上添加了

@pytest.mark.mo1

裝飾器,

mo1

是我們在

ini

檔案中提前聲明了的,後面可以指定去執行哪些标簽mark下的測試方法。

執行測試方法

在項目根目錄打開系統終端

  • 執行test檔案夾下所有測試檔案
pytest -v ./test/
           
Pytest使用記錄
  • 執行指定測試檔案
pytest -v ./test/test_1.py
           
Pytest使用記錄
  • 執行指定測試檔案指定方法
pytest -v ./test/test_1.py::test_interface1
           
  • 執行指定标簽mark下的測試方法(這裡就測試之前标注的

    mo1

    标簽下的方法)
pytest -v -m 'mo1' ./test/
           
Pytest使用記錄

通過終端輸出可以看到,一共有6個測試方法,但屬于

mo1

标簽的隻有2項,并僅測試這兩項方法。

常見指令參數

  • -v

    表示輸出更加詳細的測試資訊
  • -x

    表示一旦遇到測試失敗就立即退出(預設情況是會執行所有測試樣例的,無論是否有測試失敗的情況)
  • -q

    為安靜模式,測試過程中不會輸出測試環境以及測試進度等資訊,隻傳回測試結果
  • -s

    列印測試函數中的

    print

    輸出,預設是不列印的
  • -m

    僅執行指令标簽mark下的測試方法

更多指令參數可檢視pytest的幫助文檔:

pytest -h
           
Pytest使用記錄

對于常用的參數指令可以直接寫在

pytest.ini

檔案的

addopts

中,這樣就不需要手動輸入了。

[pytest]
addopts = -v

markers =
  mo1: module 1
           

Pytest插件使用

Pytest-ordering

有時在測試代碼中可能需要按照一定的順序去執行測試代碼,此時可以使用

pytest-ordering

包來控制執行的順序。

  • 安裝

    pytest-ordering

pip install pytest-ordering
           
  • 在測試代碼中加上裝飾器

    @pytest.mark.run(order=1)

    ,其中order代表着執行順序,數字越小執行優先級越高。
import pytest
from main import func


@pytest.mark.run(order=1)
def test_interface1():
    print("test1")
    assert func(1, 1) == 1


@pytest.mark.run(order=3)
def test_interface2():
    print("test2")
    assert func(2, 1) == 2


@pytest.mark.run(order=2)
def test_interface3():
    print("test3")
    assert func(2, 2) == 4

           
  • 再次執行測試程式
pytest -vs ./test/test_1.py
           
Pytest使用記錄

通過終端的輸出,可以發現執行的順序是按照我們給定的

order

順序來執行的。pytest -vs ./test/test_1.py

參考連結

Pytest - 使用介紹

Pytest基礎使用教程

pytest文檔18-配置檔案pytest.ini

Pytest系列 - pytest-ordering用例的執行順序