05 Apr 2014, 18:15

Excel VBAで テスト駆動開発してみる

2年前に、VB Lite Unitをいじっていたことがあるが、 より未来派ハッカーに近づいたいま、改めていじってみる。

クラスモジュールでないとテストできない

VBAには、ユーザフォーム、標準モジュール、クラスモジュールの3種類のコードの種類がある。 VBLiteUnitでは、クラスモジュールに対してテストを実施する。

クラスモジュールっなんだっけ?という僕たちには、以下のリンクが参考になる。

テスト実行用マクロをつくる

以下のようなSubプロシージャを用意することで、テスト実行をマクロにする。

Public Sub RunAllTests
        Runtests New Tst_Data
End Sub

テスト実行用のVBSをつくる

コマンドラインからRunAllTestsを実行したい。

以下を参考にして、Excelのマクロをコマンドラインから実施するためのVBSを作成。


Dim objExcelApp ,objExcelBook
Dim macro_path

macro_path = "C:\cygwin\home\TSUNEMICHI\repo\vba-study\sample\test.xlsm"

Set objExcelApp = CreateObject("Excel.Application")
Set objExcelBook = objExcelApp.Workbooks.Open(macro_path, , True)

objExcelApp.Run "'" + macro_path + "'!ThisWorkbook.reloadModule"
objExcelApp.Run "'" + macro_path + "'!ThisWorkbook.runAllTests"

objExcelBook.Saved = True
objExcelBook.Close False
Set objExcelBook = Nothing
Set objExcelApp = Nothing

テスト実行用のRakefile作成

TDDっぽくするために、rakefileを作成してみた。rake testでテストを実行する。


require 'rake/clean'

FILE_PATH  = "./test.xlsm"

task :default => "open"

task :open do
  `cygstart  #{FILE_PATH}` 
end

task :test do
  `cygstart test.vbs` 
end

テストコード作成

src/testディレクトリ配下にそれぞれ作成。

完成品

<div class="outline-text-2" id="text-1">
  <p>
    githubにアップ。
  </p>

  <ul class="org-ul">
    <li>
      <a href="https://github.com/tsu-nera/ExcelVBA_TDD_Sample">https://github.com/tsu-nera/ExcelVBA_TDD_Sample</a>
    </li>
  </ul>
</div>

<div id="outline-container-sec-1-1" class="outline-3">
  <h3 id="sec-1-1">
    Special Thanks
  </h3>

  <div class="outline-text-3" id="text-1-1">
    <ul class="org-ul">
      <li>
        <a href="http://rsh.csh.sh/text-scripting-vba/">http://rsh.csh.sh/text-scripting-vba/</a>
      </li>
      <li>
        <a href="http://vb-lite-unit.sourceforge.net/">http://vb-lite-unit.sourceforge.net/</a>
      </li>
    </ul>
  </div></p>
</div></p>