2008年9月13日土曜日

Pyscripter で UnitTest と logging - 問題のあった行へジャンプ

PyScripter で UnitTest を自動で生成」の続き。

 

次の 4 つの仕組みがあるおかげで、プログラムを書くことができると言っても過言ではない。

  1. assert 文 でメソッドの事前条件をチェック。
  2. UnitTest でメソッドの結果をチェック。
  3. logging でおかしな値をログに出力。
  4. デバッガで動作を追う。

一画面に納まる程度のスクリプトなら大丈夫だけれど、それ以上になると、もうダメなすぐに忘れる脳みそ。 (+_+) 上記の仕組みを作ってくれた人に感謝・感謝。 ^人^ それプラス軽くて使いやすい IDE、 Pyscripter があるから Python でスクリプトを書く気になれる。

ポカミスなんて当り前。バグなく一発で動かせることなんて滅多にない。だから、逆に何もなく動いたときには、「本当はどこか間違っているんじゃないか」 (@_@;) と疑ってしまう。そんなバグとお友達な自分は、Pyscripter ・ logging において次のような設定と使い方をしている。

 

行番号の表示

まずは、ソースコードにおいて行番号が表示されるようにする。エラーがでたときには、ファイル名と行番号が出力されるので、行番号が表示されていた方が使いやすい。また、ちょっとだけ現在編集している場所から離れるときに、行番号を見て覚えておけば、元の場所に戻りやすい。

方法は、ツールバーのボタンで、行番号の表示・非表示を切り替える。以下のボタンが表示されてないときは、View > Toolbars >Editor Toolbar をチェックする。

080913-002

 

または、次のように設定できる。

  1. メニューより 「Tools > Options > Editor Options
  2. Display タブ > Gutter の `Show line numbers' をチェックする。

 080913-001

 

UnitTest で問題が発生した場所へジャンプ

UnitTest を実行し、失敗またエラーがあった場合、ファイルのどの位置で発生したかについて、画面下部の Python Interpreter ペインに赤字で表示される。このとき、行番号が書かれている行でダブルクリックをすると、その位置へジャンプしてくれる。

080913-004

 

出力が一杯になって見にくくなったら、Python Interpreter ペインの中で、すべて選択 (Ctrl + A)、 Delete 。

 

ログの出力行へジャンプ

ログの出力の方法については、6.29.2 基本的な使い方を参照。 (cf. Google App Engine (Python) でログを出力 )

ログの設定を次のようにしておく。

    logging.basicConfig(level=logging.DEBUG,
        format='%(asctime)s %(levelname)s ' + \
               '"%(pathname)s", line %(lineno)d, %(message)s')

ログの出力フォーマットについては、6.29.6 Formatter オブジェクトを参照。

 

例えば次のログ出力、

logging.debug(u"こんにちは、バグです!")

の結果は、

2008-09-13 11:40:37,125 DEBUG "c:\develop\src\python\liquorchecksimple\liquortest.py", line 174, こんにちは、バグです!

Pyscripter の Python Interpreter ペインで、出力された行をクリックすると、その場所へジャンプしてくれる。上記のように書式を設定した理由は、UnitTest の出力を真似すれば Pyscripter がその行へジャンプしてくれるかと思って。

 

テンプレート
import logging



if __name__ == '__main__':
    logging.basicConfig(level=logging.DEBUG,
        format='%(asctime)s %(levelname)s ' + \
               '"%(pathname)s", line %(lineno)d, %(message)s')
    logging.getLogger().setLevel(logging.DEBUG)