A11yUITests 1.1.0

A11yUITests 1.1.0

Rob Whitaker维护。



A11yUITests

Version License Platform ko-fi Twitter

A11yTests 是对 XCTestCase 的扩展,用于添加可运行为 XCUI 测试套件一部分的常见可访问性测试。

测试既可以单独运行,也可以集成到现有的 XCUI 测试中。

使用这些测试

好的可访问性不在于勾选框和各种法规和指南的符合性,而在于用户如何体验您的应用。您只有让真实的人使用它,才能知道您的应用是否真正可访问。将这些测试视为可能改进的提示,并使用它们来检测回归。

这些测试的失败应该被视为需要进一步调查的警告,而不是严格的失败。因此,我建议始终设置 continueAfterFailure = true

该库有两种类型的测试 - 断言快照。断言测试会检查每个元素的潜在可访问性失败。快照测试会创建您的应用的可访问性树的快照,并将其作为参考存储在未来的测试中。如果在未来的测试中可访问性树有所变化,测试将失败,表明您应该验证这些变化。不对可访问性树做出任何断言,只是检查自上次快照状态以来是否有任何变化。

失败分为两种类别:警告和失败。失败是对 WCAG 或 HIG 的违反。警告可能是可接受的,但需要调查。

在测试文件顶部添加 import A11yUITests

断言测试

断言测试检查每个单独的元素以确定潜在的可用性失败。

运行测试

测试可以单独运行,也可以以成套形式运行。

在所有元素上运行所有测试

func test_allTests() {
    XCUIApplication().launch()
    a11yCheckAllOnScreen()
}

指定测试/元素

要指定元素和测试,请使用a11y(tests: [A11yTests], on elements: [XCUIElement]),传入要运行的测试数组和要运行测试的元素数组。要运行所有按钮上的交互式元素测试,请

func test_buttons() {
    let buttons = XCUIApplication().buttons.allElementsBoundByIndex
    a11y(tests: a11yTestSuiteInteractive, on: buttons)
}

要在一个元素上运行单个测试,请传递包含测试和元素的数组。要检查按钮是否具有有效的辅助功能标签,请

func test_individualTest_individualButton() {
    let button = XCUIApplication().buttons["My Button"]
    a11y(tests: [.buttonLabel], on: [button])
}

忽略元素

在运行a11yCheckAllOnScreen()时,可以通过传递带有ignoringElementIdentifiers: [String]参数的任何要忽略的标识符来忽略元素。

测试套件

A11yUITests包含4个预构建测试套件,包含适合不同元素的测试。

a11yTestSuiteAll 运行所有测试。

a11yTestSuiteImages 运行适合图像的测试。

a11yTestSuiteInteractive 运行适合交互式元素的测试。

a11yTestSuiteLabels 运行适合静态文本元素的测试。

或者,您可以创建一个包含您想要运行的测试的A11yTests枚举值的数组。

测试

最小尺寸

minimumSize或检查元素至少为14px x 14px。严重程度:警告

注意:14px是随机的。

最小交互尺寸

minimumInteractiveSize检查可触摸元素至少为44px x 44px。这满足WCAG 2.1 成功标准 2.5.5 目标尺寸等级 AAA严重程度:错误

注意:许多苹果的控制未能通过这一要求。因此,当使用minimumInteractiveSize仅检查按钮和单元格时,这可能导致一些失败,例如对于UITabBarButton。为了完全合规,您应该在用户可能与之交互的任何元素上运行a11yCheckValidSizeFor(interactiveElement: XCUIElement),例如滑块、步进器、开关、分段控件。但是您需要创建自己的子类,因为苹果的不严格遵守WCAG。

标签存在性

labelPresence检查元素有一个至少有2个字符长度的无障碍标签。通过传递minMeaningfulLength参数到a11yCheckValidLabelFor(element: XCUIElement, minMeaningfulLength: Int)来改变最小长度。这计入了WCAG 2.1 指南 1.1 文本替代,但不保证合规。严重程度:警告

按钮标签

buttonLabel 检查交互元素标签,确保首字母大写且不包含句号或“按钮”这个词。同时,标签长度至少为2个字符。通过向 a11yCheckValidLabelFor(interactiveElement: XCUIElement, minMeaningfulLength: Int ) 传递 minMeaningfulLength 参数来更改最小长度。这遵循了 Apple的编写可访问性标签指南。严重性:错误

