如何单元测试Excel VBA代码

Dr *_*man 33 excel vba vsto unit-testing excel-vba

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

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

Mat*_*don 36

免责声明:我拥有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
Run Code Online (Sandbox Code Playgroud)

然后你可以在一个停靠的工具窗口中导航和运行你的测试方法,它还为你提供快速添加arrange-act-assert方法存根的菜单,并且AssertClass也可以延迟绑定,所以你不必担心在开发环境以外的任何地方部署Rubberduck只是为了保持代码可编辑.


Rubberduck的GitHub存储库中的单元测试维基页面解释了有关使用它的几乎所有内容.


最新的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
Run Code Online (Sandbox Code Playgroud)

扩展该FakesAPI以涵盖更多功能的贡献非常受欢迎.覆盖FileSystemObject调用特别有用.


ton*_*722 6

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

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

  • @DavidDuran如果Rubberduck有问题,不告诉任何人都不会解决它...总是欢迎反馈,无论是在[GitHub](https://github.com/rubberduck-vba/Rubberduck)还是我们在[SE聊天](https://chat.stackexchange.com/rooms/14929/vba-rubberducking)上的作战室。干杯! (2认同)