AB Workshop Automacao REST Web Mobile -...

Post on 10-Apr-2018

220 views 2 download

Transcript of AB Workshop Automacao REST Web Mobile -...

Testes vão muito além do TDDAutomação para REST, Web e Mobile

EliasNogueira

adaptworks.com.br

eliasnogueira

fb.com/elias.nogueira.teste

Agile Coach & Trainer na Adaptworks

QA Engineer

Professor de Pós Graduação na Unisinos/RS

eliasnogueira.com

PORQUESEPREOCUPARCOMQUALIDADE?

PORQUEAUTOMATIZAR?

TesteManual:maisrápidodecriarmaismuitolentoparaexecutar.

TesteAutomatizado:criaçãorelativamentedemoradamasmuitorápidoparaexecutar.

Execuções

Tempo

para

criação

Manual

Automatizado

PIRÂMIDEDEAUTOMAÇÃODETESTE

https://www.mountaingoatsoftware.com/blog/the-forgotten-layer-of-the-test-automation-pyramid

JSON

JavaScript Object Notation

Éindependentedelinguagemdeprogramação

NãorequerJavaScript parautilizarenãoédependentedeJavaScript

ÉbaseadonoObjetoLiteraldeJavaScript– var gato = {nome: ”Felicia”, idade: 2}

UmtextoemJSONpodeserconvertidodiretamenteparaumObjetoJavaScript

JSON

LinksÚteis

http://www.json.org

http://www.jsoneditoronline.org

http://www.w3schools.com/json/

https://www.udemy.com/json-training-a-javascript-object-notation-course

JSON

REpresentational State Transfer (REST)

ÉumestilodearquiteturautilizadoparacriaçãodeAPIs

TrabalhasobreprotocolosHTTPusandoverbosPOST,GET,PUT,DELETE,OPTION,PATCHeHEAD

UtilizarespostasnoformatoJSONouXML

REST

GeralmenteligadosamétodosCRUD(Create,Read,Update,Delete)

Método AçãoGET ReceberinformaçõesPOST CriarinformaçõesPUT CriarouatualizarinformaçõesDELETE Removerinformações

REST

Oquefaz? Verbo URL Exemplo

Listapessoas GET /api/person /api/person

Retornaapessoapeloid* GET /api/person/:id /api/person/27

Adicionaaspessoas* POST /api/person /api/person

Atualizaumapessoapelo id* PUT /api/person/:id /api/person/33

Removeumapessoa peloid DELETE /api/person/:id /api/person/52

*Necessárioenviaroscamposcomoparâmetros

REST

LinksÚteis

http://rest.elkstein.org

https://www.infoq.com/br/articles/rest-introduction

REST

Há várias formas deefetuar testesmanuais em APIsREST

Asmais utilizadas são vialinha decomando oubrowser:

CURL(linha decomando)PostMan (plugindoGoogleChrome)RestEasy(plugindoFirefox)RestClient (plugindoFirefox)

CURL- https://curl.haxx.sePostMan - https://www.getpostman.com

RestClient - https://addons.mozilla.org/en-US/firefox/addon/restclient/

TESTEMANUALREST

Rest Easy - https://addons.mozilla.org/en-us/firefox/addon/rest-easy/

Método URLdaAPI

Corpo

Resposta

PréCondições– RESTEasy aberto– URLbasecomohttp://eliasnogueira.com/tdc/workshop

Passos1. InformeométodoGET2. InformeaURLbasemais:

• api/person3. CliqueemSend

ResultadosEsperados– Listadepessoasexistentesnosistema

TESTEMANUALREST- EXERCÍCIO1Obtendopessoas

TESTEMANUALREST- EXERCÍCIO2Criandoumnovoregistro(pessoa)

PréCondições– RESTEasy aberto– URLbasecomohttp://eliasnogueira.com/tdc/workshop

Passos1. InformeométodoPOST2. InformeaURLbasemais:

• api/person3. InformenoBodyosdadosqueserão enviados,noformato JSON

{ "name":"Joao Carlos", "address":"Av Paulista, 1000", "hobbies":"Skate”

}4. CliqueemSend

ResultadosEsperados– Statuscode =200naabaResponseHeaders– PessoacadastradaedadossendoexibidosnaabaResponseBody

