search
LoginSignup
268
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

[Python] assert文で超お手軽テスト

assert文とは

条件式がTrueではない時に、例外を投げます。
これを仕込んでおくと、それまでちゃんと動いていたコードが、いじっているうちにいつの間にか想定と異なる振る舞いをするようになった時に、いち早く気づくことが出来ます。「とにかく想定と違ったら止める」というだけで良いなら、別途テストを書かなくていいので便利です。
機械学習やデータ分析 では、仕様が決まっておらず試行錯誤しなければいけない部分が多くあるし、アドホックな対応も結構あり、テストを書くことが必ずしもなじまない場合が多いと思います。このような領域では、特におすすめしたいです。
pytestなどのちゃんとしたテスト用途以外では、asset文はJupyter Notebookで使うのが一番効果的だと個人的には思います。関数のセルの下に、assert文でちょっとしたテストを書いておくと便利です。また、データを読み込んだ直後にデータチェックをしたり、データの結合や更新などの処理の後に、重複や欠損のチェックを入れたりするのも良いでしょう。データ分析時点ではデータ内容はガチガチに固められていなくて、はじめから、あるいは処理の結果想定外の内容になっていることは十分ありえます。

使い方

構文は以下のとおりです。

assert 条件式, 条件式がFalseの場合に出力するメッセージ

条件式が False の場合、AssertionError の例外が発生します。
条件式が True の場合は何も起こりません。

>>> kitai = 100
>>> input = 1
>>> assert kitai == input, '期待する値[{0}], 入力値[{1}]'.format(kitai, input)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError: 期待する値[100], 入力値[1]

ちゃんと例外を処理するならこんな感じ。

>>> try:
...     kitai = 100
...     input = 1
...     assert kitai == input, '期待する値[{0}], 入力値[{1}]'.format(kitai, input)
... except AssertionError as err:
...     print('AssertionError :', err)
... 

AssertionError : 期待する値[100], 入力値[1]

assert文を無効にする

assert文は、組み込み定数__debug__Trueの時のみ実行されます。特に何もしなければこの状態です。
Pythonスクリプト実行時のコマンドラインオプションに-Oをつけると、__debug__Falseになり、assert文が無効になります。

参考

Python3.6 公式ドキュメント
- 7.3. assert
- 3. 組み込み定数 __debug__
- 1. コマンドラインと環境 -O オプション

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
268
Help us understand the problem. What are the problem?