誰かがExcel VBAコードのユニットテストの経験がありますか?一部のレガシーExcel VBAコードにユニットテストをできる限り簡単に導入したいと考えています。私が持っていた1つのアイデアは、VSTOを使用してExcelブック内からコードを呼び出すことでした。他の人がExcelコードの単体テストを目的としてこれを試したかどうか、およびExcel VBAの単体テストに使用した可能性のある他の方法について知りたいのですが。
利用可能なフレームワークやExcel VBAコードの単体テストに関するヒントについて、いくつかのアドバイスをいただければ幸いです。
免責事項:私はRubberduckのGitHubリポジトリを所有しており、私はプロジェクトに関与している開発者の1人です。
Rubberduck は現在開発中です。 VBAの単体テストツールよりもmuchですが、非常にうまく機能し、定型文なしでVBA単体テストをほとんど記述できます。
'@TestModule
Private Assert As New Rubberduck.AssertClass
'@TestMethod
Public Sub TestMethod1()
Assert.Inconclusive "Test method is not written yet."
End Sub
'@TestMethod
Public Sub AnotherTestMethod()
Assert.IsTrue False, "Something's wrong?"
End Sub
そして、ドッキングされたツールウィンドウでテストメソッドをナビゲートして実行します。これにより、arrange-act-assertメソッドスタブをすばやく追加するためのメニューも表示され、AssertClass
が遅くなる場合がありますバインドされているので、コードをコンパイル可能に保つためだけに、開発環境以外の場所にRubberduckをデプロイすることを心配する必要はありません。
RubberduckのGitHubリポジトリの ユニットテストwikiページ は、それを使用する方法について説明する必要があるほとんどすべてのことを説明しています。
最新の2.1プレリリースバージョンには、通常はユニットテストを妨害する多くの標準ライブラリ呼び出しをハイジャックするために使用できる「偽物」フレームワークの始まりが含まれています。 Rubberduckユニットテストのコンテキストで実行されたときに指定されたとおりに動作するように設定します。たとえば、MsgBox
呼び出し:
'@TestMethod
Public Sub TestMethod1()
On Error GoTo TestFail
Fakes.MsgBox.Returns 42 ' MsgBox function will return 42
'here you'd invoke the procedure you want to test
Debug.Print MsgBox("This MsgBox isn't going to pop up!", vbOkOnly, "Rubberduck") 'prints 42
With Fakes.MsgBox.Verify ' Test will pass if MsgBox was invoked as specified
.Parameter "Prompt", "This MsgBox isn't going to pop up!"
.Parameter "buttons", vbOkOnly
.Parameter "title", "Rubberduck"
End With
TestExit:
Exit Sub
TestFail:
Assert.Fail "Test raised an error: #" & Err.Number & " - " & Err.Description
End Sub
Fakes
APIを拡張してより多くの関数をカバーするための貢献は歓迎以上のものです。 FileSystemObject
の呼び出しをカバーすることは特に役立ちます。
私は同じことを探していて、次のことがわかりました。 http://accunit.access-codelib.net/ これは、VBA IDEに非常にうまく統合されます。
注:ページをドイツ語で表示し、ブラウザーの翻訳ツールを使用すると、英語のページよりも多くの情報が得られるようです。
xlwings 連中は PythonでのVBA関数の単体テスト の方法をデモしました。基本的に、ワークブックに何も追加する必要はありませんが、VBA関数の期待される結果と実際の結果を比較できるように、VBA関数を呼び出す「スタンドアロン」Pythonコード)を評価者が記述します。