テストとは #
プログラムが期待通りに動いているかを確認するためには,実行してみて,実行結果が期待通りであるかを確認する必要があります.
この確認作業のことを テスト(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 文を追加していくことで,テストを効率的に実施することができます.