【Python自動化】pytestシリーズ(完成)

ここに画像の説明を挿入します

pytest シリーズには 4 つの記事があり、この記事は 4 番目で最後の記事です。

友達のメッセージに応えて、これらの pytest 記事を要約できればと思います。

公開アカウント: Meng Wiji のテスト開発への道、pytest に返信して対応する概要情報を受け取る

この章の知識ポイント

Pytest の高度な使用法

(1) パラメータ化

@pytest.mark.parametrize("参数名",列表数据)
'''
参数名:用来接收每一项数据,并作为测试用例的参数。
列表数据:一组测试数据。
'''
@pytest.mark.parametrize(self,argnames, argvalues, indirect=False, ids=None, scope=None))
パラメータ 説明する
引数名 必須、パラメータ名、1 つ以上のパラメータ名 (キー) を表すカンマ区切りの文字列、またはパラメータ文字列のリスト/タプル
引数値 必須, パラメータ値が渡されます. 引数名が 1 つの場合, 単一の値リストが渡されます. 引数名が複数ある場合, タプルのリストとして表示されます. タプルはパラメータ名と 1 対 1 に対応します。
間接的な true の場合、argnames はフィクスチャ関数名である必要があり、argvalues の値は対応するフィクスチャに渡されます。これは @pytest.fixture(params=) の使用と同等です。デフォルトは False です。
ID サブユースケースの実行名をマークします。argvalue の数と一致します。指定しない場合は自動的に生成されます。デフォルトはなしです。
範囲 指定した場合、パラメータの範囲を表します。スコープは、パラメーター インスタンスごとにテストをグループ化するために使用されます。また、フィクスチャ関数によって定義されたスコープをオーバーライドし、テスト コンテキストまたは構成を使用して動的スコープを設定できるようにします。
#示例
# 这里参数名 a,b,c,对应传入进去的参数a,b,c,需要一一对应。
# 如果只写了一个参数,那么就表示后面每一个以逗号分隔的内容,都为一组数据。
@pytest.mark.parametrize("a,b,c",[(1,2,3),(7,8,15),(2,2,3),(9,6,15)])
def test_add(a,b,c):
    sum = a+b
    assert sum==c
    
    ### 运行结果 ###
============================= test session starts =============================
collecting ... collected 4 items

test_004_参数化.py::test_add[1-2-3] PASSED                               [ 25%]
test_004_参数化.py::test_add[7-8-15] PASSED                              [ 50%]
test_004_参数化.py::test_add[2-2-3] FAILED                               [ 75%]
test_004_参数化.py:12 (test_add[2-2-3])
4 != 3

Expected :3
Actual   :4
<Click to see difference>

a = 2, b = 2, c = 3

    @pytest.mark.parametrize("a,b,c",[(1,2,3),(7,8,15),(2,2,3),(9,6,15)])
    def test_add(a,b,c):
        sum = a+b
>       assert sum==c
E       assert 4 == 3

test_004_参数化.py:16: AssertionError

test_004_参数化.py::test_add[9-6-15] PASSED                              [100%]

========================= 1 failed, 3 passed in 0.06s =========================

パラメータの組み合わせ: 複数のパラメータセット、順番に結合、デカルト積

@pytest.mark.parametrize("x",[2,4,6])
@pytest.mark.parametrize("y",[1,3,5])
def test_add(x,y):
    print(f"x:{
      
      x},y:{
      
      y}")

9 セットのテスト ケースが生成されます

============================= test session starts =============================
collecting ... collected 9 items

test_004_参数化.py::test_add[1-2] PASSED                                 [ 11%]x:2,y:1

test_004_参数化.py::test_add[1-4] PASSED                                 [ 22%]x:4,y:1

test_004_参数化.py::test_add[1-6] PASSED                                 [ 33%]x:6,y:1

test_004_参数化.py::test_add[3-2] PASSED                                 [ 44%]x:2,y:3

test_004_参数化.py::test_add[3-4] PASSED                                 [ 55%]x:4,y:3

test_004_参数化.py::test_add[3-6] PASSED                                 [ 66%]x:6,y:3

test_004_参数化.py::test_add[5-2] PASSED                                 [ 77%]x:2,y:5

test_004_参数化.py::test_add[5-4] PASSED                                 [ 88%]x:4,y:5

test_004_参数化.py::test_add[5-6] PASSED                                 [100%]x:6,y:5


============================== 9 passed in 0.03s ==============================

Process finished with exit code 0

(2)pytest.ini

1. pytest 設定ファイルは、pytest の実行モードを変更できます。これは固定ファイル pytest.ini ファイルであり、設定情報を読み取り、指定された方法で実行します。

2. 場所: 通常、プロジェクトのルート ディレクトリ (つまり、現在のプロジェクトの最上位フォルダーの下) に配置されます。

3. 名前付け: pytest.ini。漢字、スペース、引用符、コロンなどの中国語記号は使用できません。

4. 実行ルール: メイン機能モードで実行する場合でも、コマンド ライン モードで実行する場合でも、このグローバル構成ファイルは自動的に読み取られます。

