【发布时间】:2010-11-16 23:25:49
【问题描述】:
我正在尝试自动测试 winform 应用程序。我在与测试代码相同的进程中运行它,因此很容易找到 .Net 控件并模拟用户对它们的操作。然而,我被一个消息框(使用标准 MessageBox.Show 方法创建)卡住了一点。如何获取它并模拟按下按钮?
【问题讨论】:
标签: c# .net winforms user-interface testing
我正在尝试自动测试 winform 应用程序。我在与测试代码相同的进程中运行它,因此很容易找到 .Net 控件并模拟用户对它们的操作。然而,我被一个消息框(使用标准 MessageBox.Show 方法创建)卡住了一点。如何获取它并模拟按下按钮?
【问题讨论】:
标签: c# .net winforms user-interface testing
我建议治疗基础疾病而不是症状。 花几分钟阅读这些
简而言之,使用一个界面来分离所有模态对话框弹出窗口——这对于 UI 测试自动化来说是个难题。然后,您可以替换不执行任何操作或返回预定测试值的接口的模拟实现。真正的实现当然会以模态方式弹出实际的对话框......像这样(来自第二个链接)
public class UserInterrogator : IUserInterrogator
{
private Form owner;
public UserInterrogator(Form owner)
{ this.owner = owner; }
public Font GetFontFromUser() // member of the IUserInterrogator interface
{
FontDialog fd = new FontDialog();
fd.ShowDialog( owner );
return fd.Font;
}
}
更简单的方法当然是编写一些代码来找到对话框并关闭/杀死它。我看到有些人在 Win32 API 和 NUnitForms 方面取得了一些成功......
【讨论】:
codeplex.com/white - 免费
testautomationfx.com - 商业但非常好
【讨论】:
您可能必须使用 WinAPI 调用(FindWindowEx 等)并将 LMB 消息向下和向上发送到按钮句柄。
【讨论】:
如果您知道标题(并且它是唯一的),您可以循环通过 Application.OpenForms 找到它。
【讨论】:
最好的免费工具之一是AutoHotKey。
【讨论】:
您可以使用autoit脚本系统。
但我建议将 GUI 和实现分开,因为单元测试的基本原则是“单元”,其中单元是与其他类或现实世界分离的类。
这一原则为您提供了良好的类设计,并有助于避免软件爆发和许多其他好东西..
【讨论】: