testes: por onde começar?
TRANSCRIPT
![Page 1: Testes: Por onde Começar?](https://reader034.vdocuments.site/reader034/viewer/2022042600/589cbea81a28ab8b018b5357/html5/thumbnails/1.jpg)
Testes: Por onde Começar?
Eduardo Carrara@DuCarrara
![Page 2: Testes: Por onde Começar?](https://reader034.vdocuments.site/reader034/viewer/2022042600/589cbea81a28ab8b018b5357/html5/thumbnails/2.jpg)
Por que criar testesAutomatizados?
![Page 3: Testes: Por onde Começar?](https://reader034.vdocuments.site/reader034/viewer/2022042600/589cbea81a28ab8b018b5357/html5/thumbnails/3.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022042600/589cbea81a28ab8b018b5357/html5/thumbnails/4.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022042600/589cbea81a28ab8b018b5357/html5/thumbnails/5.jpg)
então...
Por onde começar?
![Page 6: Testes: Por onde Começar?](https://reader034.vdocuments.site/reader034/viewer/2022042600/589cbea81a28ab8b018b5357/html5/thumbnails/6.jpg)
Comece PequenoTestes Unitários Rulez!
![Page 7: Testes: Por onde Começar?](https://reader034.vdocuments.site/reader034/viewer/2022042600/589cbea81a28ab8b018b5357/html5/thumbnails/7.jpg)
Del N on Flicker - CC BY 2.0
Escolha o MegazordExtraia a funcionalidadeCrie o testeRefatore
![Page 8: Testes: Por onde Começar?](https://reader034.vdocuments.site/reader034/viewer/2022042600/589cbea81a28ab8b018b5357/html5/thumbnails/8.jpg)
Seu primeiro Teste UnitárioInclua as dependênciasCrie os testesRode os Testes
![Page 9: Testes: Por onde Começar?](https://reader034.vdocuments.site/reader034/viewer/2022042600/589cbea81a28ab8b018b5357/html5/thumbnails/9.jpg)
Inclua as Dependências
dependencies { testCompile 'junit:junit:4.12' testCompile 'org.hamcrest:hamcrest-integration:1.3'}
![Page 10: Testes: Por onde Começar?](https://reader034.vdocuments.site/reader034/viewer/2022042600/589cbea81a28ab8b018b5357/html5/thumbnails/10.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022042600/589cbea81a28ab8b018b5357/html5/thumbnails/11.jpg)
Rode o Teste
![Page 12: Testes: Por onde Começar?](https://reader034.vdocuments.site/reader034/viewer/2022042600/589cbea81a28ab8b018b5357/html5/thumbnails/12.jpg)
Rode o Teste
/build/reports/tests
![Page 13: Testes: Por onde Começar?](https://reader034.vdocuments.site/reader034/viewer/2022042600/589cbea81a28ab8b018b5357/html5/thumbnails/13.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022042600/589cbea81a28ab8b018b5357/html5/thumbnails/14.jpg)
#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?](https://reader034.vdocuments.site/reader034/viewer/2022042600/589cbea81a28ab8b018b5357/html5/thumbnails/15.jpg)
MockingObjetos dublêsControle sobre o Comportamento e EstadoIsolamento da Unidade a ser Testada
![Page 16: Testes: Por onde Começar?](https://reader034.vdocuments.site/reader034/viewer/2022042600/589cbea81a28ab8b018b5357/html5/thumbnails/16.jpg)
MockitoAPI fácil de entenderConfiguração de comportamentos e StubsPermite a verificação de comportamentos
![Page 17: Testes: Por onde Começar?](https://reader034.vdocuments.site/reader034/viewer/2022042600/589cbea81a28ab8b018b5357/html5/thumbnails/17.jpg)
Mockito: Dependência
dependencies { testCompile 'org.mockito:mockito-core:2.+'}
![Page 18: Testes: Por onde Começar?](https://reader034.vdocuments.site/reader034/viewer/2022042600/589cbea81a28ab8b018b5357/html5/thumbnails/18.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022042600/589cbea81a28ab8b018b5357/html5/thumbnails/19.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022042600/589cbea81a28ab8b018b5357/html5/thumbnails/20.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022042600/589cbea81a28ab8b018b5357/html5/thumbnails/21.jpg)
Robolectric: Dependência
dependencies { testCompile 'org.robolectric:robolectric:3.0'}
![Page 22: Testes: Por onde Começar?](https://reader034.vdocuments.site/reader034/viewer/2022042600/589cbea81a28ab8b018b5357/html5/thumbnails/22.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022042600/589cbea81a28ab8b018b5357/html5/thumbnails/23.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022042600/589cbea81a28ab8b018b5357/html5/thumbnails/24.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022042600/589cbea81a28ab8b018b5357/html5/thumbnails/25.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022042600/589cbea81a28ab8b018b5357/html5/thumbnails/26.jpg)
AS 2.2 Preview 4: Espresso Recorder
![Page 27: Testes: Por onde Começar?](https://reader034.vdocuments.site/reader034/viewer/2022042600/589cbea81a28ab8b018b5357/html5/thumbnails/27.jpg)
AS 2.2 Preview 4: Espresso Recorder
![Page 28: Testes: Por onde Começar?](https://reader034.vdocuments.site/reader034/viewer/2022042600/589cbea81a28ab8b018b5357/html5/thumbnails/28.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022042600/589cbea81a28ab8b018b5357/html5/thumbnails/29.jpg)
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?](https://reader034.vdocuments.site/reader034/viewer/2022042600/589cbea81a28ab8b018b5357/html5/thumbnails/30.jpg)
“… if you are afraid to change something it is
clearly poorly designed.”- Martin Fowler
![Page 31: Testes: Por onde Começar?](https://reader034.vdocuments.site/reader034/viewer/2022042600/589cbea81a28ab8b018b5357/html5/thumbnails/31.jpg)
Eduardo Carrara
@DuCarrara
Obrigado!
github.com/ecarrara-araujo
![Page 32: Testes: Por onde Começar?](https://reader034.vdocuments.site/reader034/viewer/2022042600/589cbea81a28ab8b018b5357/html5/thumbnails/32.jpg)
Referências1. Building Effective Unit Tests by Android Documentation2. Primeiros Passos em Automação de Testes by Stefan Teixeira3. JUnit.org e Hamcrest.org4. The Difference Between Mocks and Stubs by Martin Fowler5. Mockito6. Robolectric7. Android Test Support Library8. Espresso Test Recorder Docs