はじめに
前回の記事「Python 単体テスト フレームワークの紹介」では、Python 単体テスト フレームワークを紹介しました。比較的基本的であり、二次開発にも使用できるため、人々はよく Unittest を使用します。開発レベルが非常に高い場合は、統合開発および自動テスト プラットフォームが必要です。もご利用いただけます。この記事では主に、unittest と pytest の違いについて説明しますが、pytest は、unittest に比べて、コードがシンプルで、便利で柔軟に使用でき、プラグインが豊富です。
Unittest と Pytest
では、主に、ユース ケースの作成ルール、ユース ケースの前後処理、パラメーター化、アサーション、ユース ケースの実行、失敗の再実行、レポートの観点から、unitest と pytest の違いを比較します。
ユースケースの作成ルール
ユースケースの事前条件と事後条件
断言
テストレポート
失敗の再実行メカニズム
パラメータ化する
ユースケース分類の実行
見た目が良くない場合は、以下の表を参照してください。
一般に、単体テストのユースケース形式は複雑で、互換性がなく、プラグインがほとんどないため、二次開発に便利です。pytest はより便利で高速です。ユース ケースの形式はシンプルです。unittest ユース ケースのコードを変更することなく、unittest スタイルのテスト ケースを実行できます。互換性が優れています。エラーが発生したときにユースケースを再実行するために使用できる flask プラグインや、デバイスの並列実行に使用でき、より効率的である xdist プラグインなど、多くの pytest プラグインがあります。
例のデモンストレーション
7 つの大きな違いについて話した後は、必ず具体的な例を示し、事実を使ってそれを説明します。
事前配置と事後配置の違い.
ユースケースにおける事前配置と事後配置の違いについて話しましょう. まず単体テストでの事前配置と事後配置の使用を見てみましょう:
import unittest
class TestFixtures01(unittest.TestCase):
# 所有用例执行前执行
def setUp(self) -> None:
print("setUp开始")
def tearDown(self) -> None:
print("tearDown结束")
# 每条用例执行前执行
@classmethod
def setUpClass(cls) -> None:
print("setUpClass开始")
@classmethod
def tearDownClass(cls) -> None:
print("tearDownClass结束")
# 测试用例
def test_001(self):
print("测试用例001")
class TestFixtures02(unittest.TestCase):
def test_002(self):
print("测试类2")
# 每个模块执行前执行
def setUpModule():
"""
在所有测试类在调用之前会被执行一次,函数名是固定写法,会被unittest框架自动识别
"""
print('集成测试 >>>>>>>>>>>>>>开始')
def tearDownModule():
print("集成测试 >>>>>>>>>>>>>>结束")
if __name__ == '__main__':
unittest.main()
操作結果:
結果から、3 つのメソッドの論理優先度がわかります: setUp()&tearDown() < setUpClass()&tearDownClass() < setUpModule()&tearDownModule()
次に、pytest の前処理と後処理を見てみましょう。
1. 自動テストでは前処理と後処理が使用されることは誰もが知っています。単体テストと比較して、pytest は前処理と後処理およびプラグインの点ではるかに柔軟です。フィクスチャによって定義することもできます。
まず、ユースケース実行の前後のレベルが次のとおりであることを理解しましょう。
1. モジュール レベル: グローバル。モジュール全体が 1 回だけ実行され、テスト ケースよりも優先されます。
2. クラス レベル: クラス内で定義され、このクラスに対してのみ有効になります。Unittest に似た cls デコレータ
3. 関数レベル:関数に対してのみ有効であり、クラス以下の関数には無効です。
4. メソッドレベル: クラスで定義され、各ユースケースは 1 回実行されます。
def setup_module():
print('\n整个模块 前 只运行一次')
def teardown_module():
print('\n整个模块 后 只运行一次')
def setup_function():
print('\n不在类中的函数,每个用例 前 只运行一次')
def teardown_function():
print('\n不在类中的函数,每个用例 后 只运行一次')
def test_ab():
b = 2
assert b < 3
def test_aba():
b = 2
assert b < 3
class Test_api():
def setup_class(self):
print('\n此类用例 前 只执行一次')
def teardown_class(self):
print('\n此类用例 后 只执行一次')
def setup_method(self):
print('\n此类每个用例 前 只执行一次')
def teardown_method(self):
print('\n此类每个用例 后 执行一次')
def test_aa(self):
a = 1
print('\n我是用例:a') # pytest -s 显示打印内容
assert a > 0
def test_b(self):
b = 2
assert b < 3
操作結果:
2. これが元の使用法です。以下の Fixture の使用を見てみましょう。Fixture は実際に pytest をカスタマイズして、ケースの前後の操作を実行します。まず、conftest.py ファイルを作成し (この名前を指定します)、pytest モジュールをインポートし、 pytest.fixture デコレータを使用します。デフォルトのレベルは: 関数レベル:
他のユース ケース ファイルから呼び出すこともできます。次のように関数を定義し、conftest.py ファイル内のログイン関数を継承して呼び出します。
# conftest.py配置需要注意以下点:
# conftest.py配置脚本名称是固定的,不能改名称
# conftest.py与运行的用例要在同一个pakage下,并且有__init__.py文件
# 不需要import导入 conftest.py,pytest用例会自动查找
import pytest
def test_one(login):
print("登陆后,操作111")
# def test_two():
# print("操作222")
#
# def test_three(login):
# print("登陆后,操作333")
操作結果:
3. 拡張使用法、複数のカスタム関数、およびグローバル レベルの表示: (トークンを取得するためのログインなどのグローバル、他のユース ケース モジュールは再度ログインする必要はありません)
import pytest
def test_one(login):
print("登陆后,操作111")
def test_two(login,open_page):
print("测试用例2")
def test_three(open_page):
print("测试用例3")
操作結果:
注意深い人は、プリセット設定がグローバル関数と同様に共有モードであるため、テスト ケース 2 ではログイン関数が呼び出されないことを知っておく必要があります。
パラメータ化は
、パラメータ化されたアプリケーション シナリオを区別します。シナリオのユース ケースでは、検証に複数のデータが使用されます。たとえば、ログイン機能では、ログインに正しいユーザー名とパスワードが使用され、間違ったユーザー名、正しいパスワード、正しいユーザー名とパスワードが使用されます。ユーザー名、間違ったパスワードなどがテストされますが、このとき、フレームワーク内のパラメータ化を使用すると、テストを簡単に完了できます。
パラメーター化はデータ駆動型の考え方です。つまり、複数のデータ テスト セットを 1 つのテスト ケースで実行でき、各データ セットは個別で独立しています。
単体テストのパラメータ化は実際には ddt であり、データ駆動型と呼ばれます。
Pytest データドライバーはパラメーター化されているため、@pytest.mark.parametrize を使用してください
1. まず、unittest がどのようにパラメータ化されるかを見てみましょう。
test_data = [1,2,3]
@ddt.ddt
class Testddt(unittest.TestCase):
@ddt.data(*test_data)
def test_001(self,get_data):
print(get_data)
if __name__ == '__main__':
unittest.main()
操作結果:
2.pytestでのパラメータ化の使用
テスト ケースの前に追加します:
@pytest.mark.parametrize("パラメータ名", list data)
パラメータ名: データの各項目を受け取り、テスト ケースのパラメータとして機能するために使用されます。
リストデータ: テストデータのセット。
@pytest.mark.parametrize("parameter1,parameter2",[(data1,data2),(data1,data2)])
例:
@pytest.mark.parametrize("a,b,c", [(1,3, 4),(10,35,45),(22.22,22.22,44.44)])
def test_add(a,b,c):
res = a +
bassert res == c
例:
@pytest.mark.parametrize('data',[1,2,3])
class Testddt(object):
def test_001(self,data):
print(data)
if __name__ == '__main__':
pytest.main(['-sv'])
操作結果:
要約する
上記は、unittest と pytest テスト フレームワークの違いです。主な 7 つの違いです。ここでは違いの 2 つの例を説明しました。他の 5 つは時間があれば追加します。Python 自動テストに興味のある友人は、ディスカッション用に下の小さなカード。ご意見をお聞かせください。
以下はサポート学習教材です。[ソフトウェア テスト] を行っている友人にとって、これは最も包括的で完全な準備倉庫となるはずです。この倉庫は、最も困難な旅にも同行してくれました。また、あなたのお役に立てれば幸いです。
ソフトウェアテストインタビューアプレット
何百万人もの人々が使用しているソフトウェア テストの質問バンクです。!!誰が知っているのか!!!インターネット上で最も包括的な面接テスト ミニ プログラムです。携帯電話を使用して質問に答えたり、地下鉄やバスに乗ったり、試験に参加したりすることができます。
次のインタビューの質問セクションをカバーします。
1. ソフトウェアテストの基礎理論、2. Web、アプリ、インターフェース機能テスト、3. ネットワーク、4. データベース、5. Linux
6. Web、アプリ、インターフェイスの自動化、7. パフォーマンス テスト、8. プログラミングの基本、9. 人事面接の質問、10. 公開テストの質問、11. セキュリティ テスト、12. コンピューターの基本
情報の入手方法: