年中アイス

いろいろつらつら

動作確認は単体テストでやると気分が楽になるかもしれない

プログラム書く時に、動作確認はどうやっていますか?

動作確認は、一度だけ確認で済めばよいのですが、修正などで何回も手作業で確認していることは多いのではないでしょうか。その度にスクリプトを実行したり、インタラクティブツールで確認するのは面倒ですよね。

そこで提案したいのが、最初から単体テストツールを使っての動作確認です。これを使うと、何回も動作確認ができますし、終わったらテストが出来てる。

いわゆるテストファーストとは少し異なりますが、同じ動作確認なら、確認するメソッドや関数を書いたり消したりコメントアウトしたりするよりは、test_xxx()を書きましょう。

それでは、Pythonでロジック組む場合で例示して行きます。

  • your_logic.py

まずは、実装機能側
https://gist.github.com/reiki4040/6481563

# -*- coding:utf-8 -*-

def do_logic():
    # your logic
    return 'expect'
  • test_your_logic.py

こんな感じで単体テストを書く
https://gist.github.com/reiki4040/6481575

# -*- coding:utf-8 -*-
import unittest

import your_logic as logic

class LogicTest(unittest.TestCase):
    def test_logic(self):
        self.assertEquals('expect', logic.do_logic())

if __name__ == '__main__':
    unittest.main()
  • 動作確認する(テストを実行)
python test_your_logic.py
  • コード修正 or 次に作る確認用のテスト書く


作ってる中で、書き間違えてたりで何回も修正して動作確認し直すので、期待値書いて、動作確認はテストコードに任せるのが楽です。テストメソッド増やせば、いくつも動作確認できますしね。

修正前のテストは残した状態で、別のテストを書いて、実装を変えて行けば、もし戻す場合でも、前のテストはあるので、一回消してしまって再度書き直しみたいなことも減ります*1

これで、同じ動作確認をやってるだけで、少なくとも単機能ごとの正常系のテストが出来上がります。
加えて、単機能でテストしやすいようにメソッドや関数を分けたりする力もつくはず。

DB接続があるから。。。という場合でも、書いておけば、DB用意したら確認できるテストができます。
単体テストコードとして今後残すか残さないかは別にしても、作っている間の確認は、繰り返し行うことが出来ます。

ブログに書く時も、単体テストで説明内容が書いてあるページがたまにあって、動作確認するときに、テスト結果もわかるので便利です。ブログ書く人も、テストが通っていることで、間違った内容を書くことも減りますし*2

この変化だけでも、自分の書くコードの品質を比較的簡単に上げていくことが出来ると思います。*3

単体テストと意気込むと書かないかもしれませんが、動作確認はすると思うので、その段階から、テストコードに任せてしまいましょう。

*1:コードの戻しなどは、GitとかSCM使うことでも回避できます

*2:少なくとも、コードと期待値が一致することは確認できます。

*3:「さっきまでこう動いてたんだよ!」っていう残念な言葉は減ります。