pytest エクストラショート
pytest は、非常に成熟したフル機能の Python テスト フレームワークであり、主に次の特徴があります。
シンプルかつ柔軟で使いやすい
パラメータ化のサポート
単純な単体テストと複雑な機能テストをサポートでき、Selenium/Appnium やインターフェイス自動テスト (pytest+requests) などの自動テストにも使用できます。
pytest には多くのサードパーティ プラグインがあり、pytest-selenium (統合セレン)、pytest-html (完璧な HTML テスト レポート生成)、pytest-rerunfailures (失敗ケースの繰り返し実行)、pytest-xdist (マルチCPU分散)など
テスト ケースのスキップおよび xfail 処理
jenkinsとうまく統合できる
レポートフレームワーク----allure は pytest もサポートします
1.pytestのインストール
1.1 インストール
pip install -U pytest
1.2 インストールの確認
pytest --version # は現在インストールされているバージョンを表示します
1.3 pytest ドキュメント
公式ドキュメント:
https://docs.pytest.org/en/latest/contents.html
pytest フレームワークには次の制約があります。
すべての単体テスト ファイル名は、test_*.py 形式または *_test.py 形式を満たす必要があります。
単体テスト ファイルでは、テスト クラスは Test で始まり、init メソッドを持つことはできません (注: クラスを定義するときは、T で始まる必要があります。そうしないと、pytest はクラスを実行しません)。
単体テスト クラスには、test_ で始まる 1 つ以上の関数を含めることができます。
このとき、pytestコマンドを実行すると、カレントディレクトリおよびサブディレクトリから上記の制約を満たすテスト関数を自動的に検索して実行します。
1.4 Pytest 実行モード
# file_name: test_abc.py
import pytest # 引入pytest包
def test_a(): # test开头的测试函数
print("------->test_a")
assert 1 # 断言成功
def test_b():
print("------->test_b")
assert 0 # 断言失败
if __name__ == '__main__':
pytest.main("-s test_abc.py") # 调用pytest的main函数执行测试
1. テストクラスのメイン関数モード
pytest.main("-s test_abc.py")
2. コマンドラインモード
pytest ファイルのパス / テスト ファイル名
例: pytest ./test_abc.py
1.5 Pytest 終了コードの意味リスト
- 終了コード 0 すべてのユースケースが実行され、合格しました。
- 終了コード 1 すべてのテスト ケースが実行され、失敗したテスト ケースがあります。
- 終了コード 2 ユーザーがテストの実行を中断しました。
- 終了コード 3 テスト実行中に内部エラーが発生しました
- 終了コード 4 pytest コマンドライン使用エラー
- 終了コード 5 利用可能なテスト ケース ファイルが収集されませんでした
1.6 ヘルプ情報の入手方法
pytest バージョンを表示
pytest --version
利用可能な組み込み関数の引数を表示する
pytest --fixtures
コマンドラインからヘルプ情報と設定ファイルのオプションを表示する
pytest --ヘルプ
1.7 テストケースの実行の制御
1. N 番目のテスト ケースが失敗した後、テストの実行を終了します。
pytest -x # 01 回目の失敗、テストを停止します
pytest --maxfail=2 # 2 回失敗した場合はテストを終了します
2. テストモジュールを指定する
pytest test_mod.py
3. テストディレクトリを指定します
pytest テスト/
4. キーワード表現によるフィルタ実行
pytest -k "メソッドではなく MyClass"
このコマンドは、ファイル名、クラス名、およびメソッド名が式と一致するユースケースに一致します。ここでは、このコマンドは
TestMyClass.test_something を実行し、TestMyClass.test_method_simple は実行しません。
5. ノード ID でテスト ケースを指定する
nodeid はモジュールファイル名、区切り文字、クラス名、メソッド名、パラメータで構成されます。例は次のとおりです。
モジュールで指定されたユースケースを実行します
pytest test_mod.py::test_func
モジュール内の指定されたメソッドを実行する
ytest test_mod.py::TestClass::test_method
6. タグ付き式による実行
pytest -m 遅い
このコマンドは、デコレーター @pytest.mark.slow によって装飾されたすべてのテスト ケースを実行します。
7. パッケージを通じてテストを実行する
pytest --pyargs pkg.testing
このコマンドは、パッケージ pkg.testing を自動的にインポートし、パッケージが配置されているディレクトリを使用して次の使用例を実行します。
1.8 マルチプロセス実行ケース
件数が多いと実行時間も非常に長くなりますので、スクリプトの実行時間を短縮したい場合は、複数のプロセスを使用して実行することができます。
pytest-xdist をインストールします。
pip install -U pytest-xdist
動作モード:
pytest test_se.py -n NUM
このうちNUMには同時プロセス数が入ります。
1.9 実行中のケースを再試行する
インターフェイス テストを実行すると、503 や短期的なネットワーク変動が発生してケースが失敗する場合があり、これは期待した結果ではありませんが、現時点ではケースを再試行することで解決できます。
pytest-rerunfailures をインストールします。
pip install -U pytest-rerunfailures
動作モード:
pytest test_se.py --rerunning NUM
NUM には再試行の回数が入ります。
1.10 印刷内容の表示
テスト スクリプトを実行するとき、一部のコンテンツをデバッグまたは印刷するために、コードに印刷コンテンツを追加しますが、pytest の実行時には、これらのコンテンツは表示されません。-s を付けると表示できます。
動作モード:
pytest test_se.py -s
また、pytestの複数の実行モードを重ねて実行することも可能で、例えば4つのプロセスを同時に実行し、その印刷内容を印刷したい場合などに便利です。使える:
pytest test_se.py -s -n 4
2. Pytestのセットアップおよびティアダウン機能
1. セットアップとティアダウンは主に、モジュール レベル、クラス レベル、関数レベル、関数レベルに分かれています。
2. テストクラス内に存在します
コード例:
- 関数レベルの setup()/teardown()
テスト メソッドの最初と最後に実行します。つまり、テスト関数を実行すると、セットアップとティアダウンが 1 回実行されます。
import pytest
class Test_ABC:
# 函数级开始
def setup(self):
print("------->setup_method")
# 函数级结束
def teardown(self):
print("------->teardown_method")
def test_a(self):
print("------->test_a")
assert 1
def test_b(self):
print("------->test_b")
if __name__ == '__main__':
pytest.main("-s test_abc.py")
結果:
テスト_abc.py
------->setup_method # 最初の setup()
------->テストa
。
------->teardown_method # 最初のteardown()
------->setup_method # 2 番目のセットアップ()
------->テスト_b
。
------->teardown_method # 2 番目のteardown()
2.2. クラスレベル
テスト クラスの最初と最後に実行します。つまり、テスト クラスにテスト関数がいくつあるかに関係なく、setup_class と Teardown_class はテスト内で 1 回だけ実行します。
コード例:
import pytest
class Test_ABC:
# 测试类级开始
def setup_class(self):
print("------->setup_class")
# 测试类级结束
def teardown_class(self):
print("------->teardown_class")
def test_a(self):
print("------->test_a")
assert 1
def test_b(self):
print("------->test_b")
if __name__ == '__main__':
pytest.main("-s test_abc.py")
結果:
test_abc.py
------->setup_class # 第一次 setup_class()
------->test_a
.
------->test_b
F
------->teardown_class # 第一次 teardown_class()
3. Pytest設定ファイル
pytest の構成ファイルは通常、pytest.ini という名前のテスト ディレクトリに配置され、コマンド ラインの実行時に構成ファイル内の構成が使用されます。
#配置pytest命令行运行参数
[pytest]
addopts = -s ... # 空格分隔,可添加多个命令行参数 -所有参数均为插件包的参数配置测试搜索的路径
testpaths = ./scripts # 当前目录下的scripts文件夹 -可自定义
#配置测试搜索的文件名称
python_files = test*.py
#当前目录下的scripts文件夹下,以test开头,以.py结尾的所有文件 -可自定义
配置测试搜索的测试类名
python_classes = Test_*
#当前目录下的scripts文件夹下,以test开头,以.py结尾的所有文件中,以Test开头的类 -可自定义
配置测试搜索的测试函数名
python_functions = test_*
#当前目录下的scripts文件夹下,以test开头,以.py结尾的所有文件中,以Test开头的类内,以test_开头的方法 -可自定义
4つのPytest共通プラグイン
プラグインリストURL: https:
//plugincompat.herokuapp.com多くのプラグインパッケージが含まれており、作業のニーズに応じて使用できます。
4.1 前提条件:
1. ファイルパス:
- Test_App
- - test_abc.py
- - pytest.ini
2. pyetst.ini 設定ファイルの内容:
[pytest]
# 命令行参数
addopts = -s
# 搜索文件名
python_files = test_*.py
# 搜索的类名
python_classes = Test_*
#搜索的函数名
python_functions = test_*
4.2 Pytest テストレポート
pytest-HTML は、テスト結果の HTML レポートを生成する pytest のプラグインです。Python 2.7、3.6と互換性があります
インストール方法: pip install pytest-html
pip install pytest-html
コマンド ラインから xml/html 形式でテスト レポートを生成し、ユーザーが指定したパスに保存します。プラグイン名: pytest-html
使用方法: コマンドライン形式: pytest --html=user path/report.html
例:
import pytest
class Test_ABC:
def setup_class(self):
print("------->setup_class")
def teardown_class(self):
print("------->teardown_class")
def test_a(self):
print("------->test_a")
assert 1
def test_b(self):
print("------->test_b")
assert 0 # 断言失败```
运行方式:
1.修改Test_App/pytest.ini文件,添加报告参数,即:addopts = -s --html=./report.html
# -s:输出程序运行信息
# --html=./report.html 在当前目录下生成report.html文件
️ 若要生成xml文件,可将--html=./report.html 改成 --html=./report.xml
2.命令行进入Test_App目录
3.执行命令: pytest
执行结果:
1.在当前目录会生成assets文件夹和report.html文件
6. まとめ
pytest は、より優れたプログラムの作成に役立つフル機能の Python テスト ツールです。これは、Python に付属する Unittest テスト フレームワークに似ていますが、pytest の方がより簡潔で効率的に使用でき、unittest フレームワークと互換性があります。pytest は、単純な単体テストと複雑な機能テストをサポートしており、リクエストを組み合わせてインターフェイス テストを実装したり、Selenium と appium を組み合わせて自動機能テストを実現したり、pytest と Allure2 を組み合わせて Jenkins に統合して継続的統合を実現したりすることができます。
最後に、私の記事を注意深く読んでくださった皆さんに感謝します。互恵性は常に必要です。それはそれほど価値のあるものではありませんが、必要な場合はそれを取り上げることができます。
これらの資料は、[ソフトウェア テスト] の友人にとって、最も包括的かつ完全な準備倉庫となるはずです。この倉庫は、最も困難な旅を乗り越える何万人ものテスト エンジニアにも同行してきました。お役に立てれば幸いです。パートナーは下の小さなカードをクリックしてください。受け取る