如何在VBA Excel宏中设置单元测试?

15

我正在开发一个Excel VBA宏,将处理一些Excel文件并进行清洗/清理,生成包含两个工作表的工作簿,第1个工作表是原始“脏”文件,第2个工作表是经过清理的文件。

由于我们现在有10种不同的格式,以后可能会有40多个格式,因此我希望保存给定文件集的输出,然后编写一个单元测试,该测试将获取原始输入,运行我们的宏,然后将宏的输出与我们保存的预期输出进行比较。

然后,以后任何时候进行维护时,我们都可以快速轻松地运行我们的单元测试,以确保我们没有破坏已经工作的任何功能。

这是我第一次使用VBA。我在Google上搜索了框架或插件,但找不到太多帮助。我确实找到了一个函数,可以比较两个完整的Excel电子表格 - 所以我已经掌握了这部分内容。但现在我需要弄清楚如何编写和执行这个单元测试。编写单元测试应该很简单 - 但我该如何执行它呢?我不想在电子表格上放置一个说“运行单元测试”的按钮... VBA / Excel中是否有一种方式可以运行任意函数,以便我可以只是右键单击我的UnitTest函数并执行“运行”?

如果您对我的单元测试计划有任何其他反馈,也将不胜感激。再次感谢。

4个回答

11

Rubberduck是一个免费且开源的VBE插件,它包括一个集成的IDE单元测试框架,并可用于大多数主流Office产品。

  1. 下载并安装最新版本
  2. 打开您的VBA项目所在的Excel工作簿。
  3. 转到“工具”>>“引用”,并添加对Rubberduck的引用。
  4. 添加新的标准模块。
  5. 添加'@TestModule属性并创建Rubberduck.AssertClass的实例。

`@TestModule

Private Assert As Rubberduck.Assert
  • 开始编写测试。任何使用'@TestMethod属性标记的公共子程序都将被测试资源管理器发现并运行。


  • '@TestMethod
    Public Sub OnePlusOneIsTwo()
        Assert.AreEqual 2, Add(1,1)
    End Sub
    

    Unit Test Explorer

    更多信息请参阅项目维基上的单元测试页面

    免责声明:我是该项目的开发者之一。


    很棒的信息。就此而言,链接维基上的说明比这里给出的说明更为最新。 - epotter

    10
    如果是我,我会创建一个引用要测试的表格的第二个电子表格。(转到工具> 引用> 浏览)这个新的工作簿可以包含您想要的所有测试,而无需弄脏主要的工作簿。这也使您可以自由地为自己构建界面(如果需要的话)。
    另外,如果您想从Excel宏菜单中隐藏程序但仍然可以访问它们,在模块顶部放置以下内容:
    Option Private Module
    

    将要使用的所有过程都设置为“Public”。然后您可以从立即窗口(VBE中的ctrl-g)调用它们,但它们不会在宏列表中列出。

    但是,如果您将单元测试保持分开(正如您可能应该的那样),那么您实际上不必担心公共/私有模块。


    5

    多年未曾关注,但vbaUnit曾经表现不错...


    谢谢,我已经知道了,但不确定该如何比较这些表格。谢谢大家。 - dferraro

    1

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接