初心者向け:PytestでAPIテスト自動化を実現!
Pythonには、多くのテスト自動化フレームワークがあります。その中でユーザーに多く利用されているのはPytestになります。本文では、PytestによるAPIテスト自動化の実現方法を皆さんに紹介します。
テストの自動化とは、ソフトウェア開発プロセスにおいて、テストケースの作成、実行、結果の評価などを人の介在なしに行うことを指します。通常、テストの自動化はテストスクリプトやテストフレームワークを使用して実現されます。
Pythonには、RobotFrameworkなど多くのテスト自動化フレームワークがあります。その中でユーザーに多く利用されているのはPytestになります。本文では、PytestによるAPIテスト自動化の実現方法を皆さんに紹介します。
![Python](https://assets.apidog.com/blog-learn/2023/06/python.png)
Pytestとは
そもそもPytestとはなんですか?pytestは、Pythonのテスト自動化フレームワークの一つです。pytestは、unittestよりも柔軟なテストスイートの作成が可能であり、Pythonの標準ライブラリとして提供されているため、追加のパッケージのインストールが必要ありません。
![Pytest](https://assets.apidog.com/blog-learn/2023/06/pytest.png)
Pytestの特徴
Pytestは多くのテスト担当者に利用されています。その原因だと、Pytestは非常に強力かつ柔軟なテストソリューションを提供しています。次は、PytestというPythonに基づいたテスト自動化のフレームワークの特徴について皆さんに紹介します。
- 簡潔な構文: pytestは簡潔で読みやすいテストコードの記述をサポートしています。テストケースは通常のPythonの関数として定義し、関数名は"test_"で始めることで自動的にテストケースとして認識されます。
- 自動ディスカバリ: pytestは、ディレクトリ内のテストファイルやテスト関数を自動的に検出し、実行対象のテストスイートを作成します。ディレクトリやファイルの命名規則に依存せず、自動的にテストを発見するため、柔軟なテスト構成が可能です。
- 豊富なアサーション: pytestは、Pythonの組み込みのアサーション文の他に、追加のアサーション機能を提供しています。これにより、テストケース内で期待される結果と実際の結果を比較し、テストの合格または失敗を判定することができます。
- パラメータ化テスト: pytestは、同じテストケースを複数のデータセットで実行するためのパラメータ化テストをサポートしています。これにより、異なる入力データでのテストを効率的に行うことができます。
- フィクスチャの使用: pytestはフィクスチャと呼ばれるテストの前後で実行されるセットアップおよびクリーンアップコードを提供します。フィクスチャを使用することで、共有のセットアップやテストデータの準備を簡単に行うことができます。
- 豊富なプラグインエコシステム: pytestは、拡張性を高めるための豊富なプラグインエコシステムを持っています。これにより、カバレッジレポート、テストケースのパラメータ化、モックの作成など、さまざまな追加機能を利用することができます。
pytestは非常に人気があり、広く使われているテストフレームワークの一つです。その柔軟性と使いやすさにより、Pythonプロジェクトのテスト自動化において頻繁に利用されています。
PythonでPytestを使用してテスト自動化を実現する方法
Pytestのインストール
Pytestを利用する前提として、PIPを使用して、Pytestをインストールすることです。
pip install -U pytest
インストールが環境すると、ターミナルで次のコマンドを入力して、バージョン号が表示される場合、インストールに成功したということになります。
pytest --version
Pytestのテストケースの仕様
テストファイル:テストファイルは、テスト対象のモジュールやパッケージと同じディレクトリ内に配置します。テストファイル名は、test_ で始まるか、_testで終わることが必要となります。Pytestが実行するとき、testが始まりか終わりのテストファイルを探し、これらのファイルをテストファイルとしてテストを行います。
テストクラス:テストクラスは、通常、"Test" で始まるクラス名を使用します。それに、クラス名にはinit関数が含まれることができません。そうしないと、ytestCollectionWarning: cannot collect test class 'TestXXX'エラーが発生します。
テストメソッド: テストメソッドは、通常、"test_" で始まる関数名を使用します。これにより、Pytestがテストメソッドとして認識し、実行します。テストメソッドは、テストケースごとに異なるアサーションや検証を実行するためのコードを含みます。
テストの実行中にアサーションを使用することは、Pytestにおいて非常に重要です。アサーションは、テスト結果の評価やテストケースの合格または失敗の判定に使用されます。Pytestは、Pythonの組み込みの assert
文をサポートしています。これにより、テスト中に予測される結果と実際の結果を比較し、テストの合格または失敗を判定することができます。
例:
pythonCopy code
def test_addition():
result = 2 + 2
assert result == 4
def test_subtraction():
result = 5 - 3
assert result == 2
この例では、2つのテスト関数が定義されています。それぞれの関数では、予測される結果と実際の結果を比較するために assert
文が使用されています。
コマンドの実装
pytest -k "クラス名"
pytest -k "メソッド名"
pytest -k "クラス名 and NOT メソッド名"
Pytestの実行
Pytestは多数の実行モードを提供しています。単一のモジュールのみを実行することもできますし、特定のモジュールの特定のメソッドのみを実行することもできます。
pytest ファイル名.py
pytest ファイル名.py::クラス名
pytest ファイル名.py::クラス名::メソッド名
例:テストのスクリプトを作成して、テストを行います。ここで名前がtestから始まる.pyファイルを作成する必要があります。
在一个test开头的py文件里面,编写一下脚本:
def setup_module():
print('\n setup_moduleのメソッド、一回のみ実行します、複数のテストクラスがある場合で使用されます。')
def teardown_module():
print('teardown_moduleのメソッド、一回のみ実行します、複数のテストクラスがある場合で使用されます。')
def teardown_module():
print('teardown_moduleのメソッド、一回のみ実行します、複数のテストクラスがある場合で使用されます。')
def setup_function():
print('setup_functionのメソッド、一回のみ実行します、複数のテストクラスがある場合で使用されます。')
def teardown_function():
print('teardown_functionのメソッド一回のみ実行します、複数のテストクラスがある場合で使用されます。')
def test_five():
print('test_fiveメソッドです')
def test_six():
print('test_sixメソッドです')
class TestPytest01:
def setup_class(self):
print('setup_class1のメソッドを使用')
def teardown_class(self):
print('teardown_class1のメソッドを使用')
def setup_method(self):
print('テストメソッドの前のsetup1操作を実装')
def teardown_method(self):
print('テストメソッドの後のteardown1操作を実装')
def test_one(self):
print('this is test_one method')
def test_two(self):
print('this is test_two method')
def setup(self):
print('setupメソッドです')
def teardown(self):
print('teardownメソッドです')
class TestPytest02:
def setup_class(self):
print('setup_class2メソッドを使用')
def teardown_class(self):
print('teardown_class2メソッドを使用')
def setup_method(self):
print('テストメソッドの前のsetup2操作を実装')
def teardown_method(self):
print('テストメソッドの後のteardown2操作を実装')
def test_three(self):
print('test_threeメソッドです')
def test_four(self):
print('test_fourメソッドです')
そして、Pytestを実行すると、結果を取得することができます。
テストケースの順をコントロール
"pytest-order"というプラグインを使用すると、テストケースの順序を制御することができます。テストケースの実行順序を指定するために、@pytest.mark.run(order=num)
というデコレータを使用します。
具体的には、以下の手順に従ってテストケースの順序を制御できます:
pytest-order
プラグインをインストールします。ターミナルで以下のコマンドを実行します:
cssCopy code
pip install pytest-order
テストケースを定義します。テストケースには、@pytest.mark.run(order=num)
デコレータを使用して、実行順序を指定します。num
は整数で、テストケースの実行順序を表します。数値が小さいほど優先度が高くなります。
pythonCopy code
import pytest
@pytest.mark.run(order=1)
def test_one():
assert 1 == 1
@pytest.mark.run(order=2)
def test_two():
assert 2 == 2
@pytest.mark.run(order=3)
def test_three():
assert 3 == 3
テストを実行します。以下のコマンドを実行すると、指定した順序でテストケースが実行されます。
Copy code
pytest
上記の例では、test_one
が最初に実行され、次にtest_two
、最後にtest_three
が実行されます。テストケースの順序を制御することで、特定のテストケースを他のテストケースよりも先に実行したり、依存関係を持つテストケースの実行順序を確保したりすることができます。
直感のUIでテスト自動化を実現するApidog
APIテストの自動化は、Pytestによって実現されることができます。が、テストスクリプトを完璧にサポートできるAPIテストツールを選択する必要があります。Apidogには、テスト自動化の機能が備えて、そのUIも日本語されたので、本文では、Apidogを利用して、このような操作をやり遂げる手順を紹介します。
リクエストの作成
Apidogは、前処理と後処理操作をサポートするので、それを使ってリクエストを作成すると、前/後処理の「カスタムScript」を利用して、テストスクリプトをカスタマイズすることができます。
![Apidogはテストスクリプトをサポート](https://assets.apidog.com/blog-ja/2023/05/apidog-custom-script.png)
Apidogのデフォルトスクリプトの言語は、JavaScriptです。
テストケースの作成
ここで自分でコードを入力することもできますし、Apidogが提供してくれるスクリプトを使用することもできます。
![Apidog内蔵のスクリプト](https://assets.apidog.com/blog-ja/2023/05/apidog-built-in-scripts.png)
例えば:
// ステータスコードが200であるかどうかを検証
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
// bodyにString型が含まれるかどうかを検証
pm.test("Body matches string", function () {
pm.expect(pm.response.text()).to.include("string_you_want_to_search");
});
// Body jsonの検証
pm.test("Your test name", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.value).to.eql(100);
});
// body のString型の検証
pm.test("Body is correct", function () {
pm.response.to.have.body("response_body_string");
});
// bodyを編集
pm.response.setBody({});
// headerにはcontent-typeが含まれるかどうかを検証
pm.test("Content-Type is present", function () {
pm.response.to.have.header("Content-Type");
});
// 応答時間が200ms以内であるかどうかを顕彰
pm.test("Response time is less than 200ms", function () {
pm.expect(pm.response.responseTime).to.be.below(200);
});
// postリクエストが成功かどうかを検証
pm.test("Successful POST request", function () {
pm.expect(pm.response.code).to.be.oneOf([201,202]);
});
ここで検証(アサーション)の条件を複数設定することもできます。
![Apidogで複数のスクリプトを条件に設定](https://assets.apidog.com/blog-ja/2023/05/assertion-condition.png)
例えば:ステータスコードが200、応答時間が200m秒未満といった2つの条件を設定します。
![アサーション結果の表示](https://assets.apidog.com/blog-ja/2023/05/assertion-results.png)
ここで単一のリクエストの検証が終わります。ここで「APICaseを保存」をクリックすると、それをテストケースとして保存することができます。
テストケースをグループ化してAPIテストの自動化を
Apidogは、APIのリクエストをグループ化にして、リクエストを一括送信してレスポンスを検証することにより、APIテストの自動化を簡単に実現することもできるので、作業時間と手間を大幅に節約できます。
ステップ⒈ プロジェクトを選択して、左側メニューから「自動テスト 」を選択して、「+」ボタンをクリックして、「新規テストケース」を選択します。
![Apidogで新規テストーケースを作成](https://assets.apidog.com/blog-ja/2023/04/apidog-test-1.png)
ステップ⒉テストのステップを追加します。APIのテストケースから、APIからインポートすることもできますし、カスタムRequestを追加することもできます。また、必要に応じて、グループ、繰り返し、条件分岐、待ち時間などの項目を設定することも可能です。
![テストステップの追加](https://assets.apidog.com/blog-ja/2023/04/apidog-test-3.png)
ステップ⒊ 右側のメニューでテストの設定項目を自分のニーズに応じてカスタマイズすることができます。
![テストの設定](https://assets.apidog.com/blog-ja/2023/04/apidog-test-4.png)
ステップ⒋ 設定が終わると、「実行」ボタンをクリックして、テストを開始します。テストプロセスが設定したテストステップを順番に行い、テストプロセスが終わると、詳細のテストレポートが生成され、各リクエストの詳細情報も確認できます。
![テストのレポートの取得](https://assets.apidog.com/blog-ja/2023/04/apidog-test-5.png)