示列

[pytest]
markers = 
	mark1:描述
	mark2:描述
	mark3:描述
addopts = -vs
;指定pytest最低版本号
minversion = 7.0
;pytest默认是搜索执行当前目录下的所有以test_开头的测试用例;
;我们可以在pytest.ini配置testpaths = test_case/test_001.py,则只执行当前配置的文件夹下或文件里的指定用例,可配置多个,空格隔开
testpaths = ./testcase

;模块名的规则,配置测试搜索的模块文件名称
python_files = test*.py

;类名的规则,配置测试搜索的测试类名
python_classes = Test*

;方法名的规则,配置测试搜索的测试函数名
python_functions = test

① マーク マーク

マーキング:マーク機能

  • ユース ケースをマークすると、実行時にマークされたユース ケースのみが実行されます。
  • 300 の回帰ユースケース。– 50 をスモークテストとしてマークします。

1. 最初にタグ名を登録する必要があります

pytest.ini

[pytest]
    markers = 
        mark1:标签说明(只能英文,可不写)
        mark2:标签说明(只能英文,可不写)
        mark3:标签说明(只能英文,可不写)

2. テスト ケース/テスト クラスをマークする

基本的な使い方

 @pytest.mark.已注册的标记
 # 如
 @pytest.mark.mark1

テスト クラスにラベルを付けるには、次のステートメントを使用します (テスト クラスでは、すべてのユース ケースにこのラベルが付けられます)。

class TestClass():
    pytestmark = pytest.mark.已注册标签名
    # 或者 多标签模式
    pytestmark = [pytest.mark.标签名1,pytest.mark.标签名2] 

モジュール ファイルにラベルを付け、次のステートメントを使用します (py ファイルの下では、テスト クラス内のすべてのテスト関数とテスト関数がこのラベルでラベル付けされます)

import pytest
pytestmark = pytest.mark.已注册标签名
# 或者 多标签模式
pytestmark = [pytest.mark.标签名1,pytest.mark.标签名2]

3. マークされたユースケースのみを実行するようにランタイムを設定します。

pytest命令行: -m 标记名
在收集到的所有用例中,只运行对应标记名的用例。

4. マークを重ねて表示可能

②構成を追加します

パラメータ 効果
-s 出力デバッグ情報を示します。テスト関数の print() によって出力される情報を表示するために使用されます。
-v 追加前はモジュール名のみが出力されますが、vを追加するとクラス名、モジュール名、メソッド名が出力され、より詳細な情報が表示されます。
-q 全体的なテスト結果のみが表示されることを示します
-vs これら 2 つのパラメータは一緒に使用できます
-n マルチスレッドまたは分散実行テスト ケースをサポート (前提条件: pytest-xdist プラグインがインストールされている必要があります)
–html pytest -vs --html ./reports/result.html などの HTML テスト レポートを生成します (前提条件: pytest-html プラグインがインストールされている)。
-バツ 1 つのテスト ケースがエラーを報告する限り、実行が停止することを示します。
-k テスト ケースの文字列の一部であるファジー マッチングは、テスト ケースの実行を指定します。
-m マーク マーク

(3)pytest.mark.関連

1. 実行を直接スキップする

@pytest.mark.skip

ここに画像の説明を挿入します

2. 条件が満たされた場合に実行をスキップする

@pytest.mark.skipif
根据特定的条件,不执行标识的测试函数.
 方法:
     skipif(condition, reason=None)
 参数:
     condition:跳过的条件,必传参数
     reason:标注原因,必传参数
 使用方法:
     @pytest.mark.skipif(condition, reason="xxx") 

条件が True の場合はスキップ、そうでない場合は実行

ここに画像の説明を挿入します

3. 予想通りの失敗としてマークする機能

标记测试函数为失败函数
 方法:
     xfail(condition=None, reason=None, raises=None, run=True, strict=False)
 常用参数:
     condition:预期失败的条件,必传参数
     reason:失败的原因,必传参数
 使用方法:
     @pytest.mark.xfail(condition, reason="xx")

条件が True の場合、このユースケースは xpassed としてマークされ、それ以外の場合は pass としてマークされます。

ここに画像の説明を挿入します

4. テストを繰り返します

テスト ケースを繰り返し実行するには、「@pytest.mark.repeat」デコレータを使用します。

import pytest

@pytest.mark.repeat(3)
def test_something():
    assert 1 + 1 == 2

このテスト ケースは 3 回実行されます。

5. 依存関係のテスト

「@pytest.mark.dependency」デコレーターを使用してテスト ケース間の依存関係をマークし、必須のテスト ケースの前に前提条件が確実に実行されるようにします。

import pytest

@pytest.mark.dependency()
def test_login():
    assert True

@pytest.mark.dependency(depends=["test_login"])
def test_access_profile():
    assert True

@pytest.mark.dependency(depends=["test_login"])
def test_access_settings():
    assert True

(4) 失敗後の再実行

ユースケースが失敗した場合、ユースケースを再実行できます。

プラグインをインストールする必要がありますrerunfailures