Observação:anotar oIDgerado

TESTEMANUALREST- EXERCÍCIO3Pesquisandopeloregistroinserido

PréCondições– RESTEasy aberto– URLbasecomohttp://eliasnogueira.com/tdc/workshop

Passos1. InformeométodoGET2. InformeaURLbasemais:

• api/person/{id}3. O{id} deve ser oIDanotado anteriormente4. CliqueemSend

ResultadosEsperados– Statuscode =200naabaResponseHeaders– DadosdapessoasendoexibidosnaabaResponseBody

TESTEMANUALREST- EXERCÍCIO4Alterandooregistroinserido

PréCondições– RESTEasy aberto– URLbasecomohttp://eliasnogueira.com/tdc/workshop

Passos1. InformeométodoPUT2. InformeaURLbasemais:

• api/person/{id}3. O{id} deve ser oIDanotado anteriormente4. InformenoBodyosdadosqueserão enviados,noformato JSON

{ "name":”SEU NOME",

}

5. CliqueemSend

ResultadosEsperados– Statuscode =200naabaResponseHeaders– DadosdapessoaalteradasendoexibidosnaabaResponseBody

TESTEMANUALREST- EXERCÍCIO5Removendooregistroinserido

PréCondições– RESTEasy aberto– URLbasecomohttp://eliasnogueira.com/tdc/workshop

Passos1. InformeométodoDELETE2. InformeaURLbasemais:

• api/person/{id}3. O{id} deve ser oIDanotado anteriormente4. CliqueemSend

ResultadosEsperados– Statuscode =200naabaResponseHeaders– ResponseBodycominformação success:true

ExisteumagamadeferramentasutilizadasparaautomaçãodeenviodeverbosREST

NósutilizaremosoREST-Assuredhttps://github.com/jayway/rest-assured

TESTEAUTOMATIZADOREST

EleéumaDLSdefácilutilizaçãoparaautomatizarserviçosRESTondepoderemosvalidarosresultadosesperados

AsintaxedeutilizaçãoémuitoparecidacomoGiven-When-Then doBDD

TESTEAUTOMATIZADOREST

TESTEAUTOMATIZADOREST

EstruturadaClassedeTeste

1.Import EstáticoÉnecessárioefetuardoisimports estáticos

TESTEAUTOMATIZADOREST

EstruturadaClassedeTeste

2.Pre CondiçãoÉnecessárioinformar

• URI:URLbasedeacessoaAPI• basePath:contextodeacessoaAPI

TESTEAUTOMATIZADOREST

EstruturadaClassedeTeste

3.TesteutilizandooscomandosdoRestAssuredCriaçãodeumcenáriodetesteparaexecução

TESTEAUTOMATIZADOREST

Passos1. Criarumpacotechamadotdc.workshop.rest napastasrc/test/java2. CriarumaJUnitTestCase chamadaTestePessoaApi3. Desenvolveramesmaclassedescritaabaixo

TESTEAUTOMATIZADOREST- EXERCÍCIO1CriandoaEstrutura

Passos1. AdicionarummétododetestechamadotesteValidacaoPessoa2. EfetuarumachamadaGETparaperson/{id}einformeumIDconhecido3. Validaroresultadodecadaatributoretornado

TESTEAUTOMATIZADOREST- EXERCÍCIO2ObterumaPessoapeloID

Passos1. Criarumnovopacoteemsrc/main/java chamadotdc.workshop.rest2. NestepacotecriarumaclassechamadaPessoa3. Adicionarosatributos,construtoremétodos abaixo

TESTEAUTOMATIZADOREST- EXERCÍCIO3CriarumanovaPessoa

Passos1. AdicionarummétododetestechamadotesteInserirPessoa2. EfetuarumPOSTpassandoosdadoscomoJSON pelabody3. Validar os valores deatributo dapessoa cadastrada

TESTEAUTOMATIZADOREST- EXERCÍCIO3CriarumanovaPessoa

Passos1. AdicionarummétododetestechamadotesteAlterarPessoa2. EfetuarumachamadaPUTparaperson/{id}einformeumIDconhecido3. Adicionar ocontentType como JSON einformar na bodyumnovonome

