【问题标题】:Unit testing in MS AccessMS Access 中的单元测试
【发布时间】:2011-04-03 22:02:34
【问题描述】:

我有一个 Access 数据库项目,它变得有点大,无法在我的脑海中进行跟踪。我知道这有点晚了,但迟到总比没有好,对吧?

我在 Google 上搜索过,但没有找到令我满意的结果。有没有 MS VBA 的单元测试框架之类的东西?

【问题讨论】:

  • 我是一个卑微的 Access 开发人员,所以可能无法体会到单元测试的乐趣,但在我看来,我的应用程序中的错误总是出现在我不想测试的东西中。所以,你总是会陷入同样的​​认识论困境,即设计测试来测试你没有预料到的东西。我知道整个单元测试领域都应该解决这个问题,但问题是它不适合 Access/VBA 模型,因为运行时的用户行为本质上是不可预测的(并且无法编写脚本)。
  • @David-W-Fenton:这就是我迄今为止所遵循的哲学。我认为我可能必须保留这种理念,原因与您提到的非常相似。
  • 为了添加到 David 的 cmets,我让我的用户进行单元测试。 事实是,应该由其他人进行最终测试。他们应该是一个稍微扭曲、痴呆的用户。边注。 MS 的比例似乎约为一名项目经理、一名开发人员和一名测试人员。我与一些测试人员进行了一些有趣的聊天。

标签: unit-testing ms-access testing vba


【解决方案1】:

我在 Microsoft Access 中进行了一些相当广泛的开发,发现 AccUnit 可以很好地满足我的需求。作者的网站是德文的(但包含一些英文翻译),但是一旦你掌握了基本概念,它就会让单元测试很容易实现。

AccUnit 在后端使用 SimplyVBUnit 3.0 来支持单元测试,但我发现 AccUnit VBA 插件方法更易于在我的项目中实现。

安装

安装过程是described on the author's site,但本质上包括以下两项:

  • 安装 SimplyVBUnit 3.0(请注意,SourceForge 上不再提供此功能,但 AccUnit 网站上提供了副本。)
  • 安装从以上链接下载的 AccUnit 插件。

基本用法

安装后,您会在Tools 菜单下找到一个新的子菜单。点击AccUnit -> New Test -> Test Class with AccUnit-Features 为您的项目添加一个新的测试类模块。

您可以为模块命名任何您想要的名称,因此这将在一定程度上取决于您希望如何进行测试。有些人更喜欢为每个模块使用一个测试类,以使事情井井有条,而另一些人则在较小的项目中通过使用单个类进行单元测试来使事情变得简单。

示例代码有点神秘,但基本概念是,当你运行测试时,它会依次运行类中的所有 Subs,并显示测试结果。让我们做几个样本测试。

简单示例

假设我们有一个如下所示的函数(在标准模块中):

Public Function GetLowestNumber(FirstNum As Double, SecondNum As Double) As Double
If FirstNum < SecondNum Then
    GetLowestNumber = FirstNum
Else
    GetLowestNumber = SecondNum
End If
End Function

回到 AccUnit 测试类,我们现在可以做一个简单的测试来验证这个函数确实返回了最小的数字。

Public Sub basUtility_GetLowestNumber_Test1()
    Assert.That GetLowestNumber(3, 4), Iz.EqualTo(3)
End Sub

现在,在 AccUnit 工具栏上,单击 Run all tests 按钮。然后将出现测试窗口并显示测试结果。 (如果你复制了上面的代码,它应该可以通过。):-)

设计行测试

但是,让这个工具非常强大的是它能够使用各种标准组合运行测试。在 AccUnit 中,他们称之为 行测试。要使用它,只需调整函数以接受参数并在函数上方的注释行中列出您的测试用例。

' AccUnit:Row(3,4,3).Name = "Smaller first"
' AccUnit:Row(4,3,3).Name = "Larger first"
' AccUnit:Row(3,3,3).Name = "Equal"
' AccUnit:Row(3.002,3.6,3.003).Name = "Decimals"
' AccUnit:Row(-3,3,-3).Name = "Mixed sign"
' AccUnit:Row(-7,-3,-7).Name = "Negative"
Public Sub basUtility_GetLowestNumber_RowTest(Num1 As Double, Num2 As Double, Expected As Double)
    Assert.That GetLowestNumber(Num1, Num2), Iz.EqualTo(Expected)
End Sub

现在再次单击Run all tests,您将看到列出的结果。

请注意,单个行测试的结果嵌套在父测试下,并且显示了我们为它们提供的友好名称以便于参考。

另请注意,其中一项测试失败了。 (在这种情况下,这是行测试预期结果中的故意错误,只是为了演示失败的测试是什么样的。)双击失败的测试会跳转到我可以进一步调试的代码。

总结

我刚刚在这里分享了几个简短的示例,但在 AccUnit 中还有许多其他工具和功能可供探索。 (测试标签、忽略标志、代码模板等...)

希望这能让您对 Microsoft Access(或其他 VBA 产品)的这种特定单元测试选项有所了解。还有其他不错的选择,但对我来说,这提供了我一直在寻找的灵活性和简单性。

【讨论】:

    【解决方案2】:

    SourceForge 上有免费的VBAUnit。此外,商业版vbUnit 3 可能支持 VBA 以及常规 VB……不过我不确定。

    【讨论】:

      【解决方案3】:

      个人认为结合了优秀的访问FE自动更新器

      http://autofeupdater.com/

      以及一个链接到实时数据或测试数据的 UAT 环境,可以解决大部分问题。我也是唯一访问开发人员,我的模型由

      • 我进行更改的开发区

      • UAT 登陆少数用户 测试更改并批准

      • 其他人居住的地方

      我看到的项目之间的主要区别在于执行 UAT 的人员的能力。我有一个主要版本正在从访问后端迁移到 SQL 服务器,我发送电子邮件说该版本已在 UAT 中准备好进行测试,30 分钟后收到一个回复​​说它已经全部测试过(不可能)低并且看哪一个非常常见的区域有一个错误。

      因此,总之,设置好您的分阶段环境并挑选好您的测试人员!

      【讨论】:

      • 我使用 Auto FE。感谢 UAT 的建议。
      【解决方案4】:

      我不知道,但您可以改用代码审查。

      【讨论】:

      • 除了我是该项目的唯一开发人员之外,这不是一个坏主意!
      • 你想测试什么?您也可以让您的用户为您这样做。
      • 这就是它现在的工作方式。基本上,这意味着我发布更新,用户告诉我是否有任何问题。这可行,但是......当同样的问题不断发生时,能够自动化测试而不是等待用户抱怨是有意义的。也许我应该澄清一下,这只是一个为一家公司定制的应用程序。
      • 顺便说一句,如果我觉得有必要,我会每隔一两个小时或通常一两天“发布”一次更新。但是如果有一个重要的错误,那么我会修复它并发布更新。见超频应用部署granite.ab.ca/access/ufad.htm
      【解决方案5】:

      我使用RubberDuckVBA中的单元测试框架

      它功能齐全,只是工具箱中的一种工具。

      看起来像这样:

      【讨论】:

        猜你喜欢
        • 2011-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多