Baixe o app para aproveitar ainda mais
Prévia do material em texto
ACH2006 – ENGENHARIA DE SISTEMAS DE INFORMAÇÃO I AUTOMATIZAÇÃO DA ATIVIDADE DE TESTE Marcos Lordello Chaim 4 de outubro de 2023 Bacharelado em Sistemas de Informação | EACH - USP AUTOMATIZAÇÃO DA ATIVIDADE DE TESTE • Parcela considerável do custo das atividades de teste está associada à execução dos testes em si. • Automatização no desenvolvimento tradicional⇒ teste de regressão. • Regredir um software ao estado anterior, isto é, ao estado em que todos os testes passavam. • A reexecução dos testes é uma atividade custosa. • Dados de entrada deverão ser fornecidos novamente e validação das saídas deverá também ocorrer de novo. 1/22 AUTOMATIZAÇÃO DA ATIVIDADE DE TESTE • Sem mecanismos para automatizar a execução dos teste, duas situações podem ocorrer: 1. o custo aumenta significativamente, pois os testadores deverão realizar manualmente os testes; 2. o teste de regressão será negligenciado, afetando-se assim a qualidade do software. • Métodos de desenvolvimento ágil: automatização dos testes é uma prática fundamental. • Kent Beck: requisito de teste somente existe, se houver um teste automatizado associado. 2/22 DESENVOLVIMENTO DIRIGIDO POR TESTES • A evolução desse conceito⇒ TDD — Test-Driven Development. • Para cada funcionalidade do software, testes de unidade são desenvolvidos anteriormente a sua implementação. • Abordagem Red-Green-Refactor: • conjunto de atividades utilizadas na maioria dos métodos ágeis, sendo uma característica implícita à prática de TDD. 3/22 ABORDAGEM RED-GREEN-REFACTOR 1. (Red): Testes automatizados são escritos. Ao serem executados, possivelmente a funcionalidade ainda não foi implementada; 2. (Green): A funcionalidade é desenvolvida o suficiente para fazer com que os testes passem com sucesso; 3. (Refactor): Uma vez que todos os testes passam, o código é melhorado de modo que as melhorias continuem assegurando o sucesso de execução dos testes. 4/22 ACCEPTANCE TEST-DRIVEN DEVELOPMENT • Atividades decorrentes da abordagem red-green-refactor passam a ser realizadas para testes de validação. • Cliente e desenvolvedores escrevem casos de testes de aceitação para uma determinada funcionalidade do sistema. • Desenvolvedores codificam a funcionalidade para que os testes passem. • Cliente executa o caso de teste de aceitação para validar a funcionalidade implementada. 5/22 ACCEPTANCE TEST-DRIVEN DEVELOPMENT Figura 1: Interação entre ATDD e TDD. 6/22 AUTOMATIZAÇÃO DOS TESTES • Pode-se, portanto, concluir que a automatização dos testes é uma atividade fundamental em qualquer paradigma de desenvolvimento, mas especialmente no paradigma de desenvolvimento ágil. • A seguir discutiremos os principais tipos de ferramentas que auxiliam o desenvolvedor a criar testes automatizados. 7/22 FERRAMENTAS DE AUTOMATIZAÇÃO DE TESTES • Associadas à execução automática de um conjunto (“suite”) de testes e à avaliação automática dos resultados gerados. • Tradicionalmente, atuam em dois níveis: 1. Execução automática de casos de teste associados a uma unidade. 2. Execução automática de casos de testes de integração e aceitação. 8/22 TESTE DE UNIDADE AUTOMÁTICO • Execução automática de casos de teste associados a uma unidade. • Por unidade, entende-se um procedimento, um método, uma função ou uma classe. • Pode ser utilizado no teste de integração, desde que os procedimentos ou objetos invocados utilizem a implementação final, e não versões simplificadas. 9/22 FERRAMENTAS DE TESTE DE UNIDADE AUTOMÁTICO • Genericamente referidas como bibliotecas xUnit. • A letra x é uma referência à linguagem alvo, que pode ser Java, C, PHP etc. • A mais famosa biblioteca xUnit é a que apoia o teste de programas escritos em Java, conhecida como JUnit. 10/22 JUNIT 3 Figura 2: Criação da estrutura de teste de unidade com JUnit. 11/22 JUNIT 3 Figura 3: Teste de unidade implementado com JUnit. 12/22 JUNIT 4 package br.usp.each.si.ach2006; import static org.junit.Assert.*; import org.junit.After; import org.junit.Before; import org.junit.Test; // Test the Money class. public class MoneyTest { private Money _amount; /** * Default constructor for test class MoneyTest */ public MoneyTest() { //System.out.println("JUnit Framework calls Constructor of test class before executing test methods"); } /** * Sets up the test fixture. * Called before every test case method. */ @Before public void setUp() { _amount = new Money(0, 0); } /** * Tears down the test fixture. * Called after every test case method. */ @After public void tearDown() { _amount = null; } } ... 13/22 JUNIT 4 // Test conversion of Money object to String. @Test public void testToString() { // First test: cents is two digits Money amount = new Money (7, 55); String actual = amount.toString(); String expected = "$7.55"; assertTrue("Error in testToString", actual.equals(expected)); // Second test: cents is one digit Money amount2 = new Money (7, 5); String actual2 = amount2.toString(); String expected2 = "$7.05"; assertTrue("Error in testToString", actual2.equals(expected2)); } // Test equality of money values that are the same. @Test public void testEquality() { Money myCash = new Money (3, 75); Money yourCash = new Money (3, 75); assertTrue ("Error in testEquality", myCash.equals(yourCash)); Money myAmount = new Money (50, 0); Money yourAmount = new Money (50, 0); assertTrue ("Error in testEquality", myAmount.equals(yourAmount)); } ... } 14/22 JUNIT 4 Figura 4: Resultado da execução dos testes escritos com JUnit 4 no Intellij. 15/22 JUNIT 4 Figura 5: Resultado da execução dos testes escritos com JUnit 4 com um falha forçada. 16/22 FERRAMENTAS DE CAPTURA E REEXECUÇÃO • Visam capturar os comandos realizados pelos testadores durante o teste e registrá-los na forma de scripts. • Os scripts são programas gerados em uma linguagem de alto nível. • Comandos capazes de: • posicionar o cursor em determinado campo; • inserir valores númericos ou alfanuméricos e • emitir comandos (e.g., clicar em um botão ou enviar o caractere ENTER). 17/22 FERRAMENTAS DE CAPTURA E REEXECUÇÃO • Quando executados os scripts, os comandos originalmente realizados pelos testadores são submetidos automaticamente ao software. • Selenium IDE: • ferramenta open-source que realiza as funções de captura e reexecução para aplicações Web. • instalada em um navegador Mozilla Firefox, Google Chrome e Apple Safari para capturar os comandos emitidos pelo testador para testar uma aplicação Web. • https://www.selenium.dev/ 18/22 https://www.selenium.dev/ SELENIUM Figura 6: Exemplo de ferramenta de captura e reexecução — Selenium IDE. 19/22 SELENIUM TEST SCRIPT { "id": "ce604a33-7c61-4027-9534-14837595b6f1", "version": "2.0", "name": "test", "url": "https://accounts.google.com", "tests": [{ "id": "4fe33155-1130-4867-9650-c3166de4a699", "name": "test1", "commands": [{ "id": "f53556c3-e92a-49cc-a1c7-55b41eadde66", "comment": "", "command": "open", "target": "/v3/signin/identifier?continue=https%3A%2F%2Fmail.google.com%2Fmail%2Fu%2F0%2F&emr=1&followup=https%3A%2F%2Fmail.google.com%2Fmail%2Fu%2F0%2F&ifkv=AYZoVhf48GxTaDPwjd-SZSFF4KkBz996rRRE1KNv6r822Ei6y8QOqj9sitIhTbsk0oEpPe8B6p1xFg&osid=1&passive=1209600&service=mail&flowName=GlifWebSignIn&flowEntry=ServiceLogin&dsh=S-922154920%3A1696277661979569&theme=glif", "targets": [], "value": "" }, ... { "id": "71df0f83-746c-44ef-beb5-c76cd994ee91", "comment": "", "command": "type", "target": "name=Passwd", "targets": [ ["name=Passwd", "name"], ["css=#password .whsOnd", "css:finder"], ["xpath=//input[@name='Passwd']", "xpath:attributes"], ["xpath=//div[@id='password']/div/div/div/input", "xpath:idRelative"], ["xpath=//div/div/div/input", "xpath:position"] ], "value": "123456" },... 20/22 SELENIUM TEST SCRIPT ...{ "id": "e8f4269e-c785-4a6b-aa70-cecaa0ec43dc", "comment": "", "command": "assertText", "target": "css=.OyEIQ > div:nth-child(2)", "targets": [ ["css=.OyEIQ > div:nth-child(2)", "css:finder"], ["xpath=//div[@id='yDmH0d']/c-wiz/div/div[2]/div/div/div/form/span/section[2]/div/div/div/div[2]/div[2]","xpath:idRelative"], ["xpath=//div[2]/div[2]", "xpath:position"] ], "value": "Senha incorreta. Tente novamente ou clique em \"Esqueceu a senha?\" para escolher outra." }] }], "suites": [{ "id": "a01fb6bb-2640-47dd-b896-2c9a241ff706", "name": "Default Suite", "persistSession": false, "parallel": false, "timeout": 300, "tests": ["4fe33155-1130-4867-9650-c3166de4a699"] }], "urls": ["https://accounts.google.com/"], "plugins": [] } 21/22 RESUMO • TDD – Test-Driven Development • Abordagem Red-Green-Refactor • Teste de unidade automatizado – xUnit • Teste de aceitação automatizado – Selenium 22/22
Compartilhar