AssertionError: expected X but got Y

Last Updated on 2025年7月28日

概要

Pythonの開発中に頻繁に遭遇するエラーのひとつが AssertionError: expected X but got Y です。
このエラーは、主にテストやデバッグ目的で使われる assert 文で、期待された値と実際の値が異なる場合に発生します。
特にユニットテストやCI環境での自動検証においてよく見られるエラーです。
この記事では、このエラーの仕組みと原因、そして解決方法について詳細に解説します。

目次

  1. エラー内容
  2. 原因
  3. 対処法
  4. 補足
  5. まとめ

エラー内容

以下のようなエラーが表示されることがあります。

このエラーは、開発者が「ある条件が必ず真であるべき」として書いた assert 文に違反する事象が発生したことを示します。
具体的には、以下のようなコードで発生します。

この場合、add(1, 2) は3を返すため、assert result == 5 は失敗し、
AssertionError: expected 5 but got 3 というエラーになります。

原因

このエラーの原因は主に以下の2つです。

  1. 期待値(expected)と実測値(actual)の不一致
    テスト対象のコードが想定とは異なる挙動をした場合。
  2. テストケースの誤り
    テストの書き方や論理にミスがある可能性。

例えば、以下のようなテストコードでエラーが発生したとします。

この場合、実際には6が返されるため、テストの期待値が間違っています。

対処法

このエラーに対処するには、まずどちらにミスがあるかを確認する必要があります。

1. 実装コードを見直す

  • 期待される値を返すようにロジックを修正
  • 例えば、ロジックに誤りがある場合は以下のように修正

2. テストコードを見直す

  • テストの期待値が誤っていることも多いです。
  • ドキュメントや仕様書と照らし合わせて確認します。

3. assertの使い方を再検討する

本番コードで assert を使用するのは推奨されません。
理由は、Pythonを-O(最適化)オプションで実行するとassert文が無効になるためです。
テストや検証用のコードに限定するのが安全です。

補足

テストフレームワークとの関係

unittestpytest といったフレームワークを使う場合、assert文は重要な役割を果たします。
pytest では、assert文の失敗時に自動的に期待値と実測値を分かりやすく出力してくれるため、デバッグが容易になります。

より良いメッセージの書き方

エラーメッセージは読みやすく、トラブルの原因を把握しやすいように書くことが望ましいです。

複数ケースのテスト例

以下はpytestで複数ケースを一気にテストする例です。

まとめ

  • AssertionError: expected X but got Y は、期待した値と実際の値が一致しないときに発生する。
  • 原因はコードロジックのバグ、またはテストのミスであることが多い。
  • assert文の使用はテストや開発段階に限定するのが望ましい。
  • エラー発生時は、ログや引数などの情報を追加してデバッグを助けるメッセージを書くと良い。

Pythonでの開発では、テストコードと実装コードの両方を常に見直しながら進めることで、AssertionErrorを早期に解決できます。