Skip to main content

Leonardo Murça

Como acessar arquivos de teste de diferentes pacotes de teste (Unit e Instrumented) em Android

Publicado em 19 de fevereiro, 2022

Última atualização 24 de março, 2024

Arara-canindé com uma asa aberta

Fig. 1 - Arara-canindé com uma asa aberta.

TL;DR

Crie um diretório chamado testCommon e adicione o trecho de código abaixo ao seu arquivo build.gradle.

android {
    ...
    sourceSets {
        test { java.srcDirs += src/testCommon }
        androidTest { java.srcDirs += src/testCommon }
      }
  }

Você já esteve em uma situação em que precisa acessar arquivos utilitários tanto do pacote test quanto do androidTest? Se sim, este artigo pode ser útil para você.

Digamos que você tenha um arquivo chamado Placeholders.kt no qual você usa seus valores como test doubles para seus testes de unidade.

Nosso cenário de teste neste caso será o retorno Success do método login de uma classe chamada LoginUseCaseImpl.

Por exemplo:

// test/Placeholders.kt
object Placeholders {
    const val email = "johndoe@email.com"
    const val password = "strongpassword123"
  }

// test/LoginUseCaseImplTest.kt
class LoginUseCaseImplTest {

    private val loginUseCase = LoginUseCaseImpl()

    @Test
    fun `when call login should return Success`() {
        // Arrange
        val email = Placeholders.email
        val password = Placeholders.password

        // Act
        val result = loginUseCase.login(email, password)

        // Assert
        assertEquals(Success, result)
    }
}

Agora, precisamos escrever Testes instrumentados usando Espresso para validar o fluxo de login completo. O cenário é: ao preencher os campos de e-mail e senha e tocar no botão de login então uma mensagem de sucesso será exibida.

// androidTest/LoginScreenInstrumentedTest.kt 
class LoginScreenInstrumentedTest {
    @Test
    fun when_fill_the_email_and_password_fields_and_tap_the_login_button_then_a_success_message_will_display() {
        // Arrange
        val email = Placeholders.email
        val password = Placeholders.password

        // When fill email and password fields
        onView(withId(R.id.email_field)).perform(ViewActions.typeText(email))
        onView(withId(R.id.password_field)).perform(ViewActions.typeText(password))

        // And tap the login button
        onView(withId(R.id.login_button)).perform(ViewActions.click())

        // Then a success message will display.
        onView(withId(R.id.success_message)).check(matches(isDisplayed()))
    }
}

Por padrão, o teste utilizando o Espresso estará dentro do pacote androidTest, mas nosso Placeholders.kt está disponível apenas dentro do pacote test, no qual nosso LoginUseCaseImplTest também está localizado. Portanto, o Teste Instrumentado acima não encontrará o Placeholders.kt.

Para permitir que ambos os testes acessem o mesmo arquivo, precisamos criar um novo pacote dentro do src que iremos colocar o Placeholders.kt. Neste exemplo, vamos nomeá-lo como testCommon. Depois disso, precisamos dizer ao gradle para considerar este novo pacote como um pacote test e androidTest. Colocaremos o código abaixo em nosso arquivo build.gradle:

android {
    ...
    sourceSets {
        test { java.srcDirs += src/testCommon }
        androidTest { java.srcDirs += src/testCommon }
      }
  }

É isso! Agora ambos os pacotes de teste poderão acessar nosso arquivo Placeholders.kt!