testes: por onde começar?

32
Testes: Por onde Começar? Eduardo Carrara @DuCarrara

Upload: eduardo-carrara-de-araujo

Post on 10-Feb-2017

166 views

Category:

Mobile


0 download

TRANSCRIPT

Page 1: Testes: Por onde Começar?

Testes: Por onde Começar?

Eduardo Carrara@DuCarrara

Page 2: Testes: Por onde Começar?

Por que criar testesAutomatizados?

Page 3: Testes: Por onde Começar?

Encontre a motivação certa para fazê-lo!Eliminar a parte chata do trabalhoQualidade de Vida do Time \o/Medo de mexer no código?Refatorar nem pensar?

Page 4: Testes: Por onde Começar?

Em momentos diferentes...Projetos Novos (do zero)Projetos Antigos (legados)Adicionando Novas FuncionalidadesDando Manutenção ao Código

Todos estamos

Page 5: Testes: Por onde Começar?

então...

Por onde começar?

Page 6: Testes: Por onde Começar?

Comece PequenoTestes Unitários Rulez!

Page 8: Testes: Por onde Começar?

Seu primeiro Teste UnitárioInclua as dependênciasCrie os testesRode os Testes

Page 9: Testes: Por onde Começar?

Inclua as Dependências

dependencies { testCompile 'junit:junit:4.12' testCompile 'org.hamcrest:hamcrest-integration:1.3'}

Page 10: Testes: Por onde Começar?

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

Page 11: Testes: Por onde Começar?

Rode o Teste

Page 12: Testes: Por onde Começar?

Rode o Teste

/build/reports/tests

Page 13: Testes: Por onde Começar?

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

Page 14: Testes: Por onde Começar?

#2 Cuidado com as DependênciasOutras unidades de códigoFrameworks e APIs de terceirosExternas como conexão, componentes de hardware etcAndroid

Page 15: Testes: Por onde Começar?

MockingObjetos dublêsControle sobre o Comportamento e EstadoIsolamento da Unidade a ser Testada

Page 16: Testes: Por onde Começar?

MockitoAPI fácil de entenderConfiguração de comportamentos e StubsPermite a verificação de comportamentos

Page 17: Testes: Por onde Começar?

Mockito: Dependência

dependencies { testCompile 'org.mockito:mockito-core:2.+'}

Page 18: Testes: Por onde Começar?

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

Page 19: Testes: Por onde Começar?

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

Page 20: Testes: Por onde Começar?

RobolectricTestes que dependem do Android na JVMProvê mocks e stubs ao Android SDKExecução mais rápida de testesDemora para disponibilizar versões mais recentes do SDK

Page 21: Testes: Por onde Começar?

Robolectric: Dependência

dependencies { testCompile 'org.robolectric:robolectric:3.0'}

Page 22: Testes: Por onde Começar?

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

Page 23: Testes: Por onde Começar?

Android Testing Support LibraryFerramentas específicas para testes de componentes AndroidAndroidJUnitRunner + JUnit4 Rules + Espresso + UIAutomatorMuito focado em testes de Interface do UsuárioEm geral compatível com Api Level 8 ou superiorUIAutomator é compatível com Api Level 18 ou superior

Page 24: Testes: Por onde Começar?

ATSL: Dependências

android { defaultConfig{ testInstrumentationRunner ”android.support.test.runner.AndroidJUnitRunner” }}

dependencies { androidTestCompile 'com.android.support.test:runner:0.5' androidTestCompile 'com.android.support.test:rules:0.5' androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2' androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'}

Page 25: Testes: Por onde Começar?

ATSL: Espresso@RunWith(AndroidJUnit4.class)public class TestEmptyLoanedBooksList {

private Context context;

@Rule public ActivityTestRule<BookListActivity> activityRule = new ActivityTestRule<>(BookListActivity.class);

@Before public void setUp() { this.context = getTargetContext(); clearTestData(); }

@Test public void simpleTestEmptyStateOfLoanedBooksList() { onView(withId(R.id.loaned_book_list_view)).check(matches(not(isDisplayed()))); onView(withId(R.id.empty_book_list_icon)).check(matches(isDisplayed())); }}

Local: <caminho para seu projeto>/app/src/androidTest/java

Page 26: Testes: Por onde Começar?

AS 2.2 Preview 4: Espresso Recorder

Page 27: Testes: Por onde Começar?

AS 2.2 Preview 4: Espresso Recorder

Page 28: Testes: Por onde Começar?

AS 2.2 P4 Espresso RecorderÉ um pouco lento para capturar os eventosBastante prático para criar asserçõesAinda não lida com transições e loading entre Activities/FragmentsBom para gerar o código inicial do teste de UI

Page 29: Testes: Por onde Começar?

Pensamentos FinaisAutomatizar testes é algo muito complexoTenha paciência e comece pequenoOs testes unitários são a base de uma boa suite de testesPratique!

Page 30: Testes: Por onde Começar?

“… if you are afraid to change something it is

clearly poorly designed.”- Martin Fowler

Page 31: Testes: Por onde Começar?

Eduardo Carrara

@DuCarrara

Obrigado!

github.com/ecarrara-araujo