Pikzie (unittesting extention module)
2009-03-04 - ⧖ 4.0 minPikzie
Pythonのユニットテスト用モジュールとしては、 標準モジュールの unittest モジュール、拡張モジュールの py.test 、 nose 等が有名です。
もうひとつ、日本語の記事をあまり見かけないのですが、 Pikzie ( Pikzie PyPI )1 という ユニットテスト用モジュールがあります。 テスト失敗時の出力結果の視認性を重視しているようで、 実際の使用感として、カラー表示と出力結果が見やすい点がかなり良いと感じました。2
インストール
pipで簡単にインストールできます。
$ pip install Pikzie
特徴
開発者の方(?)のBlogに unittest/nose/py.test等と比較しながら 特徴をまとめており、そのページが参考になります。
たしかにテストは失敗することの方が多く、そのテスト結果出力は 生産性にも大きく関わっているような気がします。開発者の方の目のつけどころが良いですね。 (実は、 pyunitdiff と pyrg も出発点はPikzieで、そこからRubyのZenTestとかを見て作ってみました。)
バグ?
たまたまMacの環境変数$TERMが"xterm-color"になっていたので気づいたのですが、 カラー表示できない(しない)場合にエラー終了する問題(?)を見つけました。
$ cat pik.py
import pikzie
class TestPik(pikzie.TestCase ):
def test_one(self ):
self.assert_equal (1, None)
$ python pik.py
F
1 ) Failure: TestPik.test_one: self.assert_equal(1, None)
pik.py:6: self.assert_equal(1, None)
expected: < 1>
but was: < None>
Finished in 0.002 seconds
1 test(s ), 0 assertion (s ), 1 failure(s ), 0 error (s ), 0 pending (s ), 0 notification (s )
$ export TERM="xtermz"
$ python pik.py
FPE..
1 ) Failure: FileCheckTest.test_invalhotshot: self.assert_equal(self.p2h.check_hotshot ("htt-version" ), True)
piktest.py:14: self.assert_equal(self.p2h.check_hotshot ("htt-version" ), True)
Error in atexit._run_exitfuncs:
Traceback (most recent call last):
File "/usr/lib/python2.5/atexit.py" , line 24, in _run_exitfuncs
func (*targs, **kargs)
File "/usr/lib/python2.5/site-packages/Pikzie-0.9.3-py2.5.egg/pikzie/tester.py" , line 81, in auto_test_run
sys.exit (Tester (target_modules =['__main__' ]).run ())
File "/usr/lib/python2.5/site-packages/Pikzie-0.9.3-py2.5.egg/pikzie/tester.py" , line 44, in run
context = runner.run(test, listeners)
File "/usr/lib/python2.5/site-packages/Pikzie-0.9.3-py2.5.egg/pikzie/ui/console.py" , line 88, in run
test.run (context )
File "/usr/lib/python2.5/site-packages/Pikzie-0.9.3-py2.5.egg/pikzie/core.py" , line 51, in run
context.on_finish_test_suite (self )
File "/usr/lib/python2.5/site-packages/Pikzie-0.9.3-py2.5.egg/pikzie/core.py" , line 578, in on_finish_test_suite
self._notify ("finish_test_suite" , test_suite)
File "/usr/lib/python2.5/site-packages/Pikzie-0.9.3-py2.5.egg/pikzie/core.py" , line 626, in _notify
getattr (listener, callback_name)(self, *args)
File "/usr/lib/python2.5/site-packages/Pikzie-0.9.3-py2.5.egg/pikzie/ui/console.py" , line 100, in on_finish_test_suite
self._print_faults (context )
File "/usr/lib/python2.5/site-packages/Pikzie-0.9.3-py2.5.egg/pikzie/ui/console.py" , line 219, in _print_faults
self._writeln (detail, self._fault_color(fault ))
File "/usr/lib/python2.5/site-packages/Pikzie-0.9.3-py2.5.egg/pikzie/ui/console.py" , line 201, in _writeln
self._write (arg, color, level)
File "/usr/lib/python2.5/site-packages/Pikzie-0.9.3-py2.5.egg/pikzie/ui/console.py" , line 193, in _write
self.output.write (arg )
TypeError: argument 1 must be string or read-only character buffer, not AssertionFailure
Error in sys.exitfunc:
Traceback (most recent call last):
File "/usr/lib/python2.5/atexit.py" , line 24, in _run_exitfuncs
func (*targs, **kargs)
File "/usr/lib/python2.5/site-packages/Pikzie-0.9.3-py2.5.egg/pikzie/tester.py" , line 81, in auto_test_run
sys.exit (Tester (target_modules =['__main__' ]).run ())
File "/usr/lib/python2.5/site-packages/Pikzie-0.9.3-py2.5.egg/pikzie/tester.py" , line 44, in run
context = runner.run(test, listeners)
File "/usr/lib/python2.5/site-packages/Pikzie-0.9.3-py2.5.egg/pikzie/ui/console.py" , line 88, in run
test.run (context )
File "/usr/lib/python2.5/site-packages/Pikzie-0.9.3-py2.5.egg/pikzie/core.py" , line 51, in run
context.on_finish_test_suite (self )
File "/usr/lib/python2.5/site-packages/Pikzie-0.9.3-py2.5.egg/pikzie/core.py" , line 578, in on_finish_test_suite
self._notify ("finish_test_suite" , test_suite)
File "/usr/lib/python2.5/site-packages/Pikzie-0.9.3-py2.5.egg/pikzie/core.py" , line 626, in _notify
getattr (listener, callback_name)(self, *args)
File "/usr/lib/python2.5/site-packages/Pikzie-0.9.3-py2.5.egg/pikzie/ui/console.py" , line 100, in on_finish_test_suite
self._print_faults (context )
File "/usr/lib/python2.5/site-packages/Pikzie-0.9.3-py2.5.egg/pikzie/ui/console.py" , line 219, in _print_faults
self._writeln (detail, self._fault_color(fault ))
File "/usr/lib/python2.5/site-packages/Pikzie-0.9.3-py2.5.egg/pikzie/ui/console.py" , line 201, in _writeln
self._write (arg, color, level)
File "/usr/lib/python2.5/site-packages/Pikzie-0.9.3-py2.5.egg/pikzie/ui/console.py" , line 193, in _write
self.output.write (arg )
TypeError: argument 1 must be string or read-only character buffer, not AssertionFailure
カラー表示時のみ文字列にエスケープ(?)しているので、 <type 'None'>とかをそのまま放り込んだ場合にエラー終了しているのではないでしょうか。 文字列に変換してあげれば大丈夫なような気がします。
pikzie/ui/console.py
186 def _write (self , arg , color = None , level = VERBOSE_LEVEL_NORMAL ):
187 if self .verbose_level < level :
188 return
189 if self .use_color and color :
190 arg = "%s%s%s" % (color .escape_sequence ,
191 arg ,
192 self .reset_color .escape_sequence )
193 self .output .write (arg )
194 self .output .flush ()
--- pikzie/ui/console.py.org 2009-02-22 19:47:01.000000000 +0900
+++ pikzie/ui/console.py 2009-03-04 10:49:43.000000000 +0900
@@ -190,6 +190,8 @@
arg = "%s%s%s" % (color.escape_sequence,
arg,
self.reset_color.escape_sequence)
+ else:
+ arg = "%s" % (arg)
self.output.write(arg)
self.output.flush()
最後に
テストの重要性は教科書に書いてあります。 すこしずつでもユニットテストを増やして、繰り返しテストを走らせて バグを一つでもなくすようにしたいですね。 その繰り返しの作業が少しでも楽になるように、ツール類を一度見直すのも 悪くないと思います。 Pikzieもその選択肢の中に入れてみてはどうでしょうか?
ではまた。