miauのブログ

はてなダイアリー「miauの避難所」をはてなブログに移行しました

VBA のユニットテスト

ちょっと Excel VBAユニットテストしたくなったので、どんなツール/ライブラリがあるか調べてみました。

(2014/12/10 追記)
以下のページのほうが情報が多い&新しいので、こちらを見ていただいたほうがよさそうです。

(2014/12/10 追記ここまで)

VBAUnit

xUnit っぽく作ってあるらしいです。

問題はプロジェクトにテスト用のクラスを大量に読み込まないといけないこと。

こんな感じで、実際にテストしたいクラスがどこにいるかわからなくなってしまいそうです。

また、VB Lite Unit で指摘されているように、テスト対象のメソッドを列記するのが面倒そうです。

VB Lite Unit

こちらは regsvr32 で ActiveX コンポーネントを登録して利用する形。VBAUnit みたいにプロジェクトを汚さなくていいです。また、

This simple, solid design works well in VB/VBA, doesn't attempt introspection, and doesn't require lists of test methods outside of the test code.

とのことで、テストケースの一覧を書かなくてもいいとのことです。(一つのメソッドにごっちゃりテストを書く方針だからなんですけどね・・・。)

あと GUI で色つきで結果が出るのでわかりやすい気がします。

欠点は、使い方がわかりにくいことですね。このブログ見てようやくわかりました。

イミディエイトウィンドウでクラスを New して実行と・・・。確かによく見るとプロジェクトページでもイミディエイトウィンドウに書いてあるけど、Readme 読んだだけではわかりませんでした・・・。(追記: 適当な Public Sub を作ってそこから同じように呼び出しても大丈夫だと思います。念のため。)

Excel で試しに実行したい場合は上記ブログを参考にインストールした後、

  • 適当にワークブックを作る
  • 参照設定で VbLiteUnit を有効にする
  • vb-lite-unit-1.2.5-demo-txt.zip 中に含まれる .cls と全部取り込む(プロジェクトエクスプローラD&D
  • イミディエイトウィンドウで以下を実行する
RunTests New tclsTestClauseText

というような手順で試せると思います。(ちなみに vb-lite-unit-1.2.5-demo-a2k.zip は Access 2000 用のデモみたいです。)

Visual Basic Editor のイメージはこんな。

VBAUnit に比べるとプロジェクトがすっきりしてる&実行の仕組みがシンプルなのがわかると思います。

xlUnit

で公開されている比較的新しいツールのようです。

ドキュメントがあまり無いんですけど、

に解説動画が上がっているので、これを見るとよさそうです。

動画の内容を適当に差し込みつつ説明すると以下のような感じ。

  • xlUnit はアドインで導入する形
    • %APPDATA%\Microsoft\AddIns に置いてから、アドインを有効化すると xlUnit メニューが追加される
    • 「ツール」→「マクロ」→「セキュリティ」→「信頼できる発行元」→「Visual Basic プロジェクトへのアクセスを信頼する」にする必要があるとかなんとか
  • テスト対象のクラスがあるワークブックとは別にテスト用の別の workbook を作る形
  • xlUnit メニューからもろもろ操作を行う
    • テスト対象となるアプリケーションとテスト用のワークブックを作る
    • テスト対象となるクラスを追加する
  • テストコードの雛形ができるので、TestCase_Run に mR.AssertXxxxx を使ってテストを書く
    • この際テスト対象のオブジェクトはテスト対象アプリケーションの Factory 経由で取得する(ちゃんと理解してないけど、こうしないとエラーになる)
  • Alt+F8 で doTests を実行すると TestReport シートに結果が出力される

Visual Basic Editor でのイメージはこんな感じです。

xUnit に近くて悪くないんじゃないかと。

ちなみにマクロを使ってテスト対象&テストのワークブックをセットで作るのが基本的な使い方みたいで、既存の Excel VBA のテストをしようとしたんですけど、結局うまくいきませんでした。(やりようはあるだろうけど時間切れ)

あと LOCutus.xls っていうコードメトリクスツールも入ってるみたいで、こんなメトリクスを見ることができます。

もし今後本格的に Excel VBA を使うとしたら xlUnit がいいような気がしています。

  • VBAUnit は Debug.Print してる形
  • VB Lite Unit はフォームに出力する形

なのでテスト結果が拾いにくいけど、これは OLE とか使って関数叩いてセルの値を拾うだけでいいので CI にも組み込みやすそうですし。