xlUnitを使ってVBAでTDDする

ブログ書くのが久々過ぎてWordpressの使い方を忘れてました(汗) 今やってるプロジェクトがなかなかハードであらゆるSNSで愚痴ってましたが、一段落したので色々と勉強したいことを進めてます。今日はテスト回りについて。

xlUnitというVBA上でTDD出来るアドオンというものが存在します。最近(と言っても2008年に作られて2010年まで更新されている)出てきたもののようです。

動画は元より、日本語の解説は大変参考になりました。

まだAssertEqualぐらいを連ねて試したぐらいですが、良い感じです。今やってるプロジェクトに早速取り取り込んでテスト環境を良くして行きたい。

以降、気になったところのメモなど

前提

例えば、xlUnit側でNew Applicationで作成した「newTestableApplication」というプロジェクトを用意した上での話。
環境はWindows 8, Excel 2010です。アドインはこれ以外入ってないと思った。

テストしたいクラスを作ったら、そのたびにFactoryモジュールに対象クラスをインスタンス化して戻す関数を書く

例えば普通に「Class1」というモジュールを作ります。div2という関数を作るとこうなります。

[vb]
Option Explicit
' Class1 Class Module
Public Function div2(a, b)
div2 = 10
End Function
[/vb]

それをテスト側のプロジェクトで呼び出したい時。対象プロジェクトのFactoryクラスに以下のように足します。

[vb]
Option Explicit
Public Function New_Class1() As Class1
Set New_Class1 = New Class1
End Function
[/vb]

書き終えたら、テスト側のテスト用クラスモジュールで「New_Class1」を呼び出せば良いです。

[vb]
Private Sub TestCase_Run(R As TestReport)
Set mR = R
' Your tests start here
mR.AssertEqual 20, newTestableApplication.Factory.New_Class1.div2(20, 2)
mR.AssertEqual 0, newTestableApplication.Factory.New_Class1.div2(20, 20)
' mR kill
Set mR = Nothing
End Sub
[/vb]

単にインスタンス化したクラスを戻り値として返すだけの関数を書くだけっぽいです。

Factory側に呼び出した後の操作をするなどは宜しくないと思います。せっかくテスト側のSetupとかが無駄になりますしテスト側での管理が出来ませんし。

ここは自動で生成出来るようになってほしいなあ。出来るのかな?

クラスモジュールではなく標準モジュール内のFunctionをテストしたい

「newTestableApplication」内の標準モジュール「testmod」を呼び出したい時

例えばtestmodにadd3というFunctionがある場合。newTestableApplication.testmod.add3 と普通に呼び出せばいいです。いいか悪いかはともかくそれで出来ます。

面倒なのでadd3のコードは書きませんが単に3つの整数な引数を足し算しただけです。

[vb]
Private Sub TestCase_Run(R As TestReport)
Set mR = R
' Your tests start here
mR.AssertEqual 15, newTestableApplication.testmod.add3(5, 5, 5), "result:15, add 5+5+5 "
mR.AssertEqual 30, newTestableApplication.testmod.add3(10, 10, 10), "result:30, add 5+5+5 "
' mR kill
Set mR = Nothing
End Sub
[/vb]

https://twitter.com/hrs_sano645/status/347608591378837504

subプロシージャをテストしたい場合とかはどうするんだろ。subした後の結果を返すFunctionを書いて置く必要があったり、そもそもsubは使わないという方針が必要かもしれません。

感想

そういえば、テストプロジェクト側にもFactoryクラスがあって、テストケース(クラスモジュール)をインスタンス化してましたね。テストケースを増やしたらここに書く必要があるのかもしれません。

といっても、xlUnitのメニューからテストケースを作成出来るようなのですが、自分の環境(Excel 2010)だとどうしても実行時エラーが起こってしまい諦めてます。

それと、既存のプロジェクトへ取り込む場合は一体何をすればいいか考えてますが(やれよw)、クラスモジュールのFactoryを作って対象クラスを追加すれば良いだけかな?

最初は敷居が高さそうに思ってましたが、テスト対象側に入れるものは最小限のようですし、アドインとしてリボンメニューから呼び出せますし、使い勝手は良さそう。

いずれは継続的CIもしてみたいです。OLE?経由でExcelを呼び出して実行して、セルの値を持ってこれればと参考元のブログの方と同じことを考えてたりしてます。

追記 2013/06/20 23:22

Excel 2010(多分2007や2013でも?)「次の機能はマクロなしのブックに保存できません」VBプロジェクト... といったダイアログが出てきて、作ったテストコードが消えてしまう

Excel 2010でxlUnitのNew Applicationを実行してファイルを作ったり、テスト用のファイルなどを上書き保存しようとすると、上のダイアログが出てくる件ですが、これはxlsで保存している筈なのになぜか中身がxlsxで保存されているよく分からない仕様で起こってしまいます。(xlUnitが利用しているFSOオブジェクトが悪いのかよくわかってません)
これではテストコードなど全部消えてしまうので意味がありません。

回避策としては、一度テスト用のファイルたちを作ってしまい(ダイアログはとりあえず「はい」で通す)、このファイルたちは最初に"名前をつけて保存"を行えば正しいxlsファイルとして保存してくれます。(もしくはxlsmで保存しても動くと思われますが確認してません)

About Me

買ったり作ったり考えたり試したの日々の記録です