accessibility - 在 Android Espresso 中进行可访问性测试时抑制失败的工作示例?
问题描述
我有这样的测试设置:
基类:
public class AccessibilityBase {
public static AccessibilityValidator accessibilityValidator;
@BeforeClass
public static void enableAccessibilityChecks() {
accessibilityValidator = AccessibilityChecks.enable();
accessibilityValidator.setThrowExceptionForErrors(true);
}
...
测试类:
public class LoginAccessibilityTest extends AccessibilityBase {
@Rule
public ActivityTestRule<LoginActivity> activityTestRule = new ActivityTestRule<>(LoginActivity.class, true, false);
private static Matcher<? super AccessibilityViewCheckResult> suppress = Matchers.anyOf(
allOf(matchesCheckNames(is("TouchTargetSizeViewCheck")),
matchesViews(withId(R.id.main_button_login)))
);
@BeforeClass
public static void enableAccessibilityChecks() {
accessibilityValidator = AccessibilityChecks.enable();
accessibilityValidator.setSuppressingResultMatcher(suppress);
}
@Test
public void testLoginActivity() {
Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();
Intent intent = new Intent(context, LoginActivity.class);
LoginActivity loginActivity = activityTestRule.launchActivity(intent);
// UPDATE: Had to pass suppress through here to the base class
runAllTests(loginActivity, suppress);
}
}
然而,当我运行它时,它仍然失败并显示以下错误消息:
java.lang.AssertionError: Button app:id/main_button_login: View 低于触摸目标的最小推荐大小。最小触摸目标尺寸为 48x48dp。实际尺寸为 446.0x45.0dp(屏幕密度为 3.0)。
更新:关键在我的 runAllTests 方法中。我通过将测试类中的抑制匹配器传递给 runAllTests() 来修复它
private static void runTests(Activity activity, Set<AccessibilityViewHierarchyCheck> checks, Matcher<? super AccessibilityViewCheckResult> suppress) {
List<AccessibilityViewCheckResult> results = new LinkedList<>();
View rootView = activity.findViewById(android.R.id.content);
for (AccessibilityViewHierarchyCheck check : checks) {
try {
results.addAll(check.runCheckOnViewHierarchy(rootView));
} catch (Exception ex) {
}
}
if (suppress != null) {
AccessibilityCheckResultUtils.suppressMatchingResults(results, suppress);
}
最后一点是必要的,即使我在测试的@BeforeClass 中设置了它。
解决方案
你永远不应该压制失败。
它在那里告诉你要纠正什么。
最小尺寸不是整体尺寸,它是每个方向的最小值(所以你可以有一个很高的1000dp
宽按钮,45dp
但你仍然会失败,因为高度不是最小值48dp
)
我知道这似乎3dp
没什么,但实际上它们是最低限度,你应该尝试超过它们。
想象一下,您患有帕金森氏病或脑瘫,您将无法准确击中小目标,这就是制定最低标准的原因。
让你的按钮稍微大一点,而不是试图消除错误(3dp
不可能破坏设计)。
您的每一位客户都会感谢您这样做。(想象一下有人在试图按下你的按钮的汽车中的乘客,同样的准确性原则。)
推荐阅读
- jquery - ASP.NET MVC 5 应用程序 - 如何在 ajax 发布后重定向到 URL?
- scala - EMR 总是给我找不到 Scala 应用程序的类
- python - 复制对象时,是否可以保持身份相同?
- python-2.7 - Python:导入从何而来?
- python - 在 Python 中的列表上/内部拆分
- leaflet - 我可以使用 Leaflet Draw 将图层添加到覆盖图层吗?
- node.js - 如何使用 multer 在 node.js 服务器中上传文件
- sql - 进行数百个数据库更新的正确方法?
- python - 将文本文件中列出的特定文件从源文件夹复制到目标文件夹
- ffmpeg - FFMpeg:如何使用 between() 选择最后一秒?