如何单元测试Excel VBA代码

时间:2010-12-28 16:22:47

标签: unit-testing excel-vba vsto vba excel

有没有人有单位测试Excel VBA代码的经验?我想尽可能轻松地将单元测试引入一些传统的Excel VBA代码中。我的一个想法是使用VSTO从Excel工作簿中调用代码。我想知道其他人是否为了单元测试Excel代码以及他们可能用于单元测试Excel VBA的任何其他方法而尝试过此操作。

对于有关单元测试Excel VBA代码的任何可用框架和/或技巧,我将不胜感激。

3 个答案:

答案 0 :(得分:33)

  

免责声明:我拥有Rubberduck的GitHub存储库,而且我是参与该项目的开发人员之一。

Rubberduck正在积极发展中。它不仅仅是VBA的单元测试工具很多,但它运行良好,让你可以在没有任何样板的情况下编写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存储库中的unit testing wiki page解释了几乎所有有关使用它的内容。


最新的2.1预发布版本包括假冒" fakes"框架,可以用来劫持一些通常会干扰单元测试的标准库调用,通过将标准库转换为"测试假货"可以设置为在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次调用特别有用。

答案 1 :(得分:6)

我只是在寻找相同的东西,发现:http://accunit.access-codelib.net/很好地集成到了VBA IDE中。

注意:使用德语查看页面并使用浏览器翻译工具似乎比英文页面提供更多信息。

答案 2 :(得分:3)

placement人刚刚演示了如何xlwings。从本质上讲,您不需要在工作簿中添加任何内容,但是您可以编写“独立”Python代码来调用VBA函数,以便比较VBA函数的预期结果与实际结果。