Muito tempo passou desde meu último post, espero conseguir manter um ritmo um pouco melhor a partir de agora.
Pretendo fazer uma série de posts sobre como testar aplicações Android. Pra começar, vou falar do Robolectric, uma ferramenta que, a meu ver, criou uma forma viável de fazer TDD com Android.
Antes do Robolectric, tínhamos que fazer testes usando um dispositivo e esperando enquanto a aplicação real era instalada e a aplicação de testes era instalada e executada. Isso inviabilizava a idéia de escrever um teste pra cada código do produto que vai ser escrito, como orienta o TDD.
Dito isso, vamos ao que interessa: código!
Estou assumindo que você já tem alguma experiência com Android e não irei entrar em detalhes da criação do projeto. Criei uma aplicação limpa no Android Studio (a versão atual é a 0.3.6). Essa aplicação está disponível aqui.
Usando o gradle
Lembrando que o Android Studio usa o Gradle pra montar as dependências e fazer o build da aplicação, nossos trabalhos começam no build.gradle
.
Para conseguirmos compilar o android, precisamos do plugin android
:
apply plugin: 'android'
E os seguintes detalhes da aplicação, que são criados automaticamente pelo Android Studio baseado nos seus passos na criação da App:
android {
compileSdkVersion 19
buildToolsVersion "19.0.0"
defaultConfig {
minSdkVersion 14
targetSdkVersion 18
}
buildTypes {
release {
runProguard true
proguardFile getDefaultProguardFile('proguard-android-optimize.txt')
}
}
productFlavors {
defaultFlavor {
proguardFile 'proguard-rules.txt'
}
}
}
Fazendo isso hoje, você vai descobrir que o plugin android
não é compatível com a última versão do gradle
:
Gradle version 1.8 is required. Current version is 1.9. If using the gradle wrapper, (...)
Pra adiandar, o plugin do Robolectric só é compatível com gradle 1.6
. Você deve instalá-lo e diminuir a versão do gradle usado também no build.gradle
. Isso é feito nas dependencies
do buildscript
:
dependencies {
classpath 'com.android.tools.build:gradle:0.5.+'
}
Feito isso podemos testar o build:
$ gradle build
(...)
:TutorialRobolectric:build
BUILD SUCCESSFUL
Total time: 9.245 secs
Ótimo! Com o build pronto, o próximo passo é criar uma classe de teste e colocar o Robolectric pra rodar.
Criando um teste
Verificando a aplicação básica criada, vemos que a única Activity
dela é a MainActivity
, que se parece com isso:
Um teste bem simples consiste em verificar se esse texto é realmente exibido. Pra isso, devemos criar dentro da pasta src
as pastas test/java
e nela devemos seguir a estrutura de pacotes igual a estrutura da aplicação real. Então criamos o teste:
@RunWith(RobolectricTestRunner.class)
public class MainActivityTest {
private MainActivity activity;
private TextView textView, fragmentTextView;
public static final String GREETINGS = "Hello world!";
@Before public void setUp() {
activity = Robolectric.buildActivity(MainActivity.class)
.create().get();
textView = (TextView) activity.findViewById(R.id.hello);
}
@Test public void shouldGreet() {
assertEquals(GREETINGS, textView.getText());
}
}
Adicionando o Robolectric
Pra conseguirmos rodar o Robolectric, precisamos adicionar o plugin gradle-android-test-plugin, desenvolvido pelo Jake Wharton, criador de várias boas bibliotecas pro Android.
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.5.+'
classpath 'com.squareup.gradle:gradle-android-test-plugin:0.9.+'
}
}
apply plugin: 'android'
apply plugin: 'android-test'
Último passo: adicionar a dependência do Robolectric. Infelizmente a última versão estável (2.2), não é compatível com o gradle. Estou usando um SNAPSHOT do 2.3. Para isso devemos adicionar o repositório dos snapshots deles:
maven {
url 'https://oss.sonatype.org/content/repositories/snapshots/'
}
E por fim:
dependencies {
testCompile 'junit:junit:4.11'
testCompile 'org.robolectric:robolectric:2.3-SNAPSHOT'
}
Agora basta rodar um último gradle build
e na etapa de teste ele irá gerar um relatório com os testes executados:
Qualquer dúvida, a versão final do código está disponível aqui.
E o build.gradle completo também!