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

2024-02-22

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

我也希望获得一些有关任何可用框架和/或有关单元测试 Excel VBA 代码的技巧的指示。


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

橡皮鸭 http://www.rubberduckvba.com正在积极开发中。它是much虽然它不仅仅是 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

然后,您可以在停靠的工具窗口中导航并运行测试方法,该窗口还为您提供用于快速添加的菜单安排-行动-断言方法存根,以及AssertClass也可以是后期绑定的,因此您不必担心将 Rubberduck 部署在您的开发环境中以外的其他地方,只是为了保持代码的可编译性。


The 单元测试维基页面 https://github.com/rubberduck-vba/Rubberduck/wiki/Unit-TestingRubberduck 的 GitHub 存储库上的 几乎解释了有关使用它的所有内容。


最新的 2.1 预发布版本包括“假货”框架的开始,该框架可用于劫持许多通常会干扰单元测试的标准库调用,方法是将标准库字面意义上的转换为“测试假货”,例如,设置为在 Rubberduck 单元测试上下文中执行时按照指定的方式运行MsgBox calls:

'@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调用将特别有用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何对 Excel VBA 代码进行单元测试 的相关文章

  • Delphi - 通过 ADO 查询获取 Excel 行

    我有以下 Excel 文件 我将 AdoConnection ConnectionString 设置为 AdoConnection ConnectionString Provider Microsoft Jet OLEDB 4 0 Data
  • Android RxJava 2 JUnit 测试 - android.os.Looper 中的 getMainLooper 未模拟 RuntimeException

    我在尝试为正在使用的演示者运行 JUnit 测试时遇到 RuntimeExceptionobserveOn AndroidSchedulers mainThread 由于它们是纯 JUnit 测试而不是 Android 仪器测试 因此它们无
  • Windows 程序如何临时更改其时区?

    我写了一个函数来返回time t与给定日期的午夜相对应的值 当给定日期没有午夜时 它返回最早可用的时间 例如 当埃及进入夏令时时 这种情况就可能发生 今年 时间更改于 4 月 29 日晚上午夜生效 因此时钟直接从 23 59 转到 01 0
  • 如何从 jQuery 获取 ajax 请求下载 Excel

    我有一个 Spring MVC 视图 它提供了一个 excel 文件 但是 我现在修改了该过程 以便用户获得一个模式框 他们可以在下载 excel 之前在其中选择一些选项 这些选定的选项将发送到视图 我的请求看起来像这样 get downl
  • 从命令行运行本机 VS2012/C++ 64 位单元测试

    我正在尝试从命令行运行单元测试 我尝试使用以下命令使用 mstest exe 程序 E VS Projects gt C Program Files x86 Microsoft Visual Studio 11 0 Common7 IDE
  • 如何从控制台 exe 禁用 nunit 中的卷影复制

    我在加载时遇到问题Nunit测试 dll 测试 dll 使用其他一些 exe 在构建时复制了一些目录和文件 我在通话时收到了该错误test dll来自 nunitconsole exe System IO DirectoryNotFound
  • Excel VBA 检查工作簿是否打开,如果没有打开则打开

    我在下面放置的代码无法正常工作 尝试运行宏时出现错误 400 您能稍微回顾一下这段代码吗 我不确定问题是否不在于我所指的函数变量 Sub AutoFinal Dim final wb As Workbook shop stat wb As
  • 如何为 Inquirer.js 编写单元测试?

    我想知道如何为 npm 包编写单元测试询问者 js https github com SBoudrias Inquirer js 这是一个让CLI打包更容易的工具 我读过了这个帖子 https glebbahmutov com blog u
  • org.apache.poi 中的异常

    我试图编写一个可以读取和写入的程序 xlsx文件中 下面提供的代码旨在能够编写其第一个 Excel 程序 package excel reader import java io FileOutputStream import java io
  • 将范围传递给 Excel 用户定义函数并将其分配给数组

    我在尝试着 通过两个范围 多行单列 Excel 2007 中的用户定义函数 然后将其分配给一个数组进行处理 谁能告诉我如何将这样的范围分配给数组 范围不是恒定的 因为我在不同的单元格中使用 UDF 来处理不同的数据 所以我不能使用 e g
  • 副水平X轴VBA最大刻度

    通过以下代码和敏 正在设置 VBA 中图表的主水平 X 轴的比例 Sub chart set Dim objCht As ChartObject With ActiveSheet ChartObjects 1 Chart Axes xlVa
  • 字节数组到 Excel 工作簿

    我正在尝试将字节数组转换为 Excel 工作簿 当我这样做时 Response BinaryWrite renderedBytes 它工作正常并且文件符合预期 但是当我尝试用我在网上找到的这个来做到这一点时 private Object B
  • Excel 中分组经常性 CF 的净现值

    下面是 60 个期间的现金流量表 有一组经常性现金流量 Excel 中是否有一种简单的方法可以计算所有 60 个期间 每月现金流量 的 NPV 而无需创建 60 行的表格并使用 NPV 公式 因此 60 个订单项的公式如下所示 NPV PE
  • 在VBA中使用for循环调用连续的变量名(即car1,car2...car10)

    设想 我有七个变量 labelKid1 labelKid2 LabelKid3 我正在搜索单元格以查找不为空的单元格 然后将值输入到标签中 从 labelKid1 开始 然后转到下一个标签 问题 有没有办法让我们使用 for 循环来遍历这些
  • 如何使用 gmock 模拟该类,使其实例作为其他类中的类成员

    我是新用户gmock 我不知道如何使用gmock模拟该类 将其实例作为其他类中的类成员 代码如下所示 classs B B fun class A B b A fun if b B fun XXX doXXXXX 现在 我想用gmock嘲笑
  • 尚未注册类型“Microsoft.AspNetCore.Mvc...”的服务

    我正在尝试测试此控制器方法 以确保它重定向到另一个控制器方法或存在模型错误 public IActionResult ResetPassword ResetPasswordViewModel viewModel if viewModel N
  • 具有该名称的查询已存在

    所以我想使用 Excel VBA 创建雅虎财经历史数据 csv 下载 的自动查询 我设置了一个函数 以便 Excel 会自动查询股票代码及其开始日期和结束日期 分别为 K1 K2 K3 这是代码 Sub YFIN get YFIN get
  • 使用 Microsoft Graph API 从 Sharepoint 站点提取 Excel.xlsx 工作簿

    正如标题中所述 我一直在尝试使用 Microsoft Graph API 从我们公司的 Sharepoint 站点提取 Excel 工作簿 我能够检索文件的元数据 但是当我添加 workbook 分段到 URL 我收到以下错误 error
  • 如何使用波斯日期(Shamsi)? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想直接使用 Excel 2007 工作表中的波斯日期 Hijri Shamsi 作为计算基础 这怎么可能 我将通过以下方式将波斯日期转换
  • AngularJS 中的全局模拟对象用于 jasmine/karma 测试

    我有一个正在模拟进行单元测试的对象 基本上在我的测试文件中 我将其模拟如下 var mockObject mockMethod1 function return true mockMethod2 function return true b

随机推荐