首页 > 解决方案 > 在 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 中设置了它。

标签: accessibilityandroid-espressoandroid-accessibility

解决方案


你永远不应该压制失败。

它在那里告诉你要纠正什么。

最小尺寸不是整体尺寸,它是每个方向的最小值(所以你可以有一个很高的1000dp宽按钮,45dp但你仍然会失败,因为高度不是最小值48dp

我知道这似乎3dp没什么,但实际上它们是最低限度,你应该尝试超过它们。

想象一下,您患有帕金森氏病或脑瘫,您将无法准确击中小目标,这就是制定最低标准的原因。

让你的按钮稍微大一点,而不是试图消除错误(3dp不可能破坏设计)。

您的每一位客户都会感谢您这样做。(想象一下有人在试图按下你的按钮的汽车中的乘客,同样的准确性原则。)


推荐阅读