wxpythonをTDDする
wxPythonとは
Pythonで作ったソフトにGUIをくっつけるものです。
Qtなどが競合となります。
TDDとは
テスト駆動開発(test-driven development)を指します。
型や関数の入出力を保証しながら開発ができます。
実装
準備: 開発環境
以下の環境での例を示します。
種類 | バージョン |
---|---|
OS | 泣く子も黙るWindows 10 |
Python | 3.6.6 |
wxPython | 4.0.6 |
準備: フォルダ構成
フォルダを以下のように作ります。dialogTextctrl.py
の方に、サンプルコードを書きます。
$ ls samples/{dialogTextctrl,__init__}.py
samples/__init__.py samples/dialogTextctrl.py
実装例
今回の実装例では、クラスとそのテストケースを
同じファイルに書きました。現実には、
クラスとそのテストケースは分けて書くことになると思います。
unittestについて、unittest.TestCase
を継承した
クラスを書きます。そのクラス内で定義されている
test_
で始まるメソッドを全てテストしていきます。
テスト時の出力が特定の値になるのかをチェックするので、
unittest.TestCase
拡張クラスでself.assertEqual(a,b)
や
self.assertTrue(val_boolean)
などを
test_
メソッドの末尾で呼んでテストの成否を決めます。
テストの前後に準備が必要な場合、unittest.TestCase
継承クラス内で
setUp(self)
やtearDown(self)
といったメソッドの定義も必要となります。
import wx
import unittest
class MyDialog(wx.Dialog):
def __init__(self):
wx.Dialog.__init__(self, None, -1, 'My Dialog', size=(200, 400))
self.components = [
wx.StaticText(self, wx.ID_ANY, "CONTENT TITLE"),
wx.TextCtrl(self, wx.ID_ANY, "INITIAL TEXT")
]
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.components[0], 1)
sizer.Add(self.components[1], 1)
self.SetSizer(sizer)
class TestMyDialog(unittest.TestCase):
def setUp(self):
self.app = wx.App()
self.dialog = MyDialog()
#result = self.dialog.ShowModal()
def test_n_components(self):
self.assertEqual(len(self.dialog.components), 2)
def tearDown(self):
self.dialog.Destroy()
if __name__ == '__main__':
unittest.main()
実行結果
python -m LIBRARY_NAME
というコマンドを実行すると
LIBRARY_NAME
というライブラリのmain関数を実行することになります。
unittest
の場合には続けざまに実行したいテストケースの
クラスを呼ぶことで、そのクラスだけをテストすることが可能です。
test_n_components
メソッドではMyDialogの要素components
が
いくつの要素を持つのかをチェックしています。
$ python -m unittest samples.dialogTextctrl.TestMyDialog
.
----------------------------------------------------------------------
Ran 1 test in 0.020s
OK
$ python samples/dialogTextctrl.py
.
----------------------------------------------------------------------
Ran 1 test in 0.019s
OK
まとめ
wxpythonでソフトウェア開発するさいの、
python標準実装のunittestを利用したTDDの例を
示しました。
テストの種類によってはdialog.ShowModal()
メソッドを
呼ばなくともテストが完了することが分かりました。