使用 Guia 进行自动化 UI 测试






4.67/5 (5投票s)
通过 UI 自动化对 WPF 用户控件进行单元测试
引言
Guia 是一个用于 .NET 的开源库,它支持 WPF 应用程序的自动化。 该库允许以简单舒适的方式访问和远程控制各种 WPF 组件。 因此,它可以轻松地用于自动化 UI 测试。 一个显着的特点是可以直接运行和测试 WPF 窗口和 UserControl
,而无需事先创建可执行应用程序(EXE 文件)。 这使得可以在开发期间编写 GUI 的测试用例,从而以一种连贯的方式追求测试驱动的方法。
Guia (图形用户界面自动化) 库可在 http://guia.codeplex.com 获取.
Using the Code
假设您有一个复杂的 WPF UserControl
。 应通过自动 UI 测试证明 UserControl
的正确性。 也许您也使用 MVVM 模式。 在这种情况下,您可能还想测试从视图(UserControl
)到视图模型以及从视图模型到视图的数据绑定。 由于您遵循测试驱动的方法,因此应独立测试这些内容。
编写一个使用模拟用户操作的测试
在以下示例中,我们将为一个简单的 WPF UserControl
编写一个测试用例。 UserControl
能够将新人员添加到表中。 UserControl
的名称是“PersonUserControl
”。 此处未发布 XAML 代码,但可以下载。
UserControl
看起来像这样

在测试用例中,我们想模拟一个用户执行以下操作
- 输入姓名
- 输入名字
- 选择一个国家
- 调用按钮“添加”
在此过程之后,测试用例应验证是否已正确添加人员。
- 检查数据网格中是否有新条目
- 检查新条目的单元格是否包含预期的数据
现在,我们使用 MSTest 设置一个单元测试。 首先,我们必须启动我们的 UserControl
。 由于必须在每次测试用例执行之前执行此操作,因此我们为此目的编写一个 initialize
方法
CustomControl control = null;
[TestInitialize()]
public void MyTestInitialize()
{
this.control = CustomControl.Start<PersonUserControl>();
}
既然我们已经启动了 User-Control,我们还需要停止它。 我们在清理方法中执行此操作
[TestCleanup()]
public void MyTestCleanup()
{
control.Stop();
}
现在,我们可以开始编写测试用例,模拟用户添加新人员。
[TestMethod]
public void TestAddPerson()
{
control.Get<TextBox>("txtFirstname").Value = "Roger";
control.Get<TextBox>("txtName").Value = "Smith";
control.Get<ComboBox>("cmbNationality").GetItem("Switzerland").Select();
control.Get<Button>("btnAdd").Invoke();
DataGrid_WpfToolkit dataGrid = control.Get<DataGrid_WpfToolkit>("dataGrid");
Assert.AreEqual("Smith", dataGrid[0, 0].TextValue);
Assert.AreEqual("Roger", dataGrid[0, 1].TextValue);
Assert.AreEqual("Switzerland", dataGrid[0, 2].TextValue);
}
当我们现在执行测试用例时,我们会注意到在后台打开一个窗口,并且输入定义的数据并执行操作。
编写测试以检查数据绑定
我们使用 MVVM 模式,以便每个视图(UserControl
)都有一个视图模型。 现在,我们想测试视图模型到视图的正确绑定。 首先,我们需要 UserControl
的视图模型。 这个视图模型 (PersonUserControlViewModel
) 非常简单明了,此处未发布。 但是,它在示例项目中可用。 现在,我们想将视图模型设置为 UserControl
的 DataContext
。 为此,我们在测试用例中初始化 UserControl
时使用一个动作
CustomControl control = null;
PersonUserControlViewModel viewModel = null;
[TestInitialize()]
public void MyTestInitialize()
{
this.viewModel = new PersonUserControlViewModel();
this.control = CustomControl.Start((c) => c.DataContext = viewModel);
}
首先,我们要验证从 GUI 中的用户输入的数据是否也在视图模型中可用
[TestMethod]
public void TestDataBindingGUI2VM()
{
control.Get<TextBox>("txtFirstname").Value = "Roger";
control.Get<TextBox>("txtName").Value = "Smith";
control.Get<ComboBox>("cmbNationality").GetItem("Switzerland").Select();
Assert.AreEqual("Roger", viewModel.Firstname);
Assert.AreEqual("Smith", viewModel.Name);
Assert.AreEqual("Switzerland", viewModel.Nationality);
}
您会看到,此测试成功了。
现在,我们想验证相反的情况。 如果视图模型已更改,则 GUI 也应立即更新。
[TestMethod]
public void TestDataBindingVM2GUI()
{
viewModel.Firstname = "Roger";
viewModel.Name = "Smith";
viewModel.Nationality = "Switzerland";
Assert.AreEqual("Roger", control.Get<TextBox>("txtFirstname").Value);
Assert.AreEqual("Smith", control.Get<TextBox>("txtName").Value);
Assert.AreEqual("Switzerland",
control.Get<ComboBox>("cmbNationality").SelectedItem.TextValue);
}
为整个应用程序编写测试
到目前为止,我们只测试了 WPF UserControl
。 Guia 还提供了自动化和测试整个应用程序的可能性。 例如,此功能可用于编写自动验收测试。
以下代码启动并测试整个应用程序。 示例应用程序显示一个名为“Sample Main Window”的窗口,其中包含先前介绍的 UserControl
。
[TestMethod]
public void TestEntireApp()
{
// Init
Application app = Application.Start(@"C:/Sample.exe");
Window window = app.GetWindowByName("Sample Main Window");
// Simulate user interactions
window.Get<TextBox>("txtFirstname").Value = "Roger";
window.Get<TextBox>("txtName").Value = "Smith";
window.Get<ComboBox>("cmbNationality").GetItem("Switzerland").Select();
window.Get<Button>("btnAdd").Invoke();
DataGrid_WpfToolkit dataGrid = window.Get<DataGrid_WpfToolkit>("dataGrid");
// Assertions
Assert.AreEqual("Smith", dataGrid[0, 0].TextValue);
Assert.AreEqual("Roger", dataGrid[0, 1].TextValue);
Assert.AreEqual("Switzerland", dataGrid[0, 2].TextValue);
}
更多示例和代码片段可以在官方文档中找到。
历史
- 2010 年 7 月 1 日:首次发布