搭建 WPF 上的 UI 自动化测试框架

简介:

   OEA 1.0-2.0 框架中,界面都是以 WPF 技术作为基础平台开发的。我们需要对开发出来的系统进行自动化测试,而 .NET 平台的自动化测试平台在公司内部还没有其它部门完成,所以我们在 2010 年的时候使用 Ruby + VS UIUnitTest 开发了一个 UI 自动化(UI Automation,以下简称为UIA)框架,估且称其为 UIA 1.0。UIA 1.0 完全由周金根搭建,相关的内容,大家可以参考他写的这几篇文章:

使用VS2010的CodedUI来做自己的自动化测试框架

IronRuby - 编写自动化测试脚本

信息系统开发平台OpenExpressApp:【OpenTest】 之 如何实现自动化测试框架

该测试平台已经实现了由测试人员编写易读的 UI 自动化测试代码以完成日常的自动化测试需求,已经比较易用。部门用了大概1年左右,随着时间的推移,也显露了它的一些的不足:

  1. 调试困难,维护成本大,难以添加新的 UIA 支持。
  2. 过程式的代码,不结构化。
  3. 测试人员开发不易,不支持编译期检查错误,重复代码过多。
  4. 一些语句性能较低。 
    例如,许多类似于:"页签.页签.按钮"的代码,导致多次查找、进入页签,性能较低。
  5. 不支持客户化。
  6. 测试环境部署困难。 
    只有一台测试服务器搭建了该环境,开发人员不能使用 UIA 来辅助自己进行自测。

鉴于以上缺点,11年10月份我们决定使用 .NET 环境来搭建整个 UIA 框架,而不再使用 Ruby,同时尽量兼容测试人员编写的历史代码以及 API 风格。

 

使用演示

 


 

    接下来,简单以我们目前的一个模块来说明一下 OEA 中的 UIA 是如何使用的。

测试人员会在 UIA 相应的工程中加入某个模块的 UIA 测试类,例如下图中的 PBS模板.cs 就是这个模块对应的测试:

image

其对应的代码如下:

 

class PBS模板 : GIX4测试用例
{
    protected override void 运行()
    {
        打开当前测试模块("模板管理.PBS模板");

        添加();
        进入窗口("添加记录", 添加记录窗口 =>
        {
            属性编辑器("编码").输入("AutoTest01");
            属性编辑器("名称").输入("自动化测试-PBS模板");
            属性编辑器("备注").输入("测试模板");
            点击按钮("确定");
            保存();
        });

        //# 3 编辑PBS树>>>>>等待对树当前行的支持<<<<<
        进入页签("PBS", PBS页签 =>
        {
            树型操作按钮通用测试();
            保存();

            进入页签("属性", 属性页签 =>
            {
                树型操作按钮通用测试();
                保存();

                进入页签("可选值", 可选值页签 =>
                {
                    添加();
                    列表().当前行().属性编辑器("可选值").输入("AutoTest");
                    保存();
                    复制添加();
                    保存();
                    按住Ctrl();
                    列表().选择行(0);
                    释放Ctrl();
                    删除();
                    保存();
                });
            });

            //#6 载入标准模板窗口中各页签
            点击按钮("载入标准模板");
            进入窗口("载入标准模板", 载入标准模板窗口 =>
            {
                页签("分部分项").单击();
                页签("措施项目").单击();
                页签("其它项目").单击();
                页签("规费税金").单击();

                点击按钮("确定");
            });
        });

        //#6 修改PBS模板信息
        点击按钮("修改");
        进入窗口("修改", 修改窗口 =>
        {
            属性编辑器("编码").输入("AutoTest01-1");
            属性编辑器("名称").输入("自动化测试-PBS模板-1");
            属性编辑器("备注").输入("测试模板-1");

            点击按钮("确定");
        });
        保存();
        删除并确定();
    }
}

 

UIA 测试环境就是一个简单的 WPF Applicatoin:

image

之前代码对应的软件运行时界面:

image

 

UIA 框架结构及相关重点


 

    在整个 OEA 框架中,UIA 框架是一个重要的组成部分。目前只是实现了 WPF 客户端的 UIA,Web 的 UIA 将会在需要时添加:

image image

OEA-UIA 的设计主要是基于 VS CodedUITest 中的核心类库,进行二次封装,提供更方便 OEA、更方便测试人员的的许多接口。引入如下类库:

image

其中的代码也不复杂,主要是在 WpfControl(继承自 UITestControl)的相关类型上添加一系列扩展方法,以下以一个按钮的点击为例:

 

public static WpfButton 按钮(this WpfControl context, string title = null)
{
    return context.Find<WpfButton>(title);
}

public static WpfControl 单击(this WpfControl control)
{
    control.EnsureClickable();
    control.WaitForControlEnabled();
    Mouse.Click(control);

    return control;
}

public static TControl Find<TControl>(this WpfControl context, string title = null)
    where TControl : WpfControl, new()
{
    //if (TestContext.Current.NeedCancel) Playback.Cancel();
    if (TestContext.Current.NeedCancel) throw new StopUIAException("停止自动化测试!");

    var control = new TControl();
    if (context != null)
    {
        control.Container = context;
    }

    if (!string.IsNullOrEmpty(title))
    {
        control.SearchProperties[WpfControl.PropertyNames.Name] = title;
    }

    return control;
}

 

这样,就可以在任何一个 WpfControl 容器上使用(例如页签 A) A.按钮(“添加”).单击() 了。

 

    这里,需要特别说明的是,其实 UIAutomationClient 以及 UIAutomationTypes 并不是 VS CodedUITest 独有的程序集,而是 Windows 平台上的自动化框架程序集,相关的内容,可以看 MSDN 中的《MSDN - Accessibility》。基于这个框架,理论上可以做 windows 平台上所有的应用程序的自动化测试。

