如何对 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 换行会减慢合并任务的执行速度