メインコンテンツへスキップ
  1. 第05講 関数(2/2; 関数の応用) /

assert文によるテスト

Assert 返り値 テスト
目次

テストとは
#

プログラムが期待通りに動いているかを確認するためには,実行してみて,実行結果が期待通りであるかを確認する必要があります. この確認作業のことを テスト(test) と呼びます. 間違いのないプログラムを作成するためには,非常に多くのテストを実施する必要がありますが,テストの実施には多大な時間と労力がかかります. そこで,プログラムのテストを自動化するために様々な方法が実施されています. ここではそのようなテスト手法の一つである assert 文を用いたテストについて学習します.

なお,テストを効率的に実施するためには,テストしたい範囲を関数として切り出し,関数の返り値が期待通りであるかを確認することが必要です.

例題. 足し算関数のテスト
#

2つの引数を受け取り,その和を返す関数 add を考えます. この関数 adder をテストするには,adder関数に適当な値を渡し,その値が期待通りであるかを確認する必要があります. 以下のようなプログラムで adder関数のテストを実施できます.

def adder(x, y):
    return x + y

assert adder(1, 2) == 3, "adder(1, 2) は 3 であるべき"
assert adder(3, 4) == 7, "adder(3, 4) は 7 であるべき"
assert adder(5, 6) == 11, "adder(5, 6) は 11 であるべき"
assert adder(-1, 1) == 0, "adder(-1, 1) は 0 であるべき"
assert adder(0, -1) == 0, "このテストは失敗する.0 + -1 は -1 であるが,0であるべきという間違ったテストである."

このように,adder の実引数に適当な値を指定して関数を呼び出します. そして,返り値が期待通りであるかを assert 文で確認します. assert文は,条件式が True であれば何もしませんが,False であれば AssertionError という例外を発生させます.

実行すると,以下のようになり,期待通り,一番最後のテストの失敗が確認できます.

Traceback (most recent call last):
  File "/Users/tamada/ksubpb/lesson05/adder_test.py", line 8, in <module>
    assert adder(0, -1) == 0, "このテストは失敗する.0 + -1 は -1 であるが,0であるべきという間違ったテストである."
           ^^^^^^^^^^^^^^^^^
AssertionError: このテストは失敗する.0 + -1 は -1 であるが,0であるべきという間違ったテストである.

テスタビリティ (testability; テストのしやすさ) プログラムを書くときにはテスタビリティを考慮することが必要です. テスタビリティをを高めるためには,関数を小さく,独立して,再利用可能なものにすることが重要です.

一方,print 文などによるプリントデバッグは古くからよく使われてきた手法ですが,assert文との相性は非常に悪いです. 一度print文を用いて出力した内容は,assert文で確認できません. そのため,print文で出力したい内容を関数で生成し,その関数の返り値を確認するようにすることが重要です.

assert
#

assert文は条件式が True であれば何もしませんが,Falseであれば,AssertionError という例外を発生させます. 上では,これを利用してテストを実施しています. これを仕込んでおくと,これまでうまくいっている部分が, 後からの変更でいつの間にか想定外の動作をしたときにいち早く気付くことができるようになります.

また,Pythonの実行時に assert 文を無効にすることもできます(-Oオプションを付けて実行すると assert文が無視される). そのため,処理を関数で切り出し,どんどん assert 文を追加していくことで,テストを効率的に実施することができます.