在我们 UIA 中,Windows Automation API 用于一些更加底层的控件查找场景。这是因为使用 VS CodedUITest 的类库,有时候并不能找到想要的控件,同时也不能为 OEA WPF 程序做一些深度的定制。OEA 中目前现在开发的 Web 框架,也同样会使用它来构建 UIA。

 

 

 

 

总结


    其实这次重构并没有修改 UIA 1.0 版本的整个结构,主要是修改了语言环境为 .NET 环境,使得可以更加方便地添加各种功能,以及更好地和 OEA 框架整合。

 

BTW:    其实 OEA-UIA 已经在去年 11 月份就完成并应用,但是由于一直在开发 OEA 在 B/S 模式下的框架,所以迟迟没有发上来。不过最近 OEA-B/S 已经开发了个大概,借着写月度反思的机会,就把这篇文档写了写。欢迎交流。 :)

目录
相关文章
|
5天前
|
小程序 JavaScript 前端开发
小程序常见的UI框架
小程序常见的UI框架
|
7天前
|
Linux C# Android开发
一个开源、跨平台的.NET UI框架 - Avalonia UI
一个开源、跨平台的.NET UI框架 - Avalonia UI
|
7天前
|
搜索推荐 前端开发 C#
推荐7款美观且功能强大的WPF UI库
推荐7款美观且功能强大的WPF UI库
|
23天前
|
前端开发 测试技术 UED
【测试效率对比】深入分析:为何UI自动化测试的投资回报率通常低于接口自动化测试?
这篇文章深入分析了UI自动化测试与接口自动化测试的投资回报率(ROI)问题,指出UI自动化测试在某些情况下的ROI并不低,反驳了没有实施过UI自动化就轻易下结论的观点,并强调了实践的重要性和自动化测试在项目迭代中的作用。
44 1
|
1月前
|
C# 开发者 Windows
一款基于Fluent设计风格、现代化的WPF UI控件库
一款基于Fluent设计风格、现代化的WPF UI控件库
|
14天前
|
测试技术 C# 开发者
“代码守护者:详解WPF开发中的单元测试策略与实践——从选择测试框架到编写模拟对象,全方位保障你的应用程序质量”
【8月更文挑战第31天】单元测试是确保软件质量的关键实践,尤其在复杂的WPF应用中更为重要。通过为每个小模块编写独立测试用例,可以验证代码的功能正确性并在早期发现错误。本文将介绍如何在WPF项目中引入单元测试,并通过具体示例演示其实施过程。首先选择合适的测试框架如NUnit或xUnit.net,并利用Moq模拟框架隔离外部依赖。接着,通过一个简单的WPF应用程序示例,展示如何模拟`IUserRepository`接口并验证`MainViewModel`加载用户数据的正确性。这有助于确保代码质量和未来的重构与扩展。
26 0
|
14天前
|
vr&ar C# 图形学
WPF与AR/VR的激情碰撞:解锁Windows Presentation Foundation应用新维度,探索增强现实与虚拟现实技术在现代UI设计中的无限可能与实战应用详解
【8月更文挑战第31天】增强现实(AR)与虚拟现实(VR)技术正迅速改变生活和工作方式,在游戏、教育及工业等领域展现出广泛应用前景。本文探讨如何在Windows Presentation Foundation(WPF)环境中实现AR/VR功能,通过具体示例代码展示整合过程。尽管WPF本身不直接支持AR/VR,但借助第三方库如Unity、Vuforia或OpenVR,可实现沉浸式体验。例如,通过Unity和Vuforia在WPF中创建AR应用,或利用OpenVR在WPF中集成VR功能,从而提升用户体验并拓展应用功能边界。
28 0
|
14天前
|
C# 开发者 设计模式
WPF开发者必读:命令模式应用秘籍,轻松简化UI与业务逻辑交互,让你的代码更上一层楼!
【8月更文挑战第31天】在WPF应用开发中,命令模式是简化UI与业务逻辑交互的关键技术,通过将请求封装为对象,实现UI操作与业务逻辑分离,便于代码维护与扩展。本文介绍命令模式的概念及实现方法,包括使用`ICommand`接口、`RelayCommand`类及自定义命令等方式,并提供示例代码展示如何在项目中应用命令模式。
24 0
|
14天前
|
开发者 C# 存储
WPF开发者必读:样式与模板的艺术,轻松定制UI外观,让你的应用程序更上一层楼!
【8月更文挑战第31天】在WPF应用开发中,样式与模板是实现美观界面与一致性的关键工具。样式定义了控件如字体、颜色等属性,而模板则允许自定义控件布局与子控件,两者均可存储于`.xaml`文件中。本文介绍了样式与模板的基础知识,通过示例展示了如何创建并应用它们来改变按钮的外观,从而提升用户体验。
23 0
|
14天前
|
C# Windows 开发者
超越选择焦虑:深入解析WinForms、WPF与UWP——谁才是打造顶级.NET桌面应用的终极利器?从开发效率到视觉享受,全面解读三大框架优劣,助你精准匹配项目需求,构建完美桌面应用生态系统
【8月更文挑战第31天】.NET框架为开发者提供了多种桌面应用开发选项,包括WinForms、WPF和UWP。WinForms简单易用,适合快速开发基本应用;WPF提供强大的UI设计工具和丰富的视觉体验,支持XAML,易于实现复杂布局;UWP专为Windows 10设计,支持多设备,充分利用现代硬件特性。本文通过示例代码详细介绍这三种框架的特点,帮助读者根据项目需求做出明智选择。以下是各框架的简单示例代码,便于理解其基本用法。
54 0