Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Testes de ponta a ponta

Palestra ministrada no Android Dev Conf em São Paulo dia 25/08/2017 por mim e pelo Eduardo Carrara falando sobre diversos tipos de teste para Android e como aplicá-los

Testes de ponta a ponta

  1. 1. Testes de Ponta a Ponta Eduardo Carrara - @DuCarrara Android Developer Elias Nogueira - @eliasnogueira Agile Coach @ Sicredi
  2. 2. Introdução
  3. 3. Unit Test Integration Test UI Test Pirâmide de Automação de Teste
  4. 4. Pipeline ideal para execução dos testes Análise Estática Testes Unitários Testes de Integração Testes de Serviços Testes de Aceitação Testes Funcionais Mock Execução Paralela Smoke Test
  5. 5. Testes Unitários Photo by Chad Kirchoff on Unsplash
  6. 6. Unidades de Trabalho Isoláveis de dependências Externas Possibilitam testes rápidos Pequenas como métodos ou grandes como conjuntos de classes Lembrete: Arrange, Act, Assert
  7. 7. Tipos de Testes Unitários (by The Art of Unit Testing) Value Based Testing Interaction Based Testing State Based Testing
  8. 8. Mocking Deve ajudar a lidar com as dependências de maneira simples Prover objetos dublês (mocks, stubs etc) Isolar a unidade a ser testada Fornecer controle sobre comportamento e estado
  9. 9. Code Time!
  10. 10. Value Based Unit Test @Test fun searchForBookBy_whenCalled_withValidISBN_returnsBookSuccessfully() { // Arrange val fakeISBN = "8575224123" val (bookCollectionToBeReturned, expectedBook) = getInputAndExpectedDataFrom(inputResource) val googleBooksRestApi: GoogleBooksRestApi = mock { on { searchVolumeData(any(), any()) } .doReturn( Single.just(bookCollectionToBeReturned)) } // Act and Assert GoogleBooksRestDataSource(googleBooksRestApi) .searchForBookBy(fakeISBN) .test().assertValue(expectedBook).assertComplete() }
  11. 11. State Based Unit Test @Test fun getByIsbn_whenCalled_withoutIsbnInCache_cachesBook() { // Arrange val fakeBook = getFakeBook() whenever(bookRemoteDataSource.searchForBookBy(fakeBook.isbn10)) .thenReturn(Maybe.just(fakeBook)) // Act bookCachedRepository.getByIsbn(fakeBook.isbn10).test().assertComplete() // Assert bookContentProviderCache[fakeBook.isbn10].test().assertComplete() .assertValue{ returnedBook -> assertSame(expected = fakeBook, real = returnedBook) } }
  12. 12. Interaction Based Unit Test @Test fun getByIsbn_whenCalled_withExistingIsbnInCache_neverCallsRemoteDataSource() { // Arrange val cachedFakeBook = insertFakeBookIntoCache() var remoteDataSourceWasTriggered = false onBookRemoteDataSourceSearchForBookByCompletedTriggers { remoteDataSourceWasTriggered = true } // Act bookCachedRepository.getByIsbn(cachedFakeBook.isbn10) .test().assertComplete() // Assert No Interaction assertThat(remoteDataSourceWasTriggered, `is`(false)) }
  13. 13. Robolectric + Mockito Tip of the Day @RunWith(RobolectricTestRunner::class) @Config(constants = BuildConfig::class) class BookCachedRepositoryTest { @get:Rule val mockitoRule = MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS) @get:Rule val robolectricVilibraProviderRule = RobolectricVilibraProviderRule() @Mock lateinit var bookRemoteDataSource: BookRemoteDataSource private val bookContentProviderCache = BookContentProviderCache(RuntimeEnvironment.application) private lateinit var bookCachedRepository: BookCachedRepository }
  14. 14. Testes Integrados Photo by Brady Holt on Wikimedia Mock Driver
  15. 15. Android Instrumentation Tests Quando não conseguimos nos livrar das dependências Não são tão rápidos nem tão simples como testes unitários Geralmente focados em testes funcionais baseados na UI Como seu usuário interage com o app?
  16. 16. Android Testing Support Library AndroidJUnitRunner + JUnit4 Rules + Espresso + UIAutomator Muito focado em testes de Interface do Usuário
  17. 17. Instrumentation Testing Robots Um Pattern com foco na organização dos testes Melhorar a legibilidade e manutenção dos testes Separar "o como testar" do "o que testar" Muito similar aos Page Objects Test (O que) Robot (O como) View Presenter (O como) Fake Model (O que)
  18. 18. Code Time!
  19. 19. Simple Espresso Test @Test fun whenOpened_withOneBookLending_displayBookLendingCorrectly_pureEspresso() { val fakeBook = testDataRule.fakeBook Espresso.onView( Matchers.allOf<View>( ViewMatchers.withId(R.id.book_name_text_view), ViewMatchers.hasSibling(ViewMatchers.withText(fakeBook.title)) )) .check(ViewAssertions.matches(ViewMatchers.isDisplayed())) Espresso.onView( Matchers.allOf<View>( ViewMatchers.withId(R.id.book_author_text_view), ViewMatchers.hasSibling(ViewMatchers .withText(fakeBook.authors.joinToString(","))))) .check(ViewAssertions.matches(ViewMatchers.isDisplayed())) }
  20. 20. Instrumentation Testing Robot (ITR) @Test fun whenOpened_withOneBookLending_displayBookLendingCorrectly() { val fakeBook = testDataRule.fakeBook lentBooks { checkForBookTitle(fakeBook.title) checkForBookAuthors(fakeBook.authors.joinToString(",")) } }
  21. 21. ITR - Internals fun lentBooks(func: LentBooksRobot.() -> Unit) = LentBooksRobot().apply { func() } class LentBooksRobot { fun checkForBookTitle(expectedTitle: String): LentBooksRobot { Espresso.onView( Matchers.allOf<View>( ViewMatchers.withId(R.id.book_name_text_view), ViewMatchers.hasSibling(ViewMatchers.withText(expectedTitle)) )) .check(ViewAssertions.matches(ViewMatchers.isDisplayed())) return this } }
  22. 22. ITR - Outro Exemplo @Test fun lendBookToContact() { val expectedIsbn = "8575224123" val expectedBookTitle = "Dominando o Android" lentBooks { addBookLending() } searchBook { fillIsbn(expectedIsbn) confirm() } bookDetails { checkForBookTitle(expectedBookTitle) checkForBookIsbn10("ISBN-10: $expectedIsbn") lend() } contacts { pickContact("Meu Irmao") } lentBooks { checkForBookTitle(expectedBookTitle) } ...
  23. 23. Testes de Aceitação Photo by TireRack.com
  24. 24. Page Objects Um Pattern com foco na organização dos testes Melhorar a legibilidade e manutenção dos testes Separar "o como testar" do "o que testar"
  25. 25. public void fillISBN(String isbnText) { isbn.sendKeys(isbnText); driver.hideKeyboard(); } public void clickInConfirm() { confirm.click(); } Transformar ações do usuário em código Page Objects
  26. 26. Scan Livro Preencher ISBN Emprestar Livro Selecionar contato Ver Detalhes Livro Teste de Aceitação (E2E) - Emprestar um livro a um contato
  27. 27. @Test public void leandABook() { MainPage mainPage = new MainPage(driver); mainPage.clickAddLeaging(); BookScanPage scan = new BookScanPage(driver); scan.fillISBN("8575224638"); BookDetailsPage details = new BookDetailsPage(driver); assertEquals("Dominando o Android 2ª edição", details.getBookTitle()); details.clickLeandThisBook(); ContactPage contactPage = new ContactPage(driver); contactPage.clickMenuSearchIcon(); mainPage = new MainPage(driver); assertEquals("Dominando o Android 2ª edição", mainPage.getBookName()); }
  28. 28. Photo by Rian MacGuire on PixelBay Testes Além do app
  29. 29. Testar os serviços (REST | WebService) Testar se endpoint está ativo Teste Funcional Teste de Contrato Teste de Aceitação (fluxo da API sem UI)
  30. 30. Pensamentos Finais Teste as engrenagens de forma isolada Testes as engrenagens em conjunto Foco nas interações dos usuários na aplicação Não esqueça de testar os seus serviços
  31. 31. Perguntas?
  32. 32. Eduardo Carrara @DuCarrara Obrigado! github.com/ecarrara-araujo Elias Nogueira @eliasnogueira github.com/eliasnogueira
  33. 33. Referências 1. Testing on Android Documentation by Android Developers 2. Android Testing Patterns Youtube Playlist 3. The Art of Unit Testing by Roy Osherove 4. Instrumentation Testing Robots by Jake Warthon 5. Page Objects by Martin Fowler 6. Test Pyramid 7. Page Objects 8. Android Tests by Goggle Samples 9. Android Testing Templates by Google Samples 10. Espresso Cheat Sheet Código https://github.com/ecarrara-araujo/vilibra https://github.com/eliasnogueira/vilibra-testing

×