プログラミングをする上でのテストには、いろいろな考え方がありますが、フェーズ(時期)の区切りで単体テスト、統合テストという概念があります。 そして、テストの入出力(内容)に注目してホワイトボックステストやブラックボックステストという考え方があります。 後はだいたいそのバリエーションで、フェーズによって役割りが変化しますが、テストの目的は常に対象がその時期で必要とされている状態にあるか確認するもので、テストの方法自体にはそれほど違いはありません。
最終的な統合テストは必要ですが、比較的規模の小さいプログラミングでは、開発しながら行なう単体テスト+ホワイトボックステストの役割が大きいと思います。 少なくとも設計した本人は部品がどのような形で使われるのか把握していますから、テストを短い間隔で網羅的に実行できれば効率が高まると考えられます。
そんな概念を土台にするとGUI系のプログラミングでは、自動化できるテスト範囲は非常に限られています。 とはいえIronPythonでは動的に内部状態にアクセスできますから、特別なツールを使わなくても確認できる範囲は静的な言語と比べれば広いといえます。
今回はプロパティが正しければ表示は正しく行なえているはず、という立場を取り、プロパティをチェックする方向で自動化を行なってみました。 そのため実際に画面に部品を表示させる事は行なっていません。
IronPython 2.6に標準に添付されているCPythonのunittest.pyファイル(C:\IronPython26\Lib\unittest.py)を使いました。
# coding=Shift_JIS # @author: YasuhiroABE <yasu@yasundial.org> # import unittest import a07_lib from a07_lib.mylib import * import System class MyTestCase(unittest.TestCase): def setUp(self): self.formtitle = "Hello World" self.form = MyForm(self.formtitle) self.layout = MyFlowLayoutPanel() self.tooltip = a07_lib.mylib.MyToolTip() def test_formtitle(self): self.assertEqual(self.form.Text, self.formtitle) def test_formwidth(self): self.assertEqual(self.form.Size.Width, 300) def test_layoutwidth(self): self.assertEqual(self.layout.Size.Width, 300) def test_formheight(self): self.assertEqual(self.form.Size.Height, 200) def test_layoutheight(self): self.assertEqual(self.layout.Size.Height, 200) def test_layoutdockstyle(self): self.assertEqual(self.layout.Dock, System.Windows.Forms.DockStyle.Fill) def test_layoutscroll(self): self.assertTrue(self.layout.AutoScroll) def test_tooltippopdelay(self): self.assertEqual(self.tooltip.AutoPopDelay, 5000) def test_tooltipinitdelay(self): self.assertEqual(self.tooltip.InitialDelay, 1000) def test_tooltipreshowdelay(self): self.assertEqual(self.tooltip.ReshowDelay, 500) def test_tooltipshowalways(self): self.assertTrue(self.tooltip.ShowAlways) unittest.main()
実行結果は次のようになります。
C:\IronPython26\proj.class>..\ipy a07_unittest.ipy ........... ---------------------------------------------------------------------- Ran 11 tests in 0.531s OK
このスクリプトは"a07_lib.mylib"からimportするように宣言する事で、__init__.pyの中の__all__行を無視するようにしています。 しかし"mylib.py"の中にある__all__行を参照するため、"MyToolTip"クラスにはアクセスできません。
そこで__all__行で公開していないMyToolTipクラスにアクセスするために、フルネーム(完全修飾名)でアクセスしています。
... import a07_lib ... self.tooltip = a07_lib.mylib.MyToolTip() ...
作成したスクリプトは最後のunittest.main()
によって、そのまま実行することができます。
これまで作成してきたスクリプトはそれなりの規模になってきました。 次章ではいろいろまとめてみようと思います。
Created: 2010-03-13, Last modified: 2010-03-19
www.yasundial.org by Yasuhiro ABE is licensed under a Creative Commons Attribution 2.1 Japan License. Permissions beyond the scope of this license may be available at http://www.yasundial.org/info/license.html.