PyCharm 単体テスト
単体テストはコード品質を保証する基本的な手段であり、プログラム内の最小のテスト可能ユニットの動作が期待どおりであるかを検証します。
PyCharm で単体テストを作成・実行するのは非常に便利で、IDE はテストの作成から実行、結果分析に至るまでの完全なワークフローを提供します。
PyCharm には主要な Python テストフレームワークが3つ組み込まれています:unittest、pytestとnose。
テスト例の作成
次に、完全な例を通して PyCharm で単体テストを作成する方法を説明します。
まず、シンプルなCarクラスを作成し、そのテストケースを記述します。
テスト対象コード:car.py
例
class Car:
"""自動車クラスをシミュレートし、加速とブレーキ機能を提供します。"""
def __init__(self, make="サンプル", model="サンプル-X1"):
# 自動車のブランドとモデルを初期化
self.make = make
self.model = model
# 初期速度は 0
self.speed = 0
def accelerate(self, increment):
"""加速メソッド
パラメータ:
increment: 速度の増加量。正の整数である必要があります
戻り値:
加速後の現在の速度
例外:
ValueError: increment が負数またはゼロの場合に送出されます
"""
if increment <= 0:
raise ValueError("加速増分は正の数でなければなりません")
self.speed += increment
return self.speed
def brake(self, decrement):
"""ブレーキメソッド
パラメータ:
decrement: 減速量。正の整数である必要があります
戻り値:
ブレーキ後の現在の速度。最低 0
例外:
ValueError: decrement が負数またはゼロの場合に送出されます
"""
if decrement <= 0:
raise ValueError("減速量は正の数でなければなりません")
self.speed = max(0, self.speed - decrement)
return self.speed
テストコード:test_car.py
例
# unittest フレームワークを使用してテストケースを作成
import unittest
from car import Car
class TestCar(unittest.TestCase):
"""Car クラスのテストスイート"""
def setUp(self):
"""各テストメソッドの実行前に setUp が呼び出され、新しい Car インスタンスを作成します"""
self.car = Car()
def test_initial_speed(self):
"""初期速度が 0 かどうかをテスト"""
self.assertEqual(self.car.speed, 0,
"新車の初期速度は 0 になるはずです")
def test_accelerate_normal(self):
"""通常の加速シナリオをテスト"""
# 加速: 50
result = self.car.accelerate(50)
# 戻り値を確認
self.assertEqual(result, 50,
"加速後の速度は 50 になるはずです")
# オブジェクトの状態を確認
self.assertEqual(self.car.speed, 50,
"car.speed 属性は 50 に更新されているはずです")
def test_accelerate_multiple_times(self):
"""複数回加速した場合の累積効果をテスト"""
# 1回目の加速: 30
self.car.accelerate(30)
# 2回目の加速: 20
result = self.car.accelerate(20)
# 合計速度は 50 になるはず
self.assertEqual(result, 50,
"2回の加速後の速度は 50 になるはずです")
def test_accelerate_with_zero(self):
"""加速増分が 0 の場合に例外が送出されることをテスト"""
with self.assertRaises(ValueError,
msg="加速増分が 0 の場合は ValueError が送出されるはず"):
self.car.accelerate(0)
def test_accelerate_negative(self):
"""加速増分が負数の場合に例外が送出されることをテスト"""
with self.assertRaises(ValueError,
msg="加速増分が負数の場合は ValueError が送出されるはず"):
self.car.accelerate(-10)
def test_brake_normal(self):
"""通常のブレーキシナリオをテスト"""
# まず 80 まで加速
self.car.accelerate(80)
# ブレーキ: 30
result = self.car.brake(30)
# 速度を確認
self.assertEqual(result, 50,
"ブレーキ後の速度は 50 になるはずです")
def test_brake_below_zero(self):
"""ブレーキで速度が 0 未満にならないことをテスト"""
# まず 20 まで加速
self.car.accelerate(20)
# ブレーキ: 50。速度は 0 に制限されるはず
result = self.car.brake(50)
self.assertEqual(result, 0,
"速度は 0 未満になるべきではない")
def test_brake_with_zero(self):
"""減速量が 0 の場合に例外が送出されることをテスト"""
with self.assertRaises(ValueError,
msg="減速量が 0 の場合は ValueError が送出されるはず"):
self.car.brake(0)
# スクリプトが直接実行されたときにテストを実行
if __name__ == "__main__":
unittest.main()

PyCharm はテストクラスとテストメソッドを自動的に認識できます。テストクラス名はTestで始まり、テストメソッド名はtest_で始まるのが Python テストの命名規則です。
テストを実行
テストコードを作成したら、テストを実行するには複数の方法があります。
方法1:緑色の実行アイコンをクリック
PyCharm はテストクラスと各テストメソッドの左側のガター領域に緑色の実行アイコン。
クラス名の横にある緑色のアイコンをクリックするとそのクラスのすべてのテストを実行でき、メソッドの横にあるアイコンをクリックすると単一のテストのみ実行できます。
テストファイルを右クリックして、メニューから選択することもできます。Run 'test_car'。
方法2:ショートカットキーを使用
カーソルをテストクラスまたはテストメソッド内に置き、Ctrl + Shift + F10押すと現在のテストを実行できます。
テスト結果を確認
テストの実行が完了すると、PyCharm は下部のRunツールウィンドウにツリー表示でテスト結果を表示します。
成功したテストは緑色のチェックマーク、失敗したテストは赤色のバツ印でマークされ、詳細なエラー情報とスタックトレースも表示されます。
失敗したテスト項目をクリックすると、PyCharm はエラーが発生したコード行に直接ジャンプするため、問題をすばやく特定できます。
テストフレームワークの切り替え
PyCharm はデフォルトでunittestをテストランナーとして使用しますが、他のフレームワークに簡単に切り替えることができます。
設定手順
- 開く設定(ショートカットキー Ctrl + Alt + S、macOS は Command + ,)。
- 移動して、 Python。
- に統合ツール領域にあるテストドロップダウンメニューから
- からUnittests、pytest、Nosetests必要なフレームワークを選択します。
- クリックしてOK設定を保存します。

テストランナーとして pytest を選択する場合は、必ずpip install pytestpytest パッケージがインストールされていることを確認してください。
テスト駆動開発のアドバイス
単体テストは既存コードの検証だけでなく、テスト駆動開発(TDD)の中核となる実践です。
推奨される開発フローは、最初にテストケースを書き、次に実装コードを書き、最後にテストで検証することです。
テストを書く習慣を身につければ、コード品質は大幅に向上します。
その他の拡張