TESTEAUTOMATIZADOREST- EXERCÍCIO4AlterarumaPessoa

Passos1. AdicionarummétododetestechamadotesteRemoverPesspa2. EfetuarumachamadaDELETEparaperson/{id}einformeumIDconhecido3. Validar oretorno dostatus como true

TESTEAUTOMATIZADOREST- EXERCÍCIO5RemoverumaPessoa

PROBLEMADOTESTEMANUALWEB

5 5

2

7

10

3

1

Ciclo1 Ciclo2 Ciclo3 Ciclo4

Núm

erode

Fun

cion

alidades

1semana 1semana 1semana

Funcionalidadeexistente NovaFuncionalidade

CriarumanovaPessoa

Passos1. ClicarnobotãoAdicionar2. Preencherosseguintescampos

• Nome:<seunome>• Endereço:<suacidade>• Hobbies:<seuhobbie>

3. ClicarnobotãoSalvar

ResultadosEsperados1. Voltarparaalistagemdepessoas2. Apresentarapessoainseridana

listagem

CENÁRIOTESTEWEB

PesquisarumaPessoa

Passos1. Preencherocampo”Pesquisar…”

comoNomecadastradoanteriormente

ResultadosEsperados1. Apresentarapenasa

linha/registroreferenteaonomepesquisado

Parainteragircomoselementosdeve-mosconhecê-los,logodevemosinspeciona-losparadescobrirosseusatributoseaformacomqueiremosidentificá-losnoscript

OsbrowsersmaismodernospossuemafuncionalidadedeinspecionarelementosHTML,queéapráticadedescobrirocódigo-fonteespecificamentedeumelemento.

NósusaremosoFirebug,quepodeserextensívelatravésdeplugins paranosajudaralocalizaralgunselementos

PodemosabriroFirebug pelomenuTools ->WebDeveloper ->Firebug ->OpenFirebug ouclicandonoíconedatoolbar

INSPECIONANDOELEMENTOS

Parainspecionarcliquenobotãodeinspeçãoeapóscliquenoelementoquevocêdesejainspecionar

INSPECIONANDOELEMENTOS

Botãodeinspeção

OSeleniumWebDriveré uma APIparainteração comelementos webem umbrowser,simulando asmesmasações deusuário

http://seleniumhq.org

AUTOMAÇÃOWEB

OSelenium baseia-seemtrêsprincípiosbásicosparaautomaçãoweb:

– Navegação:aberturadobrowser,acessoapáginasecontroledenavegação

– Interrogação:identificaçãodeumelemento

– Manipulação:interaçãocomoelemento(clicks,preenchimentos,etc…)

AUTOMAÇÃOWEB

Navegação

OpontodepartidaparaautilizaçãodoWebDriver éaclasseWebDriver,quequandoinstanciadajáabreobrowser(driver)referenciado

Jáanavegaçãoàumapáginaéfeitapelocomandoget()

AUTOMAÇÃOWEB

Passos1. Criarumpacotechamadotdc.workshop.web napastasrc/test/java2. CriarumaJUnitTestCase chamadaAdicionarPessoaTeste3. AlteraonomedométododetesteparatesteAdiconarPessoa()4. Desenvolveramesmaclassedescritaabaixo5. Executeoscript(MenuRun ->Run)oucliqueem

ResultadosEsperados1. AbriroFirefox eacessar apáginadoWorkshop

AUTOMAÇÃOWEB- EXERCÍCIO1CriaraEstruturaeNavegação

Interrogação

AinterrogaçãoéaformacomqueoWebDriver iráencontraroselementosnatela.IssoéfeitoatravésdométodofindElement()

Estemétodorecebecomoparâmetroaformadelocalizar(estratégia)

AUTOMAÇÃOWEB

By.id Localiza oelementopeloatributoid

By.name Localizaoelementopeloatributo name

By.tagName Localizaoelemento porumatag

By.linkText Localizaoelemento pelonomedolink

By.partialLinkText Localiza oelementopelonomeparcialdolink

By.cssSelector LocalizaoelementoporCSSSelector

By.className Localizaoelementopeloatributoclass

By.xpath Localizaoelementoporxpath

driver.findElement(By.estrategia)

Manipulação

