AB Workshop Automacao REST Web Mobile -...
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)