インストール方法:

pip install pytest-rerunfailures

使い方:

コマンドラインパラメータの形式:

# 命令
pytest --reruns 重试次数
pytest --reruns 3 :运行失败的用例可以重新运行3次

拡大する

#
pytest --reruns 重试次数 --rerun-dalay 次数之间的延时设置(单位:秒)

# 示列
pytest  --reruns 3 --rerun-dalay 5
表示失败的用例可以重新运行3次,每次重运行间隔5秒。

(5) ユースケースの実行順序を指定する

前に述べたように、pytest には独自のユースケースの実行順序がありますが、独自の方法で実行するように指定したい場合があります。

pytest にはこの機能を実現するためのプラグインがあります。pytest-orderingユースケースの実行順序を指定します。

1. 依存パッケージをインストールする

pip install pytest-ordering

2. pytest-ordering の使用

デコレータメソッドを通じてケースの実行順序を制御する

1. 方法 1:

- 第一个执行:		@ pytest.mark.run('first')
- 第二个执行:		@ pytest.mark.run('second')
- 倒数第二个执行:	@ pytest.mark.run('second_to_last')
- 最后一个执行:		@ pytest.mark.run('last')

2. 方法 2:

 - 第一个执行:		@ pytest.mark.first
 - 第二个执行:		@ pytest.mark.second
 - 倒数第二个执行:	  @ pytest.mark.second_to_last
 - 最后一个执行:	   @pytest.mark.last

3. 方法 3:

 - 第一个执行:		@ pytest.mark.run(order=1)
 - 第二个执行:		@ pytest.mark.run(order=2)
 - 倒数第二个执行:	  @ pytest.mark.run(order=-2)
 - 最后一个执行:	    @ pytest.mark.run(order=-1)

実行優先度:
0>小さな正の数>大きな正の数>マークなし>小さな負の数>大きな負の数

(6) ユースケースは相互に依存します

シナリオ: 追加、削除、変更、クエリに関する操作関数がありますが、追加操作のケースが失敗すると、削除、変更、クエリの操作が実行されません。Pytest フレームワークには、これを行うのに役立つ pytest-dependency プラグインが用意されています。これを使用するだけで済みます。

インストール

  • コマンド ライン ウィンドウに次のように入力します。pip install pytest-dependency
  • インストールされているバージョンを確認します。pip show pytest-dependency

使用

使用法:@pytest.mark.dependency()依存するテスト ケースをマークし、@pytest.mark.dependency(depends=["测试用例名称"])依存関係を参照するために使用します。テスト ケース名は複数にすることができます。

説明: 依存するユースケースの実行に失敗すると、依存するユースケースは直接スキップされます。

# !/usr/bin/python3
# _*_coding:utf-8 _*_
import pytest

@pytest.mark.dependency()
def test_add():
    print("我是 test_add 用例")
    assert False

@pytest.mark.dependency(depends=["test_add"])
def test_update():
    print("我是 test_update 用例")
    assert False

@pytest.mark.dependency(depends=["test_add"])
def test_delete():
    print("我是 test_delete 用例")
    assert True

@pytest.mark.dependency(depends=["test_add"])
def test_select():
    print("我是 test_select 用例")
    assert True

if __name__ == '__main__':
    pytest.main(["-s"])
  • 依存関係のあるテスト ケースをマークするには @pytest.mark.dependency() を使用し、依存関係を参照するには @pytest.mark.dependency(depends=["テスト ケース名"]) を使用します。テスト ケース名は複数指定できます。

  • ユース ケースに複数の依存関係がある場合、1 つの依存関係が失敗する限り、依存関係のユース ケースはスキップされ、すべての依存関係は成功した場合にのみ実行されます。

プラグイン ライブラリには、自分で探索できる他のプラグインや関数もあります。

他の

エラー 1: 非推奨警告:

非推奨警告: distutils バージョン クラスは非推奨です。代わりにpackaging.versionを使用してください。

version.LooseVersion(pytest.version) >= version.LooseVersion(“6.0”)の場合:

インターネット上では、バージョンが低すぎるという意見が多くあります。検証した結果、そうではありませんが、pytest には多くの関連依存関係があることがわかりました。現在の環境は、現在インストールされている pytest に必要な依存関係の一部と一致しません。アリュールなどとして。

したがって、非常に簡単なアプローチは、Python 環境を再作成し、クリーンな環境でプロジェクトを維持することです。これにより、相互に不満が生じた場合でも同様の依存関係の競合、警告、さらにはエラーが発生しなくなります。

ここに画像の説明を挿入します

仮想環境に入り、pycharm で [ターミナル] をクリックし、[コマンド プロンプト] を選択します。その前に括弧が付いているものが仮想環境に入ります。

#退出虚拟环境
deactivate
#进入虚拟环境,重开命令窗口更快
activate

ここに画像の説明を挿入します

これで、pytest シリーズは終了です。ここまで読んでくれた友達に感謝します。あなたは最高ですよ~

おすすめ

転載: blog.csdn.net/qq_46158060/article/details/132430139