Apósterencontradooelementoqueiremosinteragiréprecisoinformalqualotipodeinteração

AUTOMAÇÃOWEB

Interação Descrição

click() Efetuaumcliquenoelemento

clear() Limpaumelemento dotipotextoousimilar

sendKeys() Digitaemumelemento dotipotextoousimular

getText() Pegaotextode umaelemento

Localizandoporid ouname

SãosempreosprimeirosquedevemosidentificarnoHTML

ExemplonoHTML:––

AUTOMAÇÃOWEB

idname

LocalizandocssSelector

Formadelocalizaçãoquandonãopossuímosid ouname.Podemosutilizá-loatravésdeaidentificaçãodeumaclasseCSSoumesmoporatributosevaloresdeumelemento

Exemploporatributoevalor

Exemplopelaclassecss

AUTOMAÇÃOWEB

Passos1. ClicarnobotãoAdicionar2. Preencherosseguintescampos:

– Nome:<seunome>– Endereço:<seuendereco>– Hobbies:<seuhobbie>

3. ClicarnobotãoSalvar4. Executeoscript

AUTOMAÇÃOWEB- EXERCÍCIO2InterrogareInteragircomelementos

ResultadosEsperados1. Redirecionarapáginaparaalistade

pessoas,comapessoacadastradapresentenalista

Validaçãodosdados

Precisamosvalidarosresultadosesperadoseexisteduasformas:– Garantindooretornodeverdadeiro/false– Garantindoaigualdadedeinformações

assertTrueGarantequealgoqueestamosprocurandoéverdadeiro

assertEqualsGarantequeduasinformaçõessãoiguais

AUTOMAÇÃOWEB

Passos1. Pegueocódigo-fontedapáginaeo

coloqueemumavariável2. InsiraumassertTrue paracadaitem:

• Nome• Endereco• Hobbie

3. Executeoscript

AUTOMAÇÃOWEB- EXERCÍCIO3Validarosdadosinseridos

ResultadosEsperadosValidaçãodetodosositensefetuadacomsucesso(nãoapresentarerrosnaexecução)

FechandooBrowser

Érecomendadoquefechamosobrowserapósaexecuçãodetesteporváriosmotivos:

1. Paranãogerarefeitoscolateraisnaexecuçãodoteste2. Paraqueocachenãointerfiraemalgumteste3. Paranãoocuparmemórianamáquinadeexecuçãodeteste

driver.quit()Fechaobrowser,encerrandoqualquerjanelaabertapelaautomação

AUTOMAÇÃOWEB

Esperas

ExistemduasformasdeesperanoWebDriver:

– Implícita:apenasumcomandonoiníciodaaberturadobrowserfazcomqueocorraumaespera,portempodeterminado,porqualquerelementoqueestamosinteragindo

– Explícita:colocamosumcomandoparacadaesperanecessáriaantesdainteraçãodoelemento

NósusaremosaesperaExplicitaporumdosprincipaisfatos:saberexatamenteondetermosqueesperarporalgumelementoparaseguirinteragindocomosdemais

AUTOMAÇÃOWEB

EsperaExplícita

OpontoinicialdaesperaExplícitaéaclasseWebDriverWait,quetrazumaespera“global”paraoscriptdeteste.

Otempodeesperaéumaesperadotipo”até”.Ex:secolocamos30segundosdeespera,eoelementofoiapresentadoem4segundos,eleseguiráaexecuçãoaoinvésdeaguardarosoutros26segundosrestantes

AUTOMAÇÃOWEB

Necessitadodriver/browseratual

Tempodeespera

EsperaExplícita

Ométodomaiscomumdeutilizaçãoéountil

Ligamosountil aumaExpectedConditions queeumaclasseestáticaquepossuiumasériedemétodosprontosdeespera

AUTOMAÇÃOWEB

Umdosmétodosdeespera Elementoqueseráaguardado

EsperaExplícita

Utilizamos,nagrandemaioriadasvezes,umadasduasExpectedConditions abaixo:

– presenceOfElementLocatedQuandooelementonãoexistenoHTML,elogoumaaçãoéexecutadaeleéinserido

– visibilityOfElementLocatedQuandooelementoexistenapágina,masestáinvisível

AUTOMAÇÃOWEB

AUTOMAÇÃOWEB

