如何对 Excel VBA 代码进行单元测试

Posted

技术标签:

【中文标题】如何对 Excel VBA 代码进行单元测试【英文标题】:How to unit test Excel VBA code 【发布时间】:2010-12-28 16:22:46 【问题描述】:

有人对 Excel VBA 代码进行单元测试有经验吗?我想尽可能轻松地将单元测试引入到一些遗留的 Excel VBA 代码中。我的一个想法是使用 VSTO 从 Excel 工作簿中调用代码。我想知道其他人是否出于单元测试 Excel 代码的目的而尝试过此方法,以及他们可能用于单元测试 Excel VBA 的任何其他方法。

我也希望能提供一些关于任何可用框架和/或单元测试 Excel VBA 代码的提示。

【问题讨论】:

可能感兴趣:***.com/questions/1792188/… 【参考方案1】:

免责声明:我拥有 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 预发布版本包括一个“假货”框架的开始,该框架可用于劫持许多通常会干扰单元测试的标准库调用,将标准库真正变成“测试假货”可以设置为在 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 调用会特别有用。

【讨论】:

注意:从 v2.4.0 开始,Rubberduck 也正式在 VB6 中工作。单元测试功能也完全与主机无关,即适用于任何 VBA 主机,包括非 Office 应用程序。【参考方案2】:

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

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

【讨论】:

我试过 Rubberduck 没有成功。另一方面,AccUnit 很容易让它工作。他们甚至在插入测试类时给出示例。 @DavidDuran 如果 Rubberduck 有问题,不要告诉任何人不会解决它...随时欢迎反馈,无论是在 GitHub 还是在我们的作战室 SE chat .干杯!【参考方案3】:

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

【讨论】:

以上是关于如何对 Excel VBA 代码进行单元测试的主要内容,如果未能解决你的问题,请参考以下文章

EXCEL根据单元格名称改变后自杀,求VBA代码!

单元格中的 Excel VBA 换行会减慢合并任务的执行速度

Excel-VBA 读取单元格颜色

如何测试 Excel VBA 范围变量以引用整列..?

如何使用 VBA 根据活动工作表中的单元格自动填充 Excel 表单?

java的swing编程,Jtable的单元格如何赋值