自动化测试框架与UI控件的集成

在现代软件开发中,自动化测试是确保产品质量的重要手段。尤其是对于基于Windows的应用程序,UI自动化测试框架提供了一种程序化的方式来访问和控制用户界面元素。本文将探讨如何将UI自动化测试框架与自定义UI控件集成,以及如何创建一个可以跨控件重用的插件。

商业Windows应用程序的用户界面元素通常使用自定义用户控件来创建,这样做的原因包括:

  • 在整个产品和产品套件中提供统一的外观和感觉。
  • 通过采用软件重用,加快应用程序的开发速度。

这些应用程序在发布到市场之前必须经过广泛的测试,以满足质量验收标准。除了手动测试外,自动化测试也被用来在各种测试场景中运行应用程序。自动化测试的优势在于它可以长时间运行,连续几天不间断,以测试系统的功能和稳定性——这是仅使用手动测试难以实现的。

问题

市场上现有的自动化测试框架依赖于用于创建UI的Windows控件的可访问性。然而,如果UI是使用绘制的UI元素(而不是窗口控件)创建的,那么默认的可访问性可能不可用。在这种情况下,自动化测试框架将无法默认访问这些元素。要使这些元素通过自动化测试框架可访问,封装绘制UI元素的父控件需要实现一些规定的接口(由Microsoft .NET UI Automation框架指定)。由于这种可访问性不是默认提供的,控件的作者必须特别提供实现,这涉及到显著的额外开销。结果是,要么可访问性未实现,要么需要额外的努力来实现这种可访问性。前者意味着系统的某些测试区域的可测试性受到影响。后者意味着开发人员必须额外计划学习和实现UI元素的自动化启用功能。

本文目标

本文的目标是使控制开发人员能够以以下方式集成自动化可访问性:

  • 快速且易于实现。
  • 能够以最小的技术问题集成。
  • 能够以最小的自动化框架知识集成。
  • 不限制控件的设计和开发方式。
  • 可以重用于控件。

代码使用

以Microsoft .NET UI Automation(Microsoft Windows的可访问性框架)的运行时环境为例。UI Automation使辅助技术产品(如屏幕阅读器)能够向最终用户提供有关UI的信息,并通过标准输入以外的手段操纵UI。UI Automation还允许自动化测试脚本与UI交互,从而实现应用程序的UI驱动测试。要使所有UI元素可访问,必须实现特定的接口。在自动化测试期间,这些接口然后通过测试引擎以程序化的方式访问,测试引擎运行测试脚本。

插件框架设计

本文提出了设计一个自动化启用插件库,其引用可以插入到需要自动化启用的目标控件中。提出的自动化启用插件库将代表UI元素实现规定的接口。自动化启用插件库将在框架中提供单独的类,以通过实现所需的UI Automation框架接口来提供对控件及其子UI元素的访问。

每个用户控件将有一个单独的XML配置文件,以告知插件框架控件及其子UI元素根据其行为所需的接口。自动化启用插件将只向自动化测试框架公开这些行为。

插件库将使用控件及其子UI元素的API来公开行为。由于每个控件中定义的API可能不同,XML配置文件还将包含控件及其子UI元素的API映射细节。这个API映射细节将包含控件中插件可调用API的条目。例如,如果控件/对象的大小由字段'Bounds'定义,插件通过字段'BoundingRectangle'读取大小,XML映射文件将别名这两个条目,以便内部插件框架将使用'Bounds'字段来获取对象的大小。

自动化测试期间,一旦自动化启用插件获得用户控件的引用,它将读取相应的XML配置文件,并为该用户控件提供指定行为,以供自动化测试框架使用。

示例

例如,创建了一个自定义控件,涉及一个用户控件和一些类对象作为其子UI元素。因此,有两个主要类来构建用户控件,名为'MeasurementControl'和'MeasurementItem'。'MeasurementControl'类派生自'UserControl',充当宿主/父级以在其内显示UI元素。'MeasurementItem'类用于表示每个UI元素。

在Microsoft UI Automation Framework中,'AutomationElement'类代表UI Automation树中的UI Automation元素,并包含UI Automation客户端应用程序用作标识符的值。当'MeasurementControl'类实例传递给插件框架时,插件代表这些类实现'IRawElementProviderSimple'接口;这基本上用于识别一个'AutomationElement'(通常只有控件被识别为'AutomationElement')。

'MeasurementControl'派生自'UserControl',因此它被自动识别为'AutomationElement',但'MeasurementItem'实例默认不能被识别为'AutomationElement'。由于'MeasurementControl'类充当根,'MeasurementItem'类代表控件内的每个UI元素,内部插件为'MeasurementControl'类实现了'IRawElementProviderFragmentRoot'接口,为'MeasurementItem'类实现了'IRawElementProviderFragment'接口。如果控件表现为容器控件(包含其中的子UI元素),则需要这两个接口。这两个接口使每个'MeasurementItem'也作为一个单独的'AutomationElement',使其在视觉上和程序上都显得独特。

在插件框架中,'ControlProvider'类负责公开'MeasurementControl'类,'ObjectProvider'类负责公开'MeasurementItem'类。'IValueProvider'和'IExpandCollapseProvider'是UI Automation接口,需要实现某些行为。这些接口根据XML配置文件在'ControlProvider'和'ObjectProvider'类上实现。一个典型的XML配置文件如下所示:

MeasurementControl This is MeasurementControl user control Label Bounds Children true Label Label
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485