gpt4 book ai didi

database - 测试 MS Access 应用程序的最佳方式?

转载 作者:太空狗 更新时间:2023-10-30 01:38:15 25 4
gpt4 key购买 nike

使用同一数据库中的代码、表单和数据,我想知道为 Microsoft Access 应用程序(例如 Access 2007)设计一套测试的最佳实践是什么。

测试表单的主要问题之一是只有少数控件具有 hwnd句柄和其他控件只获得一个它们有焦点的控件,这使得自动化非常不透明,因为您无法获得表单上的控件列表以进行操作。

有什么经验可以分享吗?

最佳答案

1. 编写可测试的代码

首先,停止将业务逻辑写入您的表单背后的代码中。那不是它的地方。在那里无法正确测试。事实上,您根本不需要测试表单本身。它应该是一个非常愚蠢的简单 View ,它响应用户交互,然后将响应这些操作的责任委托(delegate)给另一个 的类。是 可测试。

你是怎样做的?熟悉 Model-View-Controller pattern是一个好的开始。

Model View Controller diagram

由于我们要么得到事件要么得到接口(interface),所以在 VBA 中无法完美地完成它,从来没有两者,但你可以非常接近。考虑这个具有文本框和按钮的简单表单。

simple form with text box and button

在表单后面的代码中,我们将 TextBox 的值包装在一个公共(public)属性中,并重新引发我们感兴趣的任何事件。

Public Event OnSayHello()
Public Event AfterTextUpdate()

Public Property Let Text(value As String)
Me.TextBox1.value = value
End Property

Public Property Get Text() As String
Text = Me.TextBox1.value
End Property

Private Sub SayHello_Click()
RaiseEvent OnSayHello
End Sub

Private Sub TextBox1_AfterUpdate()
RaiseEvent AfterTextUpdate
End Sub

现在我们需要一个模型来使用。在这里,我创建了一个名为 MyModel 的新类模块。 .这是我们将要测试的代码。请注意,它自然与我们的 View 具有相似的结构。
Private mText As String
Public Property Let Text(value As String)
mText = value
End Property

Public Property Get Text() As String
Text = mText
End Property

Public Function Reversed() As String
Dim result As String
Dim length As Long

length = Len(mText)

Dim i As Long
For i = 0 To length - 1
result = result + Mid(mText, (length - i), 1)
Next i

Reversed = result
End Function

Public Sub SayHello()
MsgBox Reversed()
End Sub

最后,我们的 Controller 将它们连接在一起。 Controller 监听表单事件并将更改传达给模型并触发模型的例程。
Private WithEvents view As Form_Form1
Private model As MyModel

Public Sub Run()
Set model = New MyModel
Set view = New Form_Form1
view.Visible = True
End Sub

Private Sub view_AfterTextUpdate()
model.Text = view.Text
End Sub

Private Sub view_OnSayHello()
model.SayHello
view.Text = model.Reversed()
End Sub

现在可以从任何其他模块运行此代码。出于本示例的目的,我使用了一个标准模块。我强烈建议您使用我提供的代码自己构建它并查看它的功能。
Private controller As FormController

Public Sub Run()
Set controller = New FormController
controller.Run
End Sub

所以,这很好,所有 但这和测试有什么关系?! friend ,它有 一切与测试有关。我们所做的是使我们的代码可测试。在我提供的示例中,甚至没有理由尝试测试 GUI。我们唯一真正需要测试的是 model .这就是所有真正的逻辑所在。

所以,进入第二步。

2. 选择单元测试框架

这里没有很多选择。大多数框架需要安装 COM 插件、大量样板、奇怪的语法、将测试编写为注释等。这就是我参与 building one myself 的原因。 ,所以我的这部分答案并不公正,但我会尽量对可用的内容进行公正的总结。
  • AccUnit
  • 仅适用于 Access。
  • 要求您将测试编写为注释和代码的奇怪混合体。 (评论部分没有智能感知。
  • 那里一个图形界面来帮助你编写那些看起来很奇怪的测试。
  • 该项目自 2013 年以来没有看到任何更新。
  • VB Lite Unit
    我不能说我个人使用过它。它就在那里,但自 2005 年以来一直没有更新。
  • xlUnit
    xlUnit 并不糟糕,但也不好。它很笨重,而且有很多样板代码。这是最好的,但它在 Access 中不起作用。所以,就这样了。
  • 构建自己的框架

    我已经 been there and done that .这可能比大多数人想要的要多,但完全有可能用原生 VBA 代码构建单元测试框架。
  • Rubberduck VBE Add-In's Unit Testing Framework
    免责声明:我是共同开发者之一。

    我有偏见,但这是迄今为止我最喜欢的一群。
  • 几乎没有样板代码。
  • 智能感知可用。
  • 该项目处于事件状态。
  • 比大多数这些项目更多的文档。
  • 它适用于大多数主要办公应用程序,而不仅仅是 Access。
  • 不幸的是,它是一个 COM 加载项,因此必须将其安装到您的计算机上。

  • 3. 开始编写测试

    所以,回到第 1 节中的代码。我们真正需要测试的唯一代码是 MyModel.Reversed()功能。那么,让我们来看看这个测试会是什么样子。 (给出的示例使用 Rubberduck,但它是一个简单的测试,可以转换为您选择的框架。)
    '@TestModule
    Private Assert As New Rubberduck.AssertClass

    '@TestMethod
    Public Sub ReversedReversesCorrectly()

    Arrange:
    Dim model As New MyModel
    Const original As String = "Hello"
    Const expected As String = "olleH"
    Dim actual As String

    model.Text = original

    Act:
    actual = model.Reversed

    Assert:
    Assert.AreEqual expected, actual

    End Sub

    编写好的测试指南
  • 一次只测试一件事。
  • 好的测试只会在系统中引入错误或需求发生变化时失败。
  • 不要包含外部依赖项,例如数据库和文件系统。这些外部依赖项可能会导致测试因您无法控制的原因而失败。其次,它们会减慢您的测试速度。如果你的测试很慢,你就不会运行它们。
  • 使用描述测试内容的测试名称。如果时间长了也不要担心。最重要的是它是描述性的。


  • 我知道这个答案有点长而且有点晚,但希望它可以帮助一些人开始为他们的 VBA 代码编写单元测试。

    关于database - 测试 MS Access 应用程序的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47400/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com