Passos1. EfetueumapesquisanacaixaPesquisar

comoseunome2. Aguardeoelementodatabelareferente

aonomeaparecer3. Validetodososdadosapresentados:

• Nome• Endereco• Hobbie

4. Executeoscript

AUTOMAÇÃOWEB- EXERCÍCIO4Adicionarumaesperaaoscript

ResultadosEsperadosValidaçãodetodosositensefetuadacomsucesso(nãoapresentarerrosnaexecução)

Você já deve ter feito os passos daspré condições desteworkshop,masvalelembrar oqueé necessário paraautomatizaruma app:

– Arquivo .apk ou acesso ao código-fonte daapp– AndroidSDKcom:

• Tools• Build-tools• Platform-tools• SDKPlatforma daversão escolhida• Processador daversão escolhida (ARMou Intel)

– Emulador ou dispositivo real– Ferramenta deautomação deteste

TESTEPARAANDROID

Abrimos oemulador comocomando android avdEle dá apossibilidade decriar umnovoemulador ou iniciá-lo

ABRINDOOEMULADOR

android avd

INSTALAÇÃODOAPP

DescobrindoonomedodispositivoÉnecessáriosaberonomedodispositivoparainstalaraapp.Ocomandoadb devices exibeonomedodosdispositivosconectadosnasuamáquina(emuladoresoureais)

comando

nomedodispositivo

adb devices

INSTALAÇÃODOAPP

InstalandooappOcomandoadb install nome_app.apk é quem efetua ainstalação daapp.É necessário ou estar nodiretório daappou informar ocaminho

comando

adb install nome_app.apk

adb install C:\apps\nome_app.apk

INSPECIONANDOCOMPONENTES

Há uma ferramenta chamada uiautomatorviewer queinspecionaos componentes eseus atributos deformasemelhante ao Firebug

Parainiciá-loclicamos digitamos oseguinte comando noPromptdeComando

uiautomatorviewer

INSPECIONANDOCOMPONENTES

Botão decapturadatela

Árvore decomponentes

Componenteselecionado

Atributos evalores docomponenteselecionado

AUTOMAÇÃOCOMAPPIUM

Appium éumaferramentaopensource paraautomatizar:– AplicaçõesmobilenativasouhíbridasparaiOS,Android– AplicaçõeswebmobileparaosbrowsersnativosdoiOS,Android ouGoogleChrome

http://appium.io

AUTOMAÇÃOCOMAPPIUM

PassosHáquatropassosbásicosparaacriaçãodescriptsdetesteparamobilecomAppium:

1. InformaraAPPeCriaraDesiredCapability2. Abriraconexãocomodispositivo3. Localizareinteragircomcomponentes4. Validarosresultadosesperados

AUTOMAÇÃOCOMAPPIUM

1.InformaraAPPeCriarDesiredCapabilityElaéresponsávelporinformardadosgeraissobreoquevamostestareonde (capacidades)

AAPPé inseridaatravésdaclasseFile(java.io)

ÉnecessárioinstanciaraclasseDesiredCapabilities()

Depoisénecessárioinformarascapacidades

Passos1. Criarumapastachamaapp naraizdoprojeto2. Copiaroarquivoworkshop.apk paraapastaapp3. Criarumpacotechamadotdc.workshop.mobile napastasrc/test/java4. CriarumaJUnitTestCase chamadaAdicionarPessoaTeste5. AlteraonomedométododetesteparatesteAdiconarPessoa()6. Desenvolveramesmaclassedescritaabaixo

AUTOMAÇÃOMOBILE- EXERCÍCIO1CriaraEstruturaeDesiredCapabilities

AUTOMAÇÃOCOMAPPIUM

2.AbriraConexãocomoDispositivoDepoisqueinformamosascapacidadesprecisamosabriraconexãocomodispositivoparaqueelepossareceberoscomandos.

AprimeiraaçãoéconfiguraroAppium.app paraisso.

Passos1. AbriroAppium.app2. Cliquenobotão AndroidSettings3. Marqueaopção DeviceNameeinsira otexto ”AndroidEmulator4. Cliquenobotão GeneralSettings5. Marqueaopção OverrideExistingSessions6. Cliquenobotão Launch

