どうもこんには。
コンです。
今更なのですが普段私は工場で使うアプリをPythonで作ったりして
工場で運用をさせてもらっております。
この時に重要なのが、書いたプログラムが予期せぬ動きをしないかをしっかりチェックすることです。
職場で使うプログラムが予期せぬ動きをしたら、使っている人が困ってしまいますよね。
ただこの「しっかりチェック」というのがまた難しいです。
どうしたらいいか分からないですし、正解を出す方法以外分からなかったりで
プログラムの動作確認も技術が必要です。
そんな時に必要なのがTDD(テスト駆動開発)という考え方です。
今回はそのテスト駆動の始め方について書かせていただきます。
TDD(テスト駆動開発)とは
小難しく書いているのですが、やっていることはシンプルで
関数やクラスを書く際に、事前に値を予測してから、実際に関数を実行し出力した値とを比較し
実際の出力値==予測値、になるかを確かめていく手法です。
その際に大事なのは以下のサイクルで行うというルールを守っていくというところです。
- 失敗するテストを書く
- テストを実行して失敗を確認
- テストを成功させる最低限の実装したい関数を書く
- テストを実行し成功を確認する
- さらに別のテストを実行し失敗し、また成功させるように関数を書き直す
この失敗するテストを実行し、書き直しの繰り返しでコードを書いていくことがTDDになります。
実際にやってみる
今回はシンプルなお題として
引数をもらったら引数を2倍にして返す関数を実装するケースとします。
①失敗するテストを書く&②テストを実行し
最初は、失敗するコードを書きます。
ここで大切なことは、エラーではなく間違った結果をかえさないかを確認することです。
お題の関数の名前をdoubleとして、1を引数として与えたら
2が帰ってくるかを確かめます。
最初はなにも返り値に設定しないことが多いです。
以下のようなコードを書いていきます。
#テスト用の関数
def test(actural, expected):
if actural == expected:
print('Test OK')
else:
print('Test NG')
print('actual,', actural)
print('expected,', expected)
#配列の中身を2倍にする関数を開発する。
def double(x):
#最初はそのまま返すだけ
return x
#テストを実行する
test(double(1), 2)
'''
こんな結果が返ってきます。
Test NG
actual, 1
expected, 2
'''
とても大袈裟にエラーを出力していますが、実際このようにまずエラーを吐き出します。
③テストを成功させる最低限の実装したい関数を書く&④成功を確認する
今度はテストを成功させます。
ここで重要なのは、最低限の変更でテストをクリアすることです。
#テスト用の関数
def test(actural, expected):
if actural == expected:
print('Test OK')
else:
print('Test NG')
print('actual,', actural)
print('expected,', expected)
#配列の中身を2倍にする関数を開発する。
def double(x):
return 2
#テストを実行する
test(double(1), 2)
'''
次は成功の結果が返ってきます。
Test OK
'''
こんな返り値に予測を書くようなやり方でいいのか???
みたいに最初は思ったのですが、最初は本当に最低限の実装をしていきます。
⑤さらに別のテストを実行し失敗し、また成功させるように関数を書き直す
1個目のテストはクリアしたので、次のテストを行います。
さっきはdouble(1)=2をしっかり出力できたので、次はdouble(2)=4を出力できるかを
確認します。
#テスト用の関数
def test(actural, expected):
if actural == expected:
print('Test OK')
else:
print('Test NG')
print('actual,', actural)
print('expected,', expected)
#配列の中身を2倍にする関数を開発する。
def double(x):
return 2
test(double(1), 2)
#新たなテスト
test(double(2), 4)
'''
次は1つは成功もう1つは失敗
Test OK
Test NG
actual, 2
expected, 4
'''
1つめのテストはOKですけど
2つめはNGですよね。
次はこれをクリアするように関数を書き換えて。。。
というのを繰り返すのがTDDになります。
おわりに
ここまで読んでいただき、ありがとうございます。
8年もPythonでプログラミングをしていても
未だに、もっとテストしておけばよかったと思うことも多いです。
あまりプログラミングを誰かから教わる機会がなかったので
しっかり基本からTDDをまた誰かに教えていただきたいなと思う今日この頃。