单元测试鼠标事件处理程序

4
当对组件进行单元测试时,我遇到了以下问题:
有许多与鼠标相关的事件处理程序。我看到测试这些处理程序有两种可能性:
1.使用Windows API调用模拟鼠标事件。
2.使用受保护的hack来访问受保护的事件处理程序并直接调用它们。
我知道单元测试通常限制于类的接口(这也意味着测试不必在类内部更改时更改),但这种情况值得例外吗?
在单元测试组件时,您通常如何处理鼠标事件?

最好找出与时间相关的问题,例如TActionManager.OnUpdate代码尚未执行,某些UI元素不处于其预期状态的情况。快速点击/输入的用户可能会遇到这些问题。 - mjn
3个回答

7
个人认为,您需要进行架构改变以便于自动化用户界面测试。本文详细阐述了原因:http://blog.objectmentor.com/articles/2010/01/04/ui-test-automation-tools-are-snake-oil Delphi Magazine曾刊登过一篇关于从代码中自动测试用户界面的有趣文章(不使用特定的GUI测试工具)。查找时间可能比我预期的要长,并且可能无法在线获取。如果我找到了,我会更新我的答案。
该文章名为“Creating Easily Testable User Interfaces”,作者是Julian Bucknall (DevExpress),发表在“The Delphi Magazine”的第120期。不幸的是,该文章已不再在线上。您将需要购买The Delphi Magazine的全部收藏:一个1 GB的USB闪存驱动器,其中包括The Delphi Magazine所发行的所有问题和所有代码。价值36英镑!(不,我没有佣金。)

请注意,此问题特别涉及视觉组件的鼠标事件以及从这些处理程序执行的逻辑。它不涉及测试业务逻辑。 - jpfollenius
我提到的《Delphi Magazine》文章也不是关于测试业务逻辑的,而是关于将表单和事件与控制它们的逻辑分离,以便您可以编写测试来“执行”鼠标点击,并检查相应的控件和操作是否已启用/可见等。这完全是关于测试用户界面,而不是业务逻辑。 - Marjan Venema

2
通常情况下,您应该以可测试的方式编写代码,因此您可以通过鼠标事件调用方法而无需模拟鼠标事件进行测试。
为了做到这一点,您需要一个良好分离的GUI和逻辑中间件。
您能否提供一些代码或有关在应用程序中调用鼠标事件的功能的更多信息呢?

鼠标事件基本上与组件中的选择有关。但即使我将事件处理程序减少到最低限度,我也不会在公共接口中公开从那里调用的方法。因此,我仍然必须调用受保护的方法,还是我理解错了什么? - jpfollenius
这并没有帮助。即使你已经将GUI和中间件分开,你的GUI代码仍然存在,仍然需要运行,并且仍然需要做正确的事情。这是一个关于GUI测试的一般性问题。 - David Heffernan
@David:你说得对,GUI必须进行测试,但不是使用UT,正如你所提到的,还有其他工具可以完成这项工作。将GUI和MW分离是将功能与UI分离的正确方法,也许在这种特殊情况下我们谈论的是一个可视化组件,但总体而言是正确的。 - CloudyMarble
@Smasher:如果您确实需要的话,仍然可以在具有测试的同一单元中派生您组件的新类,这样您就可以访问受保护方法。这对您的问题来说是否是一个可接受的解决方案呢? - CloudyMarble
1
@O.D 这就是Smasher所说的“受保护的黑客攻击”的意思。 - David Heffernan
哎呀!好疼啊!:) 没有注意到它。 - CloudyMarble

1

我认为你正在寻找一些自动化GUI测试。例如,你可以尝试Smart Bear的Test Complete

DUnit确实提供了一些基本的GUI测试设施(在GUITesting单元中),但我认为它可能不够全面满足你的需求。


我们已经使用Test Complete进行黑盒测试,但我尝试用一些单元测试来补充这些测试。在您看来,有没有不使用我的第二个建议的理由? - jpfollenius
@Smasher 如果我理解你的需求正确的话,我通常会将UI测试视为适合集成测试而不是单元测试的东西。你所描述的“黑盒测试”是否覆盖了这些事件处理程序? - David Heffernan
可能会有影响,但这不在我的直接控制范围内,所以我无法将其作为回归测试运行。而且我还需要合并两种方法的覆盖率,才能确定我真正覆盖了哪些部分。 - jpfollenius

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