Diary?

2009-06-14
Sun

(23:09)

俺は今まで Python でテストを書くときは自前の簡易テスティングユーティリティを使っていたが、仕事ともなれば標準的なツールを使った方がよかろうと言うことで、 unittest モジュールを使い始めたが、久しぶりに使っただけあって変なミスをやらかした。

オフィシャルで紹介されている基礎的な例は当たり前だがきちんと動くんだが、次のようなテストを行うと "TypeError: 'str' object is not callable" というエラーがテストに全部パスしていても出力される。

from unittest import *
class SomeTest(TestCase):
    ...
if __name__ == '__main__':
    main() #これは unittest からインポートされた関数

一体これはどういう事なんだろうと思って首を捻ったが、そういや unittest の main 関数は unittest.TestProgram へのエイリアスで、こいつを引数なしで起動すると __main__ モジュールに読み込まれているシンボルを片っ端から走査してテストケースを見つけるんだった。つまり、 from unittest import * で読み込んだシンボルまでその対象となるので、余計なものが呼び出されるんだった。

from foo import * はなるべくやめた方がいいと言われているが、いや実際その通りだ。でも特にテストケースの場合、大量にインポートしないといけないものがあると使っちまうんだよなあ。

Creative Commons
この怪文書はクリエイティブ・コモンズ・ライセンスの元でライセンスされています。引用した文章など Kuwata Chikara に著作権のないものについては、それらの著作権保持者に帰属します。