Testes de ponta a ponta

33

Click here to load reader

Transcript of Testes de ponta a ponta

Page 1: Testes de ponta a ponta

Testes de Ponta a Ponta

Eduardo Carrara - @DuCarrara

Android Developer

Elias Nogueira - @eliasnogueira

Agile Coach @ Sicredi

Page 2: Testes de ponta a ponta

Introdução

Page 3: Testes de ponta a ponta

Unit Test

IntegrationTest

UITest

Pirâmide de Automação de Teste

Page 4: Testes de ponta a ponta

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

Page 6: Testes de ponta a ponta

Unidades de TrabalhoIsoláveis de dependências Externas

Possibilitam testes rápidos

Pequenas como métodos ou grandes como conjuntos de classes

Lembrete: Arrange, Act, Assert

Page 7: Testes de ponta a ponta

Tipos de Testes Unitários (by The Art of Unit Testing)

Value Based Testing

Interaction Based Testing

State Based Testing

Page 8: Testes de ponta a ponta

MockingDeve 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

Page 9: Testes de ponta a ponta

Code Time!

Page 10: Testes de ponta a ponta

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()

}

Page 11: Testes de ponta a ponta

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) }

}

Page 12: Testes de ponta a ponta

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))

}

Page 13: Testes de ponta a ponta

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

}

Page 14: Testes de ponta a ponta

Testes Integrados

Photo by Brady Holt on Wikimedia

Mock Driver

Page 15: Testes de ponta a ponta

Android Instrumentation TestsQuando 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?

Page 16: Testes de ponta a ponta

Android Testing Support LibraryAndroidJUnitRunner + JUnit4 Rules + Espresso + UIAutomator

Muito focado em testes de Interface do Usuário

Page 17: Testes de ponta a ponta

Instrumentation Testing RobotsUm 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)

Page 18: Testes de ponta a ponta

Code Time!

Page 19: Testes de ponta a ponta

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()))

}

Page 20: Testes de ponta a ponta

Instrumentation Testing Robot (ITR)

@Test

fun whenOpened_withOneBookLending_displayBookLendingCorrectly() {

val fakeBook = testDataRule.fakeBook

lentBooks {

checkForBookTitle(fakeBook.title)

checkForBookAuthors(fakeBook.authors.joinToString(","))

}

}

Page 21: Testes de ponta a ponta

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

}

}

Page 22: Testes de ponta a ponta

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)

}

...

Page 23: Testes de ponta a ponta

Testes de Aceitação

Photo by TireRack.com

Page 24: Testes de ponta a ponta

Page ObjectsUm Pattern com foco na organização dos testes

Melhorar a legibilidade e manutenção dos testes

Separar "o como testar" do "o que testar"

Page 25: Testes de ponta a ponta

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

Page 26: Testes de ponta a ponta

Scan Livro Preencher ISBN Emprestar Livro Selecionar contato Ver Detalhes Livro

Teste de Aceitação (E2E) - Emprestar um livro a um contato

Page 27: Testes de ponta a ponta

@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());

}

Page 28: Testes de ponta a ponta

Photo by Rian MacGuire on PixelBay

Testes Além do app

Page 29: Testes de ponta a ponta

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)

Page 30: Testes de ponta a ponta

Pensamentos FinaisTeste as engrenagens de forma isoladaTestes as engrenagens em conjunto

Foco nas interações dos usuários na aplicação

Não esqueça de testar os seus serviços

Page 31: Testes de ponta a ponta

Perguntas?

Page 32: Testes de ponta a ponta

Eduardo Carrara

@DuCarrara

Obrigado!

github.com/ecarrara-araujo

Elias Nogueira

@eliasnogueira

github.com/eliasnogueira

Page 33: Testes de ponta a ponta

Referências1. Testing on Android Documentation by Android Developers2. Android Testing Patterns Youtube Playlist3. The Art of Unit Testing by Roy Osherove4. Instrumentation Testing Robots by Jake Warthon5. Page Objects by Martin Fowler6. Test Pyramid7. Page Objects8. Android Tests by Goggle Samples9. Android Testing Templates by Google Samples

10. Espresso Cheat Sheet

Códigohttps://github.com/ecarrara-araujo/vilibrahttps://github.com/eliasnogueira/vilibra-testing