Testar os Fragments do seu aplicativo

Os Fragments funcionam como contêineres reutilizáveis no seu aplicativo, permitindo que você apresente o mesmo layout de interface do usuário em várias atividades e configurações de layout. Considerando a versatilidade desses Fragments, é importante garantir que eles forneçam uma experiência consistente e eficiente em recursos:

  • A aparência do seu Fragment deve ser consistente entre as configurações de layout, incluindo as que são compatíveis com tamanhos de tela maiores ou a orientação paisagem do dispositivo.
  • Não crie uma hierarquia de visualização do Fragment, a menos que ele esteja visível para o usuário.

Este documento descreve como incluir APIs fornecidas pela estrutura nos testes que avaliam o comportamento de cada Fragment.

Direcionar o estado de um Fragment

Para ajudar a configurar as condições de realização desses testes, o AndroidX fornece uma biblioteca, FragmentScenario, para criar Fragments e alterar o estado deles.

Configurar o local do artefato de teste

Para usar FragmentScenario conforme pretendido, defina o artefato de teste do Fragment no APK de teste do seu aplicativo, conforme mostrado no seguinte snippet de código:

app/build.gradle

dependencies {
    // ...
    debugImplementation 'androidx.fragment:fragment-testing:1.1.0-alpha07'
}

Criar um Fragment

FragmentScenario inclui métodos para iniciar os seguintes tipos de Fragments:

Os métodos também são compatíveis com os seguintes tipos de Fragments:

  • Fragments gráficos, que contêm uma interface do usuário. Para lançar esse tipo de Fragment, chame launchFragmentInContainer(). FragmentScenario anexa o Fragment ao controlador de visualização raiz de uma atividade. Essa atividade de contenção está vazia.
  • Fragments não gráficos (às vezes chamado de Fragments sem cabeçalho), que armazenam ou executam processamento de curto prazo em informações incluídas em várias atividades. Para lançar este tipo de Fragment, chame launchFragment(). FragmentScenario anexa esse tipo de Fragment a uma atividade totalmente vazia, que não possui uma visualização raiz.

Depois de lançar um desses tipos de Fragments, FragmentScenario leva o Fragment de teste ao estado RESUMED. Esse estado indica que o Fragment está em execução. Se você estiver testando um Fragment gráfico, ele também será visível para os usuários. Assim, será possível avaliar as informações sobre os elementos da interface do usuário usando os Testes de IU Espresso.

Os snippets de código a seguir mostram como iniciar cada tipo de Fragment:

Exemplo de Fragment gráfico

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEventFragment() {
        // The "state" and "factory" arguments are optional.
        val fragmentArgs = Bundle().apply {
            putInt("selectedListItem", 0)
        }
        val factory = MyFragmentFactory()
        val scenario = launchFragmentInContainer<MyFragment>(
                fragmentArgs, factory)
        onView(withId(R.id.text)).check(matches(withText("Hello World!")))
    }
}

Exemplo de Fragment não gráfico

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEventFragment() {
        // The "state" and "factory" arguments are optional.
        val fragmentArgs = Bundle().apply {
            putInt("numElements", 0)
        }
        val factory = MyFragmentFactory()
        val scenario = launchFragment<MyFragment>(fragmentArgs, factory)
    }
}

Recriar o Fragment

Se um dispositivo tiver poucos recursos, o sistema poderá destruir a atividade que contém o Fragment, exigindo que o aplicativo o recrie quando o usuário retornar a ele. Para simular essa situação, chame recreate():

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEventFragment() {
        val scenario = launchFragmentInContainer<MyFragment>()
        scenario.recreate()
    }
}

Quando a classe FragmentScenario recria o Fragment de teste, o Fragment retorna ao estado do ciclo de vida em que estava antes de ser recriado.

Levar o Fragment a um novo estado

Nos testes de IU do seu aplicativo, geralmente basta iniciar e recriar o Fragment de teste. Em testes unitários mais refinados, no entanto, você também pode avaliar o comportamento do Fragment à medida que ele passa de um estado de ciclo de vida para outro.

Para levar o Fragment a um estado de ciclo de vida diferente, chame moveToState(). Este método é compatível com os seguintes estados como argumentos: CREATED, STARTED, RESUMED e DESTROYED. Essa ação simula uma situação em que a atividade que contém o Fragment muda de estado porque é interrompida por outro aplicativo ou por uma ação do sistema.

Veja um exemplo de uso de moveToState() exibido no código snippet a seguir:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEventFragment() {
        val scenario = launchFragmentInContainer<MyFragment>()
        scenario.moveToState(State.CREATED)
    }
}

Acionar ações no Fragment

Para acionar ações no seu Fragment de teste, use os correspondentes da visualização Espresso para interagir com elementos na sua visualização:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEventFragment() {
        val scenario = launchFragmentInContainer<MyFragment>()
        onView(withId(R.id.refresh))
                .perform(click())
    }
}

Se você precisar chamar um método no próprio Fragment, como responder a uma seleção no menu de opções, faça isso com segurança implementando FragmentAction:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEventFragment() {
        val scenario = launchFragmentInContainer<MyFragment>()
        scenario.onFragment(fragment ->
            fragment.onOptionsItemSelected(clickedItem) {
                // Update fragment's state based on selected item.
            }
        }
    }
}