A11yUITests
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 文件。