Criando testes automatizados "like a pro"

Documentos relacionados
Indo Além com Automação e Testes de Apps Android. Eduardo


UNIP - Ciência da Computação e Sistemas de Informação. Estrutura de Dados. AULA 5 Pilhas

Testes com objetos mock. Curso de Tecnologia em Análise e Desenvolvimento de Sistemas Análise e Projeto Orientados a Objetos

Objetos Dublês. AgilCoop Cursos de Verão Mariana Bravo IME/USP

Organizando seus Testes Funcionais AUMENTANDO A MANUTENIBILIDADE DE TESTES FUNCIONAIS ATRAVÉS DA ORIENTAÇÃO A OBJETOS.

Objetos Dublês. Mariana Bravo AgilCoop Cursos de Verão 2009

Padrões de Testes Automatizados

RESULUÇÃO DOS EXERCÍCIOS E INSTRUÇÕES DE DECISÃO (if{} e else{}) Profº André Aparecido da Silva Disponível em:

nome = n; cargo = c; salario = s; public void print() { System.out.println(nome cargo salario); public void aumento( double fator){

Engenharia de Software

Teste Unitários com NUnit. Anderson Martiniano da Rocha

Threads. Leonardo Gresta Paulino Murta

Interfaces POO. Prof. Marcio Delamaro

Aula Prática Criando Views e Controles

Programação para Dispositivos Móveis

Ferramenta Selenium. Programação Orientada a Objetos Prof Marcio Delamaro ICMC/USP

Processamento da Informação Estruturas de seleção simples e composta

J820. Mock objects. Testes de código com dependências. argonavis.com.br. Helder da Rocha

JUnit. Alexandre Menezes Silva Eduardo Manuel de Freitas Jorge

Teste de Software. Roberta Coelho

O JUnit permite a realização de testes de unidades, conhecidos como "caixa branca", facilitando assim a correção de métodos e objetos.

Testes Automatizados. Cursos de Verão 2007 IME/USP Dairton Bassi & Paulo Cheque

Análise e Projeto Orientados a Objetos

Prova 2 PMR3201 1o. semestre 2015 Prof. Thiago Martins

PROGRAMAÇÃO ORIENTADA A OBJETOS JAVA

Engenharia de Software

Teste Automatizado POO. Prof. Marcio Delamaro

Biblioteca Android PagSeguro UOL - Checkout in App Manual de Uso

Agilizando o processo de redeploy de aplicações Java

Francisco Roeder. Orientador: Prof. Adilson Vahldick

JUnit: framework de testes unitários. Fred Lopes

Programação Orientada a Objetos Relacionamentos entre classes

Injeção de Dependências e Spring

Testes Unitários com JUnit

Universidade Federal do Paraná

Desafios e recompensas do Qt na construção de um PDV embarcado

Migrando do para o. um e-book produzido por: CodePrestige

Lidando com Java Obsoleto: Do Struts 1.0 ao CDI. Java na Crista da Onda

Convivendo e melhorando seu relacionamento com código legado utilizando PowerMock

Navegar entre páginas Necessário o uso de Intent. Intenção de ir a algum lugar, acessar outros recursos, outros apps.

Login. Criar uma nova Activity. Login. Luiz Eduardo Guarino de Vasconcelos

Teste de Software: Existe Isto? Jorge Fernandes Junho de 2004

Exceções AULA 13. Ricardo Massa F. Lima Sérgio C. B. Soares

Orientação a Objetos. Fernando Camargo 5 de junho de 2017

if( opcao.equals("1") ) { ElaborarContratoUI uiec = new ElaborarContratoUI(m_empresa); uiec.run();

Orientação a Objetos e Java

Computação II - Java - Prova 1 Prof. Adriano Joaquim de Oliveira Cruz /05/13. Questão: Total Pontos: Gráu:

Linguagem de Programação II Implementação

Testes com JUnit. Treinamento ALESP SPL. Danilo Toshiaki Sato.

Tratamento de Erros. Sérgio Luiz Ruivace Cerqueira

Programação de Dispositivos Móveis

Conhecendo features de uma linguagem moderna

Universidade Federal de Uberlândia Faculdade de Computação Programação Orientada a Objetos II Prof. Fabiano Dorça. Padrão Observer (Observador)

Arquitetura Java Pastoreando gatos

Para entender o conceito de objetos em programação devemos fazer uma analogia com o mundo real:

Modulo II Tópicos em Java - Extra

Tipos, Literais, Operadores

Tipos, Literais, Operadores

Algoritmos e Estruturas de Dados 1

Universidade de Mogi das Cruzes Implementação Orientada a Objetos - Profª. Danielle Martin. Guia da Sintaxe do Java

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Fabrício J. Barth. BandTec - Faculdade de Tecnologia Bandeirantes

Laboratório de Programação. Aula 12 Java 5COP088. Aula 12 Exceções Prof. Dr. Sylvio Barbon Junior. Sylvio Barbon Jr

Código-Fonte da Prática 02

MOCKITO - - Alexandre Gazola (alexandregazola@gmail.com /

" ##$#$!% # & #$#$!!! "!!

Primeira Aplicação Android Olá Mundo. Prof. Fellipe Aleixo

Eclipse MicroProfile for the Busy Developer

Prova 2 PMR2300 1o. semestre 2015 Prof. Thiago Martins

Linguagem Algorítmica OO. Linguagem Algorítmica

SISTEMAS DISTRIBUÍDOS

Programação para a Plataforma Android Aula 16. Fragmentos

Herança (parte 2) Redefinição de métodos AULA 11

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Programação Orientada a Objetos Classes Abstratas. Sérgio Soares

Engenharia de Software

Estratégias de Escrita de Testes Automatizados

PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS

Análise e Projeto Orientados por Objetos

Prova Final de Linguagens de Programação - DCC024B - Sistemas de Informação

PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS

FILAS. As coisas de que uma fila é feita serão chamadas itens. Os itens podem ser números, strings, structs, etc., etc.

Teste de Software. Karen Frigo Busolin Novembro / 2010

UNIVERSIDADE FEDERAL DE MATO GROSSO DO SUL SISTEMAS DE INFORMAÇÃO - CÂMPUS DE COXIM FUNDAMENTOS EM ORIENTAÇÃO A OBJETOS

SOLUÇÃO REUTILIZÁVEL PARA CONSUMO DE ANOTAÇÕES DE CÓDIGO RELATÓRIO FINAL DE PROJETO DE INICIAÇÃO CIENTÍFICA. (PIBIC/CNPq/INPE)

(Sistema Especialista)

Testes de correção (de defeitos)

Herança. Prof. Fernando V. Paulovich 23 de agosto de 2010

PROGRAMAÇÃO E PYTHON. Laboratórios de Informática João Paulo Barraca, André Zúquete, Diogo Gomes

Retrofit. Criar um novo projeto. Selecionar a API. Retrofit para consumir Web Service Luiz Eduardo Guarino de Vasconcelos

Prova 2 PMR3201 1o. semestre 2016 Prof. Thiago Martins

Design Patterns (Factory Method, Prototype, Singleton)

Sobrecarga. Algoritmos e Programação II. Aula 3 Sobrecarga

[Magee 1999] Concurrency State Models and Java Programs, Jeff Magee, Jeff Kramer, John Wiley 1999.

Unidade 5: Projeto de Programas Noções de Concepção e Programação Prof. Daniel Caetano

Linguagem de Programação Orientada a Objeto Construtores e Sobrecarga

Implementando um Projeto. Programação em Java. Do Projeto para Implementação. Classe Pública em Java. Corpo de Classes e Métodos. Convenção de Nomes

Transcrição:

Criando testes automatizados "like a pro"

Diego Gonçalves Santos Desenvolvedor @

Obstáculos contra os testes automatizados

Obstáculos Cliente não vê valor Não há tempo disponível Desenvolvedores não entendem propriamente ou não vêem valor nos testes

Por que devo testar minhas aplicações?

Por que testar? Assegura funcionamento mínimo do software Aumenta confiança para fazer refactorings Garante poder de errar rápido e corrigir rápido Ajudam a identificar furos na implementação Melhoram a sua forma de programar Asseguram que cenários de bugs não regressem Servem de documentação

Testes efetivos

Testes Efetivos Validam no mínimo o fluxo feliz da funcionalidade

Tipos de testes

Tipos de testes Testes unitários Testes de tela Testes manuais

Ambiente controlado para testes

Mocks

Mocks Mockito Injeção de dependências MockWebServer

Mockito @Mock lateinit var mockrepository: Repository @Before fun setuptest() { MockitoAnnotations.initMocks(this) @Test fun test() { Mockito.`when`(mockRepository.getList(anyInt(),anyString())).thenReturn(expectedValue) presenter.loadlist() verify(mockview, times(1)).onlistloaded(any())

Mocks Mockito Injeção de dependências MockWebServer

Injetando Mocks - Koin class Repository class Presenter { lateinit var repository: Repository

Injetando Mocks - Koin class Repository class Presenter { lateinit var repository: Repository by inject() val module : Module = module { single { Repository()

Injetando Mocks - Koin @Before fun setuptest() { loadkoinmodules(listof(module { single { mockrepository ))

Mocks Mockito Injeção de dependências MockWebServer

MockWebServer - Enqueue lateinit var server: MockWebServer @Before fun setup() { server = MockWebServer() server.start() @Test fun test() { server.enqueue(mockresponse().setbody(getjson("json/token.json"))) server.enqueue(mockresponse().setbody(getjson("json/eventos.json")))

MockWebServer - Dispatcher val dispatcher = object : Dispatcher() { @Throws(InterruptedException::class) override fun dispatch(request: RecordedRequest): MockResponse { return when { request.path == "/v1/token" -> MockResponse().setResponseCode(200).setBody(getJson("json/token.json")) request.path == "v1/events" -> MockResponse().setResponseCode(200).setBody(getJson("json/eventos.json")) else -> MockResponse().setResponseCode(404) server.setdispatcher(dispatcher)

Testes de tela

Espresso + Robot pattern

Espresso onview(withid(r.id.login_username)).perform(typetext(username)) onview(withid(r.id.login_password)).perform(typetext(password)) Espresso.closeSoftKeyboard(); onview(withid(r.id.login_button)).perform(click())

Robot Pattern class ScreenRobot { fun entertextintoview(@idres viewid: Int, text: String): T { onview(withid(viewid)).perform(typetext(text)) closekeyboard() return this as T class LoginRobot { fun inputpassword(pass: String): LoginRobot { return entertextintoview(login_password, pass) companion object { private val LOGIN_PASSWORD = R.id.login_password

Robot Pattern @Test fun testloginsuccess() { val loginrobot = LoginRobot() loginrobot.submit().assertusernameerror(r.string.required_field).assertpassworderror(r.string.required_field).inputuser("valid").submit().assertpassworderror(r.string.required_field).inputpassword("valid").submit().asserthomeopens()

Testando run time permissions

Testando run time permissions fun selectimage() { if (checkselfpermission(manifest.permission.write_external_storage) == PackageManager.PERMISSION_GRANTED) { getimage() else { askpermission() private fun askpermission() { ActivityCompat.requestPermissions(activity, arrayof<string>(manifest.permission.write_external_storage), 1)

Testando run time permissions override fun onrequestpermissionsresult(requestcode: Int, permissions: Array<out String>, grantresults: IntArray) { super.onrequestpermissionsresult(requestcode, permissions, grantresults) if (grantresults[0] == PackageManager.PERMISSION_GRANTED) { // Treat request granted else { // Treat request denied

Testando run time permissions class PermissionManager { fun isstoragepermissiongranted(context: Activity): Boolean { return if (Build.VERSION.SDK_INT >= 23) { ispermissiongranted(context.checkselfpermission(manifest.permission.write_external_storage)) else { true fun ispermissiongranted(grantresult: Int): Boolean { return grantresult == PackageManager.PERMISSION_GRANTED fun askforpermission(activity: Activity) { ActivityCompat.requestPermissions(activity, arrayof<string>(manifest.permission.write_external_storage), 1)

Testando run time permissions val permissionmanager: PermissionManager fun selectimage() { if (permissionmanager.isstoragepermissiongranted(this)) { getimage() else { askpermission() private fun askpermission() { permissionmanager.askforpermission(this)

Testando run time permissions override fun onrequestpermissionsresult(requestcode: Int, permissions: Array<out String>, grantresults: IntArray) { super.onrequestpermissionsresult(requestcode, permissions, grantresults) if (permissionmanager.ispermissiongranted(grantresults[0])) { // Treat request granted else { // Treat request denied

Testando run time permissions @RunWith(AndroidJUnit4::class) class ProfileFragmentTest : BaseInstrumentedTest() { @Rule var mruntimepermissionrule = GrantPermissionRule.grant(Manifest.permission.WRITE_EXTERNAL_STORAGE) @Mock internal var permissionmanagermock: PermissionManager @Test fun test() { `when`(permissionmanagermock.isstoragepermissiongranted(any())).thenreturn(true)

Roboeletric

Roboeletric @RunWith(RobolectricTestRunner.class) public class MyActivityTest { @Test public void clickingbutton_shouldchangeresultsviewtext() throws Exception { Activity activity = Robolectric.setupActivity(MyActivity.class); Button button = (Button) activity.findviewbyid(r.id.press_me_button); TextView results = (TextView) activity.findviewbyid(r.id.results_text_view); button.performclick(); assertthat(results.gettext().tostring(), equalto("testing Android Rocks!"));

Cobertura de Testes - Jacoco

Jacoco

Jacoco

CI + Testes

CI + Testes

Dicas

Dicas Comece pequeno Não desista dos testes

Referências Confira nossa série sobre testes automatizados no Android: Por que devo testar minhas aplicações Testes automatizados no Android Ambiente controlado para testes Parte 1: Mockito e Injeção de dependência Ambiente controlado para testes Parte 2: MockWebserver Ambiente controlado para testes Parte 3: Testando run time permissions no Espresso [Em Breve] UI tests Espresso + Robot Pattern [Em Breve] Usos práticos da suíte de testes Jacoco e CI [Em Breve]

Obrigado! Diego Gonçalves Santos DiegoGSantos @DiegoGSantos DiegoGSantos DiegoGSantos