65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Guia 进行自动化 UI 测试

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.67/5 (5投票s)

2010年7月1日

CPOL

3分钟阅读

viewsIcon

42338

downloadIcon

666

通过 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 看起来像这样

guia_1.gif

在测试用例中,我们想模拟一个用户执行以下操作

  1. 输入姓名
  2. 输入名字
  3. 选择一个国家
  4. 调用按钮“添加”

在此过程之后,测试用例应验证是否已正确添加人员。

  1. 检查数据网格中是否有新条目
  2. 检查新条目的单元格是否包含预期的数据

现在,我们使用 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) 非常简单明了,此处未发布。 但是,它在示例项目中可用。 现在,我们想将视图模型设置为 UserControlDataContext。 为此,我们在测试用例中初始化 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 UserControlGuia 还提供了自动化和测试整个应用程序的可能性。 例如,此功能可用于编写自动验收测试。

以下代码启动并测试整个应用程序。 示例应用程序显示一个名为“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 日:首次发布
© . All rights reserved.