自定义验证例程

本部分介绍如何为 UI 辅助功能检查器 (AccChecker) 工具创建自定义验证例程。

UI 辅助功能检查器 (AccChecker) 是一种辅助功能测试工具,旨在验证控件或应用程序 UI 中 Microsoft Active Accessibility (MSAA) 的实现。 MSAA 实现可能公开的高影响辅助功能问题通过一组内置的自动验证例程进行测试。 可以使用可扩展 AccChecker 平台通过自定义例程来增强这些本机验证例程。

创建自定义验证

自定义验证生成为类库 (DLL) ,用于实现包含一个成员Execute () 的单个接口 (IVerificationRoutine) :

void Execute(
    System.IntPtr hwnd, 
    AccCheck.Logging.ILogger logger, 
    bool AllowUI, 
    AccCheck.GraphicsHelper graphics
);

参数

hwnd

类型: System.IntPtr

正在验证的元素的 HWND。

记录

类型: AccCheck.Logging.ILogger

所选日志记录方法。 可能的类型包括 AccChecker 用来缓存所有日志条目的 累加Logger (,直到验证完成) 、ConsoleLoggerTextFileLoggerXMLSerializingLogger

AllowUI

类型: bool

指示验证例程是否显示它正在测试的 UI。 通常在自动测试方案中设置为 false。

graphics

类型: AccCheck.GraphicsHelper

用于 AccChecker 中的屏幕截图和其他可视化效果。

自定义验证示例

以下示例是执行简单元素树深度检查的 C# 自定义验证。 如果元素树深度大于 50 个级别,则记录错误;如果元素树深度为 20 到 50 级别,则记录警告,否则将记录信息性消息。

using System;
using System.Collections.Generic;
using System.Text;
using AccCheck;
using AccCheck.Logging;
using AccCheck.Verification;

namespace VerificationRoutines
{
    \\ Verification routine attributes.
    \\ If these values are not specified, the verification will not be displayed in the 
    \\ AccChecker UI. However, it is still loaded and will be included in all subsequent 
    \\ verification runs since it cannot be unchecked and excluded.
    [Verification(
        // Title - the title of the verification routine.
        "Sample Check Tree Depth",
        // Description - this attribute is not currently displayed.
        "Checks that the accessibility tree isn't excessively deep.",
        // Group Title - the verification group to add the routine. This can be a new or 
        //  existing group.
        Group = "TreeDepthCheck"
        )]

    public class CheckTreeDepth : IVerificationRoutine
    {
        private const int S_OK = 0;
        private const int ERROR_TREE_DEPTH = 50;
        private const int WARNING_TREE_DEPTH = 20;
        private int _depth = 0;

        private void TraverseTree(Accessible parent, int level)
        {
            if (level > _depth)
            {
                _depth = level;
            }

            // never go deeper than ERROR_TREE_DEPTH, that's a sign of a loop
            if (_depth > ERROR_TREE_DEPTH)
            {
                return;
            }

            Accessible[] children;
            if (parent.Children(out children) == S_OK)
            {
                foreach (Accessible child in children)
                {
                    TraverseTree(child, level + 1);
                }
            }
        }

        public void Execute(IntPtr hwnd, ILogger logger, bool AllowUI, 
                GraphicsHelper graphics)
        {
            Accessible root;
            if (Accessible.FromWindow(hwnd, out root) == S_OK)
            {
                TraverseTree(root, 0);
            }
            else
            {
                return;
            }

            if (_depth >= ERROR_TREE_DEPTH)
            {
                logger.Log(new LogEvent(EventLevel.Error, "DepthCheck", String.Format(
                    "The tree is too deep; the tree is {0} levels deep", _depth), "", 
                    System.Drawing.Rectangle.Empty, this.GetType()));
            }
            else if (_depth >= WARNING_TREE_DEPTH)
            {
                logger.Log(new LogEvent(EventLevel.Warning, "DepthCheck", String.Format(
                    "The tree might be too deep; the tree is {0} levels deep", _depth), "", 
                    System.Drawing.Rectangle.Empty, this.GetType()));
            }
            else
            {
                logger.Log(new LogEvent(EventLevel.Information, "DepthCheck", String.Format(
                    "The tree is {0} levels deep", _depth), "", 
                    System.Drawing.Rectangle.Empty, this.GetType()));
            }
        }
    }
}

注意

帮助文档中包含包含验证示例代码的Microsoft Visual Studio解决方案。 这些文件位于 AccChecker 安装路径中。

 

使用自定义验证

本部分介绍如何将自定义验证合并到 AccChecker 测试方案中。

AccChecker 图形用户界面 (GUI)

若要在 AccChecker 应用程序中包括自定义验证例程,只需在“文件”菜单中单击“打开 DLL”,然后找到例程的 DLL。 自定义例程将添加到“选择验证例程”窗格中验证列表底部。

以下屏幕截图显示了添加到 AccChecker 的示例检查树深度自定义验证。

sample check tree depth custom verification routine added to the accchecker ui

注意

如果未在自定义验证例程中指定验证属性值,验证仍会加载到 AccChecker 中,即使它未显示在 UI 中。 由于它未显示在 UI 中,因此无法取消选中它,并且无法将其从后续验证运行中排除。

 

AccChecker 自动化

将自定义验证例程合并到自动化 AccChecker 框架中非常简单,只需添加验证 DLL 并启用所需的验证例程。

以下代码片段演示如何使用 AccChecker API 在Windows防火墙控制面板应用程序中测试制表符功能。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AccCheck.Logging;

public class TestCases : TestBase
{
    public void AccessibilityTestCase()
    {
        //  Get our user interface ready for AccChecker.
        Setup();

        //  AccChecker's class representing verifications that you can run.
        AccCheck.Verification.VerificationManager vm = new AccCheck.Verification.VerificationManager();

        //  Create a console logger to get output in the console.
        ConsoleLogger consoleLogger = new ConsoleLogger();

        //  Add the AccChecker Console Logger.
        vm.AddLogger(consoleLogger);

        //  Disable all verifications; all verifications are enabled by default.
        vm.DisableVerifications(AccCheck.Verification.VerificationFilter.All);

        // Add a custom verification DLL.
        vm.AddVerificationDll("CheckTreeDepthVerification.dll");
        
        // Enable the routine we want to run.
        vm.EnableRoutine("Sample Check Tree Depth");

        //  Run the verification routine against the firewall.
        vm.ExecuteEnabled(_fireWallHwnd);

        //  Check the logger to see if the verification failed.
        if (consoleLogger.ErrorCount > 0)
        {
            Console.WriteLine("Test failed!");
            Console.WriteLine("Error count = " + consoleLogger.ErrorCount);
        }

        // Clean up the user interface.
        Cleanup();
    }
}

注意

帮助文档中包含包含验证示例代码的 Microsoft Visual Studio 2008 解决方案。 这些文件位于 AccChecker 安装路径中。

 

UI 辅助功能检查器