注意:此测试未本地化。

图像标签

imageLabel 检查可访问的图像标签不包含“图像”、“图片”、“图形”或“图标”等词,并检查标签未重复使用图像文件名。检查标签长度至少为2个字符。向 a11yCheckValidLabelFor(image: XCUIElement, minMeaningfulLength: Int ) 传递 minMeaningfulLength 参数来更改最小长度。这遵循了 Apple的编写可访问性标签指南。在决定是否使图像可访问时,应谨慎行事,以避免创建不必要的噪音。严重性:错误

注意:此测试未本地化。

标签长度

labelLength 检查可访问性标签长度 ≤ 40 个字符。这遵循了 Apple的编写可访问性标签指南。理想情况下,标签应该尽可能短,同时保留意义。如果您觉得元素需要更多上下文,请考虑添加可访问性提示。严重性:警告

标题

header 检查屏幕上至少有一个具有标题特征的文本元素。标题由语音Over用户用来定位并快速导航内容。这遵循了 WCAG 2.1 成功标准 2.4.10。严重性:错误

按钮特征

buttonTrait 检查按钮元素是否已应用“按钮”或“链接”特征。这遵循了 Apple使用特征指南。严重性:错误

图像属性

imageTrait 检查图像元素是否应用了图像属性。这遵循 Apple 使用属性的指南。严重程度:错误

冲突属性

conflictingTraits 检查元素是否不具有冲突属性。元素不能既是按钮又是链接,也不能是静态文本并频繁更新。

禁用元素

disabled 检查元素未被禁用。如果不清楚为什么元素被禁用,可能会令人困惑。理想情况下,应保持元素启用,并明确告知应用程序是否准备处理该动作。严重程度:警告

重复标签

duplicated 检查提供的所有元素以重复无障碍标签。重复的无障碍标签会使屏幕难以通过VoiceOver进行导航,并使Voice Control失败。理想情况下,应尽可能避免重复。严重程度:警告

快照测试

第一次运行时,快照会创建一个JSON表示的屏幕无障碍树。在随后的运行中,这个初始快照被用作参考。如果参考快照与当前快照之间有任何差异,则测试失败。没有断言表明无障碍树是正确或有效的,您必须自行进行检查,并生成一个已知良好的参考快照,以防止未来的退化。

运行测试

在您的UI测试中调用a11ySnapshot()。在首次运行时,由于此测试尚未创建快照,测试将失败。将生成参考快照。从失败消息中提供的URL获取参考快照或在其测试的XCResult中找到它。将其添加到您的UITest目标中,确保文件名与生成的json文件的filename属性匹配。随后的测试运行将与此快照进行比较,如果您想生成新的快照,请从您的UITest目标中移除参考,然后运行测试,将生成新参考。

测试

快照测试会检查以下内容的变化

  • 无障碍标签
  • 框架
  • 启用状态
  • 控件类型
  • 无障碍特性

示例

要运行示例项目,请从Example目录首先克隆仓库,然后运行pod install

A11yUITests_ExampleUITests.swift 包含示例测试,展示了上述每个测试的失败情况。

需求

iOS 11

Swift 5

安装

Swift Package Manager

此库支持Swift Package Manager。确保将包添加到您的UITests目标中,而不是应用程序的目标中。

Cocoapods

A11yUITests可通过CocoaPods获得。要安装,请将pod添加到您的podfile中的目标测试目标。例如

target 'My_Application' do
    target 'My_Application_UITests' do
    pod 'A11yUITests'
    end
end

注意

  • 此库访问iOS SDK中的私有属性,因此在添加到项目时应小心,确保您不会分发此代码。如果您提交此代码进行应用程序审查,您很可能会收到Apple的拒绝。
  • 此库使用NSObject的value(forUndefinedKey:)方法的method swizzling来防范Apple在未来更改其私有API时可能发生的崩溃。在运行任何测试之后,对此函数的任何调用都将返回nil。这仅影响您的测试套件,不会影响您的应用程序。

已知问题

如果两个类型相同且具有相同标识符(例如,两个按钮都标记为'下一步'),则这会导致在某些iOS版本上测试崩溃。iOS 13存在此问题,但在iOS 15中已修复。

作者

Rob Whitaker,[email protected]
https://mobilea11y.com

许可证

A11yUITests 在 MIT 许可证下可用。有关更多信息,请参阅 LICENSE 文件。