Palestra Apresentada na The Developers Conference SP 2016.
Todos concordam que o teste de aplicações e soluções é fundamental para garantir a qualidade do produto para o usuário. Já a automação dos testes e do processo de qualidade da aplicação é um sonho que muitos times e desenvolvedores gostariam de atingir, então por que é tão difícil? Nesta palestra exploraremos dicas, ferramentas e práticas para começar a automatizar os testes de sua aplicação Android. Se você sempre quis fazer isso e não sabia por onde começar esta é a hora!
3. Encontre a motivação certa para fazê-lo!
Eliminar a parte chata do trabalho
Qualidade de Vida do Time o/
Medo de mexer no código?
Refatorar nem pensar?
4. Em momentos diferentes...
Projetos Novos (do zero)
Projetos Antigos (legados)
Adicionando Novas Funcionalidades
Dando Manutenção ao Código
Todos estamos
10. Crie o Teste
public class UtilityTest {
private static final String inputDateString = "20150403";
@Test
public void testIfGetFormattedMonthDayReturnExpectedFormat() throws Exception {
final String expectedDateFormat = "yyyy, MMMM dd";
final String expectedResult = (new SimpleDateFormat(expectedDateFormat))
.format(getExpectedDate());
String result = Utility.getFormattedMonthDay(expectedDateFormat, inputDateString);
//Hamcrest
assertThat("Date was not correctly formatted.", result, is(expectedResult));
//JUnit Puro
assertEquals("Date was not correctly formatted.", expectedResult, result);
}
}
Local: <caminho para seu projeto>/app/src/test/java
13. Dicas para criar seus Testes Unitários
#1 Foque em partes pequenas e independentes do código
#2 Cuidado com as Dependências
#3 Priorize partes críticas do sistema
#4 Extraia, Teste e Refatore
14. #2 Cuidado com as Dependências
Outras unidades de código
Frameworks e APIs de terceiros
Externas como conexão, componentes de hardware etc
Android
18. Mockito: Verificação de Comportamento
@RunWith(MockitoJUnitRunner.class)
public class ThreadExecutorTest {
private Executor executor;
@Before public void setUp() throws Exception {
this.executor = new ThreadExecutor();
}
@Test public void testSuccessfulInteractorExecution() {
Interactor interactor = mock(Interactor.class);
this.executor.execute(interactor);
verify(interactor).operation();
}
}
Local: <caminho para seu projeto>/app/src/test/java
19. Mockito: Stub de Estado
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class)
public class BookBorrowingContentProviderMapperTest {
@Before public void prepareTest() {
this.bookBorrowingContentProviderMapper = new BookBorrowingContentProviderMapper();
}
@Test public void testTransformEmptyCursorToBookBorrowing() throws Exception {
Cursor cursor = mock(Cursor.class);
when(cursor.moveToFirst()).thenReturn(false);
List<BookBorrowing> bookBorrowings =
this.bookBorrowingContentProviderMapper.transform(cursor);
assertThat(bookBorrowings, is(empty()));
}
}
Local: <caminho para seu projeto>/app/src/test/java
20. Robolectric
Testes que dependem do Android na JVM
Provê mocks e stubs ao Android SDK
Execução mais rápida de testes
Demora para disponibilizar versões mais recentes do SDK
22. Uso do Robolectric
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class)
public class BookBorrowingContentProviderMapperTest {
@Before public void prepareTest() {
this.bookBorrowingContentProviderMapper = new BookBorrowingContentProviderMapper();
}
@Test public void testTransformEmptyCursorToBookBorrowing() throws Exception {
Cursor cursor = mock(Cursor.class);
when(cursor.moveToFirst()).thenReturn(false);
List<BookBorrowing> bookBorrowings =
this.bookBorrowingContentProviderMapper.transform(cursor);
assertThat(bookBorrowings, is(empty()));
}
}
Local: <caminho para seu projeto>/app/src/test/java
23. Android Testing Support Library
Ferramentas específicas para testes de componentes Android
AndroidJUnitRunner + JUnit4 Rules + Espresso + UIAutomator
Muito focado em testes de Interface do Usuário
Em geral compatível com Api Level 8 ou superior
UIAutomator é compatível com Api Level 18 ou superior
28. AS 2.2 P4 Espresso Recorder
É um pouco lento para capturar os eventos
Bastante prático para criar asserções
Ainda não lida com transições e loading entre Activities/Fragments
Bom para gerar o código inicial do teste de UI
29. Pensamentos Finais
Automatizar testes é algo muito complexo
Tenha paciência e comece pequeno
Os testes unitários são a base de uma boa suite de testes
Pratique!
30. “… if you are afraid to
change something it is
clearly poorly designed.”
- Martin Fowler
32. Referências
1. Building Effective Unit Tests by Android Documentation
2. Primeiros Passos em Automação de Testes by Stefan Teixeira
3. JUnit.org e Hamcrest.org
4. The Difference Between Mocks and Stubs by Martin Fowler
5. Mockito
6. Robolectric
7. Android Test Support Library
8. Espresso Test Recorder Docs