AUTOMAÇÃOMOBILE- EXERCÍCIO2Configurar oAppium.app

AUTOMAÇÃOCOMAPPIUM

2.AbriraConexãocomoDispositivoAgoraprecisamosadicionarocódigoparaabriraconexãoviaAndroid.

UmlembretequeaURLdeconexão,nonossocaso,élocaleaportaéaconfiguradanoAppium.AindanaURLhásempreocontexto/wd/hub

Passos1. Inserirotrechodecódigoabaixoantesdo”}”2. AofinaldadigitaçãocoloqueomousesobreotrechodotextoULR,aguarde

ummomentoeselecioneAdd throws declaration

AUTOMAÇÃOMOBILE- EXERCÍCIO3Abrir aConexão comoDispositivo

Passos3. Ocódigo finaldeve ficar como oabaixo

AUTOMAÇÃOMOBILE- EXERCÍCIO3Abrir aConexão comoDispositivo

AUTOMAÇÃOCOMAPPIUM

3.LocalizareInteragircomosComponentesComooAppium ébaseadonoSeleniumWebDriver todososcomandosdeinterrogação(localizar)emanipulação(interagir)sãoidênticos.

Masalgumasformasdelocalização são suportadas noAndroid:

Passos1. ComaAPPabertanoemuladorabreouiautomatorviewer2. InspecioneosseguintescamposefaçaainteraçãonecessáriasomenteatravésdeID

1. Cliquenobotão+(adicionar)2. PreenchaocampoNome3. PreenchaocampoEndereço4. PreenchaocampoHobbies5. CliquenobotãoSalvar6. CliquenobotãodePesquisar7. Digiteo”Nome”inseridoepareporaqui:-)

• LembrandoqueoIDétodoovalorcontidonoresource-id

AUTOMAÇÃOMOBILE- EXERCÍCIO4Localizar eInteragir comos Componentes

AUTOMAÇÃOCOMAPPIUM

4.ValidarosResultadosEsperadosTambém é damesma formaqueocorre noSeleniumWebDriverutilizando alguma ferramenta detesteunitário.

Mas,na grande maioria doscasos,utilizaremos somente oassertEquals

Passos1. ComaAPPabertanoemuladorabreouiautomatorviewer2. Inspecioneonomedalistaquefoifiltradopelapesquisa3. AtribuaotextodoelementoaumaString4. ValideoresultadocomoassertEquals

AUTOMAÇÃOMOBILE- EXERCÍCIO5Validar os Resultados Esperados

AUTOMAÇÃOCOMAPPIUM

FinalizaçãoParasaberexatamentequandoaexecuçãoterminou,fecharaapp etambémevitarproblemascomsessãoinserirocomandodriver.quit()paraencerraraexecuçãodotesteeofechandodaapp.

SeaspróximasexecuçõesfalharemlogonoinícioénecessáriopararoAppium.app einicia-lonovamente.

Passos1. Adicionarocódigoabaixoparaafinalizaçãodaapp2. ExecutarotestepeloEclipse3. VisualizarseoresultadodoJUnit apresentasucesso

ResultadoEsperado1. Testefalharpornão conseguir localizar obotão +(Adicionar)

AUTOMAÇÃOMOBILE- EXERCÍCIO6Finalizar oteste

AUTOMAÇÃOCOMAPPIUM

Porqueobotãonãofoilocalizadopeloscript?Sevocêexecutarnovamenteoscriptverásqueosdadosecamposdemoramumpoucoparaseremapresentados.Issosedevearequisiçãoaoservidorparaobterosdados.

Logoprecisamosdeesperarporalgumacoisanatelaparaqueoscriptpossaseguir.

ComooAppium ébaseadonoSeleniumWebDriver asesperassãoasmesmas.

SempreusaremosaesperaatravésdaclassedesuporteExpectedConditions utilizandoométodopresenceOfElementLocated

Passos1. AdicionaaclasseWebDriverWait logoapósoAndroidDriver2. Insiraumaesperaexplícitaparaobotão+(Adicionar)

ResultadoEsperado1. Registroadicionadoetesteexecutadocomsucesso

AUTOMAÇÃOMOBILE- EXERCÍCIO7Inseriraesperapelobotão+(Adicionar)