Testar a acessibilidade do seu app (Views)

Conceitos e implementação do Jetpack Compose

O teste de acessibilidade ajuda você a entender como seu app funciona da perspectiva do usuário e a encontrar problemas de usabilidade que, de outra forma, não verificaria. Esse tipo de teste pode revelar oportunidades para tornar seu app mais eficiente e versátil para todos os usuários, incluindo pessoas com deficiências.

Este documento descreve as seguintes abordagens:

  • Testes com ferramentas de análise: use ferramentas para descobrir oportunidades de melhorar a acessibilidade do app.
  • Teste automatizado: ative o teste de acessibilidade no Espresso e no Robolectric.

Como testar usando ferramentas de análise

As ferramentas de análise podem revelar oportunidades de melhoria da acessibilidade que você perderia com o teste manual.

Scanner de acessibilidade

O app Scanner de acessibilidade analisa sua tela e sugere formas de melhorar a acessibilidade do seu app. Ele usa o Framework de teste de acessibilidade (link em inglês) e oferece sugestões específicas depois de analisar marcadores de conteúdo, itens clicáveis, contraste e muito mais.

O Framework de teste de acessibilidade está integrado ao Android Studio para ajudar você a encontrar problemas de acessibilidade nos seus layouts. Para iniciar o painel, clique no botão de relatório de erros ! no Layout Editor.

Demonstração do Scanner de acessibilidade Figura 1. Demonstração do Scanner de acessibilidade.

Para saber mais, consulte os seguintes recursos:

Visualizador do UI Automator

A ferramenta uiautomatorviewer oferece uma GUI conveniente para verificar e analisar os componentes de interface exibidos no momento em um dispositivo Android. Você pode usar o UI Automator para inspecionar a hierarquia de layouts e consultar as propriedades de componentes de interface visíveis no primeiro plano do dispositivo. Essas informações permitem criar testes mais refinados, por exemplo, um seletor de interface que corresponda a uma propriedade visível específica. A ferramenta está localizada no diretório tools do SDK do Android.

Nos testes de acessibilidade, essa ferramenta é útil para depurar problemas encontrados usando outros métodos de teste. Por exemplo, se o teste manual revelar que uma visualização não tem texto que possa ser falado ou que uma visualização recebe foco indesejadamente, você poderá usar a ferramenta para encontrar a origem do problema.

Para saber mais sobre o Leitor do UI Automator, consulte Criar testes automatizados com o UI Automator.

Lint

O Android Studio mostra avisos de lint para vários problemas de acessibilidade e fornece links para os locais relevantes no código-fonte. No exemplo a seguir, falta um atributo contentDescription na imagem. A descrição do conteúdo ausente resulta na seguinte mensagem:

[Accessibility] Missing 'contentDescription' attribute on image

A Figura 2 mostra um exemplo de como essa mensagem aparece no Android Studio:

Imagem que mostra o Android Studio relatando uma descrição de conteúdo ausente em algumas imagens.
Figura 2. Mensagem no Android Studio mostrando o atributo contentDescription ausente.

Testes automatizados

A Plataforma Android oferece suporte para vários frameworks de teste, como o Espresso, que permite criar e executar testes automatizados que avaliam a acessibilidade do app.

Espresso

O Espresso é uma biblioteca de testes do Android criada para fazer testes de interface de forma rápida e fácil. Ele permite que você interaja com componentes de interface em teste no seu app e declare que determinados comportamentos ocorrem ou que condições específicas são atendidas.

Para ter uma visão geral em vídeo dos testes de acessibilidade com o Espresso, assista ao vídeo a seguir do minuto 31:54 até o 34:19: Testes e design inclusivos: como tornar seu app mais acessível - Google I/O 2016.

Esta seção descreve como executar verificações de acessibilidade usando o Espresso.

Ativar verificações

Você pode ativar e configurar o teste de acessibilidade usando a classe AccessibilityChecks:

Kotlin

import androidx.test.espresso.accessibility.AccessibilityChecks

@RunWith(AndroidJUnit4::class)
@LargeTest
class MyWelcomeWorkflowIntegrationTest {
    init {
        AccessibilityChecks.enable()
    }
}

Java

import androidx.test.espresso.accessibility.AccessibilityChecks;

@RunWith(AndroidJUnit4.class)
@LargeTest
public class MyWelcomeWorkflowIntegrationTest {
    @BeforeClass
    public void enableAccessibilityChecks() {
        AccessibilityChecks.enable();
    }
}

Por padrão, as verificações são executadas quando você realiza qualquer ação de visualização definida em ViewActions. Cada verificação inclui a visualização em que a ação é realizada, bem como todas as visualizações descendentes. É possível avaliar toda a hierarquia de visualização de uma tela durante cada verificação passando true para setRunChecksFromRootView(), conforme mostrado no snippet de código a seguir:

Kotlin

AccessibilityChecks.enable().setRunChecksFromRootView(true)

Java

AccessibilityChecks.enable().setRunChecksFromRootView(true);

Suprimir subconjuntos de resultados

Depois que o Espresso executa verificações de acessibilidade, você pode encontrar várias oportunidades de melhorar a acessibilidade do seu app que não podem ser solucionadas imediatamente. Para evitar que os testes do Espresso falhem continuamente devido a esses resultados, ignore-os temporariamente. O Framework de testes de acessibilidade (ATF, na sigla em inglês) fornece essa funcionalidade usando o método setSuppressingResultMatcher() que instrui o Espresso a suprimir todos os resultados que satisfazem a expressão matcher escolhida.

Quando você faz modificações no app que contemplam um aspecto da acessibilidade, o Espresso pode mostrar resultados para o máximo possível de outros aspectos da acessibilidade. Por esse motivo, é recomendável suprimir apenas oportunidades conhecidas específicas de melhoria.

Quando você suprimir temporariamente os resultados do teste de acessibilidade que planeja resolver posteriormente, é importante não suprimir acidentalmente as descobertas parecidas. Por esse motivo, use matchers com escopo limitado. Para fazer isso, escolha um matcher para que o Espresso suprima determinado resultado somente se ele atender a cada uma das seguintes verificações de acessibilidade:

  1. Verificações de acessibilidade de um determinado tipo, como aquelas que verificam o tamanho da área de toque.
  2. Verificações de acessibilidade que avaliam um determinado elemento da interface, como um botão.

O ATF define vários matchers para ajudar você a definir quais resultados serão mostrados nos testes do Espresso. O exemplo a seguir suprime os resultados de verificações relacionadas ao contraste de cor de um único elemento TextView. O ID do elemento é countTV.

Kotlin

AccessibilityChecks.enable().apply {
        setSuppressingResultMatcher(
                allOf(
                    matchesCheck(TextContrastCheck::class.java),
                    matchesViews(withId(R.id.countTV))
                )
        )
}

Java

AccessibilityValidator myChecksValidator =
    AccessibilityChecks.enable()
        .setSuppressingResultMatcher(
            allOf(
                matchesCheck(TextContrastCheck.class),
                matchesViews(withId(R.id.countTV))));