首页 / 知识
关于数据库:测试MS Access应用程序的最佳方法?
2023-04-14 10:08:00
Best way to test a MS Access application?使用同一数据库中的代码,表单和数据,我想知道为Microsoft Access应用程序(例如Access 2007)设计一套测试的最佳实践是什么。
测试表单的主要问题之一是,只有少数几个控件具有 有经验可以分享吗? 1.编写可测试的代码 首先,停止在背后的表单代码中编写业务逻辑。那不是那个地方。无法在那里正确测试。实际上,您实际上根本不需要测试表单本身。它应该是一个愚蠢的简单视图,它响应用户交互,然后将响应这些操作的责任委托给另一个可测试的类。 你是怎样做的?熟悉Model-View-Controller模式是一个好的开始。
由于无法获得事件或接口,而不能同时获得事件或接口,因此在VBA中无法完美完成,但是您可以做到非常接近。考虑具有文本框和按钮的这种简单形式。
在后面的表单代码中,我们将把TextBox的值包装在一个公共属性中,然后重新引发我们感兴趣的任何事件。
现在我们需要一个模型来使用。在这里,我创建了一个名为
最后,我们的控制器将它们连接在一起。控制器侦听表单事件,并将更改传达给模型,并触发模型的例程。
现在,可以从任何其他模块运行此代码。出于本示例的目的,我使用了一个标准模块。我强烈建议您使用我提供的代码自行构建并查看其功能。
因此,这很棒,但与测试有什么关系呢!朋友,它与测试有关。我们要做的是使我们的代码可测试。在我提供的示例中,没有任何理由可以尝试测试GUI。我们真正需要测试的唯一一件事是 因此,继续第二步。 2.选择一个单元测试框架 这里没有很多选择。大多数框架都需要安装COM加载项,大量样板程序,怪异的语法,将测试编写为注释等。这就是为什么我自己参与构建自己的原因,因此我的答案这一部分并不公正,但我会尽力对所提供的内容进行公平的总结。 AccUnit
VB Lite单元
xlUnit 建立自己的框架 我去过那里并且做到了。它可能比大多数人想了解的要多,但完全有可能在本机VBA代码中构建单元测试框架。
Rubberduck VBE外接程序的单元测试框架 我有偏见,但这是迄今为止我最喜欢的一堆。 3.开始编写测试
因此,回到第1节的代码。我们真正需要测试的唯一代码是
编写良好测试的准则 我知道答案有点长,而且很晚,但是希望它可以帮助某些人开始为他们的VBA代码编写单元测试。 好。 我感谢诺克斯和大卫的回答。我的答案将介于两者之间:制作不需要调试的表格! 我认为表单应基本上按原样使用,仅表示图形界面,这意味着它们不必调试!这样,调试工作就仅限于您的VBA模块和对象,这很容易处理。 当然,有一种自然的趋势是将VBA代码添加到表单和/或控件中,特别是当Access为您提供了这些很棒的"更新后"和"更改时"事件时,但是我绝对建议您不要放置任何表单或控件特定的代码在表单的模块中。这使得进一步的维护和升级非常昂贵,其中您的代码在VBA模块和表单/控件模块之间划分。
这并不意味着您不能再使用此
哪里:
然后,我有2个模块。第一个是
第二个是
选择这样的通用解决方案意义重大。这意味着您正在达到较高的代码规范化水平(意味着可以轻松维护代码)。当您说您没有任何特定于表单的代码时,这还意味着表单模块已完全标准化,并且其生产可以自动化:只需说出您要在表单/控件级别上管理的事件,然后定义您的通用/特定程序术语。 即使使用MS Access,代码规范化也是一个漫长的过程。但这确实值得付出痛苦! Access作为COM应用程序的另一个优点是,您可以创建一个.NET应用程序,以通过自动化来运行和测试Access应用程序。这样做的好处是,您可以使用功能更强大的测试框架(例如NUnit)针对Access应用编写自动断言测试。 因此,如果您精通C#或VB.NET以及NUnit之类的工具,则可以更轻松地为Access应用程序创建更大的测试范围。 尽管这是一个非常古老的答案: 有一个AccUnit,一个专用于Microsoft Access的单元测试框架。 我已经从Python的doctest概念中抽出了一页,并在Access VBA中实现了DocTests过程。这显然不是成熟的单元测试解决方案。它仍然还很年轻,所以我怀疑我已经解决了所有错误,但是我认为它已经成熟到可以放归野外了。 只需将以下代码复制到标准代码模块中,然后在Sub中按F5即可查看其运行情况:
从名为Module1的模块复制,粘贴和运行上面的代码将产生:
快速注意事项:
尽管有其局限性,但我仍然认为它为您带来了很多好处。 编辑:这是一个简单的函数,必须满足" doctest规则"。
我会将应用程序设计为在查询和vba子例程中进行尽可能多的工作,以便您的测试可以由填充测试数据库,针对这些数据库运行生产查询和vba的集合组成,然后查看输出和比较以确保输出良好。这种方法显然不能测试GUI,因此您可以使用一系列手动执行的测试脚本(这里的意思是像打开文档1的Word文档,然后单击控件1)来扩大测试范围。 它取决于项目范围以及测试方面所需的自动化程度。 我发现在我的应用程序中进行单元测试的机会相对较少。我编写的大多数代码都与表数据或文件系统交互,因此从根本上讲很难进行单元测试。早期,我尝试了一种类似于模拟(欺骗)的方法,其中我创建了具有可选参数的代码。如果使用了该参数,则该过程将使用该参数,而不是从数据库中获取数据。设置具有与一行数据相同的字段类型的用户定义类型并将其传递给函数是很容易的。现在,我有一种方法可以将测试数据放入要测试的过程中。在每个过程中,都有一些代码将实际数据源换成了测试数据源。这使我可以使用自己的单元测试功能对各种功能进行单元测试。编写单元测试很容易,只是重复而乏味。最后,我放弃了单元测试,开始使用另一种方法。 我主要为自己编写内部应用程序,因此我可以负担得起直到问题找到我的时间,而不必拥有完美的代码。如果我确实为客户编写应用程序,那么通常客户不会完全知道多少软件开发成本,因此我需要一种低成本的方法来获得结果。编写单元测试就是编写一个在程序中推送不良数据的测试,以查看该程序是否可以正确处理它。单元测试还确认正确处理了良好的数据。我当前的方法是基于将输入验证写入应用程序中的每个过程,并在代码成功完成后引发成功标志。每个调用过程都在使用结果之前检查成功标志。如果发生问题,将通过错误消息进行报告。每个函数都有一个成功标志,一个返回值,一个错误消息,一个注释和一个原点。用户定义的类型(函数返回为fr)包含数据成员。许多给定的函数只能填充用户定义类型中的某些数据成员。运行函数时,通常返回success = true,并返回值,有时还返回注释。如果函数失败,则返回success = false和错误消息。如果功能链失败,则错误消息将以菊花形式更改,但结果实际上比普通堆栈跟踪更具可读性。起源也被链接在一起,所以我知道问题出在哪里。该应用程序很少崩溃,并且可以准确报告任何问题。结果比标准错误处理要好得多。
代码说明。
我正在使用Enum将参数传递给函数,因为这会创建函数可以接受的一组有限的已知选择。在函数中输入参数时,枚举还提供智能感知。我想它们为功能提供了基本的接口。
用户定义的类型(例如FunctRet)还提供了有助于代码完成的功能。在该过程中,通常先将内部结果存储到匿名内部变量(fr),然后再将结果分配给返回变量(GetOutputFolder)。这使得重命名过程非常容易,因为仅更改了顶部和底部。 因此,总而言之,我开发了一个具有ms-access的框架,涵盖了所有涉及VBA的操作。测试被永久写入过程,而不是开发时间单元测试。实际上,代码仍然运行非常快。我非常小心地优化了低级功能,这些功能每分钟可以调用一万次。此外,我可以在开发代码时将其用于生产中。如果发生错误,则它是用户友好的,并且错误的来源和原因通常是显而易见的。错误是从调用表单报告的,而不是从业务层中某些模块报告的,这是应用程序设计的重要原理。此外,我没有维护单元测试代码的负担,这在我改进设计而不是编写清晰概念化的设计时非常重要。 存在一些潜在的问题。测试不是自动进行的,只有在运行应用程序时才能检测到新的错误代码。该代码看起来不像标准的VBA代码(通常较短)。该方法仍然具有一些优点。最好仅使用错误处理程序记录错误,因为用户通常会与我联系并给我有意义的错误消息。它还可以处理使用外部数据的过程。 JavaScript使我想起VBA,我想知道为什么JavaScript是框架之地,而MS-access中的VBA却不是。 撰写本文后几天,我在The CodeProject上发现了一篇与我上面所写内容接近的文章。本文比较并对比了异常处理和错误处理。我上面的建议类似于异常处理。 好。 如果您有兴趣在更详细的级别(尤其是VBA代码)上测试Access应用程序,则VB Lite单元是用于此目的的出色单元测试框架。 这里有很好的建议,但是我很惊讶没有人提到集中式错误处理。您可以获得用于快速功能/子模板化和用于添加行号的插件(我使用MZ工具)。然后将所有错误发送到一个函数中,您可以在其中记录它们。然后,您还可以通过设置单个断点来中断所有错误。 Access是一个COM应用程序。使用COM,而不是Windows API。测试Access中的内容。 Access应用程序的最佳测试环境是Access。您所有的表单/报表/表格/代码/查询都可用,有一种类似于MS Test的脚本语言(好吧,您可能不记得MS Test),有数据库环境可以保存您的测试脚本和测试结果,您在这里建立的技能可以转移到您的应用程序中。 我还没有尝试过,但是您可以尝试将访问表单作为数据访问网页发布到诸如共享点之类的网页上,或仅作为网页发布,然后使用诸如selenium之类的工具通过一系列测试来驱动浏览器。 显然,这不像直接通过单元测试来驱动代码那样理想,但是它可能会让您有所作为。祝好运 MS已弃用Data Access Page已有相当长的一段时间了,但从一开始它就从来没有真正起作用过(它们依赖于所安装的Office Widget,并且只能在IE中工作,然后才很糟糕)。 确实,可以获得焦点的Access控件只有在获得焦点时才具有窗口句柄(而那些不能获得焦点的控件(例如标签)根本就没有窗口句柄)。这使得Access特别不适用于窗口句柄驱动的测试方案。 的确,我质疑您为什么要在Access中进行这种测试。在我看来,这听起来像是您的基本极限编程法则,但并非XP的所有原理和实践都可以适用于Access应用程序-方钉,圆孔。 因此,退后一步,问自己要完成的工作,并考虑与基于Access中无法使用的方法的方法完全不同的方法。 或者,这种自动测试对于Access应用程序是否完全有效或什至有用。 |
最新内容
相关内容
linux使用命令的方法?
linux使用命令的方法?,系统,信息,工具,标准,数据,命令,左下角,目录,文件夹,图标,linux的cd命令的使用方法1、cd ~:回到用户家目录。注:这得看你linux存储数据命令?
linux存储数据命令?,系统,管理,数据,设备,情况,地址,工作,命令,服务,平台,Linux文件系统操作命令1、cat:可以显示文件的内容(经常和more搭配使linux数据库查找命令?
linux数据库查找命令?,位置,名称,状态,服务,软件,信息,系统,命令,名字,密码,在linux中如何用命令查找文件在哪使用查找命令 “find”命令允许linux数据库同步命令?
linux数据库同步命令?,信息,系统,汽车,车辆,服务,工作,通信,一致,分析,数据,DB2数据库在linux操作系统的指令有哪些?1、linux系统常用操作命令linux建立数据库命令?
linux建立数据库命令?,软件,系统,工作,数据,密码,工具,数据库,一致,网络,服务,linux中在shell中怎么创建一个数据库1、以下的文章主要讲述的是linux命令进数据库?
linux命令进数据库?,地址,系统,名字,服务,密码,命令,读法,数据库,操作系统,主机,linux系统mysql数据库怎么进入数据库首先确保linux下mysql安linux清空表数据命令?
linux清空表数据命令?,系统,数据,软件,名称,不了,命令,文件,电脑,地址,位置,Linux删除文件的命令?1、linux 删除文件指令:输入rd盘符名:\文件夹linux拷贝数据命令?
linux拷贝数据命令?,系统,地址,文件,数据,命令,目录,服务,基本知识,项目,密码,linux复制命令?1、在Linux中,用于复制文件和目录的命令是cp。cplinux数据库检查命令?
linux数据库检查命令?,服务,状态,地址,位置,系统,信息,命令,工作,情况,密码,在linux中,怎样查看Mysql服务运行状态?1、psaux或netstat-tlunppslinux命令进去数据库?
linux命令进去数据库?,地址,服务,名字,系统,数据库,工具,基础,工作,管理,网络,linux系统mysql数据库怎么进入数据库(linux进入mysql数据库命令linux数据库基础命令?
linux数据库基础命令?,地址,工作,基础,系统,命令,信息,情况,工具,设备,目录,linux下基本命令使用讲解对Linux操作系统进行维护操作的实用命令linux数据共享命令?
linux数据共享命令?,情况,系统,工具,网络,数据,软件,发行,设备,命令,文件,Linux文件系统操作命令df命令:用于显示文件系统的磁盘空间使用情况,包