在现代软件开发中,自动化测试是确保软件质量的关键步骤。对于Windows Presentation Foundation (WPF) 应用程序来说,自动化测试尤为重要,因为它们通常具有复杂的用户界面。本文将介绍如何使用Guia库来自动化WPF应用程序的测试。
Guia是一个用于WPF应用程序的图形用户界面自动化库。它允许开发者轻松地访问和远程控制各种WPF组件,非常适合用于自动化UI测试。Guia的一个显著特点是可以直接运行和测试WPF窗口和用户控件,而无需预先创建可执行应用程序(EXE文件)。这使得在开发过程中编写GUI测试用例成为可能,从而可以持续地采用测试驱动的开发方法。
Guia库可在以下网址获取:
假设有一个复杂的WPF用户控件(UserControl),希望通过自动UI测试来验证其正确性。也许还使用了MVVM模式,那么可能还想测试从视图(UserControl)到视图模型的数据绑定,以及反向绑定。由于遵循测试驱动的方法,这些都应该单独测试。
以下是一个简单的WPF用户控件的测试用例示例。该用户控件允许向表格中添加新人员。用户控件的名称为"PersonUserControl"。虽然XAML代码没有在这里展示,但可以从下载链接获取。
在测试用例中,希望模拟一个用户执行以下操作:
执行完这些操作后,测试用例应该验证人员是否正确添加。
现在,使用MSTest设置单元测试。首先,需要启动用户控件。由于这需要在每个测试用例执行之前完成,为此编写了一个初始化方法:
CustomControl control = null;
[TestInitialize()]
public void MyTestInitialize()
{
this.control = CustomControl.Start<PersonUserControl>();
}
启动用户控件后,还需要在测试完成后停止它。通过清理方法来实现这一点:
[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)都有一个视图模型。现在,希望测试视图模型到视图的正确绑定。首先,需要一个用户控件的视图模型。这个视图模型(PersonUserControlViewModel)相当简单,没有在这里展示,但可以在示例项目中找到。现在希望将视图模型设置为用户控件的DataContext。为此,在测试用例中初始化用户控件时使用一个动作:
CustomControl control = null;
PersonUserControlViewModel viewModel = null;
[TestInitialize()]
public void MyTestInitialize()
{
this.viewModel = new PersonUserControlViewModel();
this.control = CustomControl.Start<personusercontrol />((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用户控件。Guia还提供了自动化和测试整个应用程序的可能性。这个特性可以用来编写自动化验收测试。
以下代码启动并测试了整个应用程序。示例应用程序显示了一个名为"Sample Main Window"的窗口,其中包含了之前介绍的用户控件。
[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);
}