Baixe o app para aproveitar ainda mais
Prévia do material em texto
7ºAula Objetivos de aprendizagem Ao término desta aula, vocês serão capazes de: conhecer o JUnit; saber como criar um arquivo de testes; entender como executar um arquivo de testes. Olá, pessoal, tudo bem? Bem-vindos(as) novamente a nossa disciplina “Verificação e Validação de Software”. Nesta aula e na próxima, vamos fazer um projeto dirigido com o intuito de mostrar para vocês como funcionam as ferramentas de testes unitários e como funciona na prática o ciclo TDD. Nesta aula, vamos aprender também como criar e executar um arquivo de classe de testes usando a IDE Netbeans. Leia atentamente esta aula e se tiver alguma dúvida use a sua área do aluno. Bons estudos. Bons estudos! 183 Veri cação e Validação de Soft are 40 Seções de estudo 1 - Aplicando TDD na prática 1 - Aplicando TDD na prática Nesta aula, vamos aprender como escrever testes unitários de verdade, usando a metodologia TDD, abordada na aula 05. Nossos testes e programas se aplicarão para uma classe chamada Aluno, que terá as seguintes necessidades: A classe Al no A nossa classe de e emplo representará um aluno em uma faculdade. Por questões didáticas, vamos resumir o campo de responsabilidades dessa classe, gerenciar as notas do aluno e determinar o seu status. Nesta faculdade o sistema de notas funciona da seguinte forma: • No semestre regular há duas notas: P1 e P2. • As duas notas são somadas e divididas por dois para formar a primeira média. • Se a média for maior igual a 7.0, o aluno será considerado aprovado. • Se a média for menor que 7.0, o aluno terá a necessidade de fazer uma prova substitutiva. • Quando o aluno faz uma prova substitutiva, a sua respectiva nota elimina a pior nota entre a P1 e a P2. • Um novo cálculo da média aritmética é feito entre o resultado da prova substitutiva e a maior nota entre a P1 e a P2. • Se a média for maior igual a sete, o aluno estará aprovado. • Se a média for menor que três, o aluno estará reprovado. • Se a média for maior igual a três e menor que sete, o aluno deverá fazer o e ame. Uma nova média aritmética é calculada entre a média da P1 e P2 com a nota do e ame. • Se essa nova média for maior igual a cinco, o aluno será considerado aprovado. • Se a média for menor que cinco, o aluno será considerado reprovado. Assim, foram levantados os seguintes atributos para essa classe: • notaP1, que armazena a nota da P1; • notaP2, que armazena a nota da P2; • notaSub, que armazena a nota da prova substitutiva e; • notaE ame, que armazena a nota do e ame. Além disso, foram levantados quatro métodos para essa classe: • calcularMedia, que calcula a média entre a P1 e a P2; • calcularMediaSub, que calcula a média entre a maior nota entre a P1 e P2 e a nota da substitutiva; • calcularMediaE ame, que calcula a média entre a média anterior com a nota do e ame; • status, que retorna o status do aluno de acordo com a situação do aluno. Essa situação pode ser: → “Cursando”, se nenhuma nota for informada. → “Necessário fazer Sub”. → “Necessário fazer E ame”. → “Reprovado”. → “Aprovado”. Assim, foi desenvolvido a seguinte lista de funcionalidades a ser implementadas para esse processo de criação da classe aluno: 1. Implementar o método status, para que retorne o status cursando. 2. Implementar o método calcularMédia. 3. Implementar a veri cação se o aluno está em sub ou não no método status (as regras serão da Unigran). 4. Implementar o método calcularMédiaSub. 5. Implementar a veri cação se o aluno está em e ame ou não. 6. Implementar o método calculaMédiaE ame. 7. Implementar a veri cação se o aluno está em DP ou não. Durante o processo de criação, usaremos esta lista para ordenar e guiar a nossa tarefa. Para esta aula, programaremos a nossa classe Aluno e os nossos testes usando a linguagem Java, usando o framework JUnit (https://junit.org/junit5/) para escrever os nossos testes unitários. Para a nossa programação, usaremos a IDE Netbeans, que vem com o JUnit integrado. nstalação do D e do et eans Para mais detalhes sobre a instalação do Netbeans e do JDK - necessários para o desenvolvimento do nosso projeto -, siga o nosso tutorial desenvolvido que está disponível na seção: “Arquivos”, da sua Área do Aluno. Caso já tenha instalado, ignore essa parte. Com o Netbeans instalado, abra-o. Você verá a seguinte tela: Depois, vá ao menu “File” (Arquivo) e depois clique em “New Project” (Novo Projeto). 184 41 Na janela que vai aparecer, clique na opção “Java” na área “Categories” (Categorias) e na opção “Java Application” (Aplicação Java) na área “Projects” (Projetos). Em seguida, clique em “Next” (Próximo). Depois, no campo “Project Name” (Nome do Projeto), dê um nome ao projeto. No nosso exemplo, vamos dar o nome “AlunoTDD”. Em seguida, clique no botão “Finish” (Terminar). Um novo projeto é criado e será aberto no Netbeans. Com o projeto criado, vamos criar um pacote para a nossa classe Aluno. Posicione o mouse sobre o pacote “alunotdd”, criado automaticamente pelo Netbeans. Depois, clique no botão direito do mouse. No menu pop-up que surgir clique em “New >” (Novo) e depois em “Java Package” (Pacote Java). Na janela que aparecer dê um nome ao pacote no campo “Package Name” (Nome do Pacote). No nosso exemplo, vamos dar o nome “classes”. Depois, clique no botão “Finish” (Terminar) para efetivar o salvamento do pacote. Depois disso, o pacote classes já estará listado na árvore do projeto. Agora, vamos criar a nossa classe Aluno. Para isso, pouse o mouse em cima do pacote classes, clique no botão direito do mouse, clique no botão “New >” (Novo) e depois em “Java Class” (Classe Java). 185 Veri cação e Validação de Soft are 42 No campo “Class Name” da janela que surgir, dê o nome “Aluno”. Depois, clique em “Finish” (Terminar) para salvar a classe. A classe estará listada na árvore do projeto, e o Netbeans já abrirá o arquivo da classe com o seu esqueleto básico já criado. Agora, vamos criar o nosso teste. Para isso, clique com o botão direito em qualquer arquivo ou pacote do painel esquerdo do projeto no Netbeans. No menu que surgir clique em “New >” (Novo) e depois em “Other” (Outro). Na janela que surgir clique em “Unit Tests” (Testes de Unidades) no painel “Categories” (Categorias). Em seguida, no painel “File Types” (Tipos de Arquivo) clique em JUnit Test (Teste JUnit). Feito isso, clique em “Next >” (Próximo). Depois, no campo “Class Name” (Nome da Classe) especifique qual será o nome da classe de testes. No nosso exemplo, ele vai ter o nome “AlunoTest”. No campo “Package” (Pacote), especificamos qual pacote a classe vai pertencer. Indicamos o nome classes, para ficar com o mesmo nome do pacote a qual a classe Aluno pertence. Feito isso, clique em “Finish” (Terminar): A nova classe aparecerá na árvore de projetos, na pasta “Test packages” (Pacotes de Testes). Além disso, o Netbeans abrirá automaticamente o arquivo. 186 43 O arquivo AlunoTest.java ficará mais ou menos assim: * * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. * package classes; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import static org.junit.Assert.*; ** * * @author DI * public class AlunoTest public AlunoTest() } @BeforeClass public static void setUpClass() } @AfterClass public static void tearDo nClass() } @Before public void setUp() } @After public void tearDo n() } TODO add test methods here. The methods must be annotated ith annotation @Test. For e ample: @Test public void hello() } } Não se preocupem com tudo isso. Vamos explicar o que esses métodos adicionais fazem mais adiante. Com o teste criado, adicione antes do construtor o atributo Aluno: public Aluno aluno; Em seguida, vamoscriar o nosso primeiro teste. Como já foi esclarecido no início da nossa aula, vamos seguir a ordem que definimos em nosso projeto. Assim, primeiro, vamos implementar o teste para o método status da classe Aluno. Esse método tem como objetivo mostrar qual é o status do aluno naquele instante. Como o aluno ainda não tem notas, vamos definir que a função status retorne sempre o texto “Cursando”. Mas, como prega o TDD, vamos para o teste antes. Assim, apague as linhas: TODO add test methods here. The methods must be annotated ith annotation @Test. For e ample: @Test public void hello() } E depois insira o seguinte método de teste: @Test public void testStatusCursando() aluno = ne Aluno(); assertEquals(“Cursando”, aluno.status()); } Como já foi dito na aula 06, todo teste no JUnit é um método que é precedido pela anotação @Test, que indica, e plicitamente, para o JUnit que se trata de um teste. Agora, vamos rodar os nossos testes. Para isso, posicione o mouse em cima do arquivo AlunoTest.java e clique com o botão direito do mouse nele. No menu que surgir clique no botão “Test File” (Testar Arquivo). Outra forma é usar o atalho de teclado Control + F6. 187 Veri cação e Validação de Soft are 44 O Netbeans vai detectar um erro e vai perguntar se você quer realmente executar esse teste. Clique em “Run Anyway” (Executar Mesmo Assim). Na parte inferior da janela do Netbeans vai aparecer um painel chamado “Test Results” (Resultados do Teste), que vai informar o resultado dos testes. Neste painel há uma barrinha que muda de cor. Se essa barra ficar vermelha, quer dizer que um ou mais testes falharam. Se a barrinha ficar verde, quer dizer que todos os testes passaram. Abaixo dessa barra será exibido mais detalhes a respeito da execução. No nosso exemplo, a barra ficou vermelha, pois os testes falharam. Bem, isso foi esperado, pois não temos implementação alguma do método status. Isso, vamos fazer agora. Abra o arquivo Aluno.java e insira o seguinte método: public String status() return “Cursando”; } Você deve estar se perguntando: só isso? Isso mesmo. O TDD prega pela simplicidade. Como nós estamos fazendo um teste que só espera que o programa retorne a palavra “Cursando”, fazemos isso. A medida que as novas funcionalidades são implementadas, colocamos. Mas somente quando há a necessidade. Salve o arquivo e rode o teste novamente. Agora sim, o teste passa e a barra fica verde. Passado essas duas etapas, chegamos a fase da refatoração. Mas não precisamos nesse momento. Assim, avançamos para a nossa segunda funcionalidade: O cálculo da média da P1 e P2. Adicione o seguinte método: @Test public void testCalcularMedia() aluno = ne Aluno(); aluno.notaP1 = 6; aluno.notaP2 = 8; assertEquals(7, aluno.calcularMedia()); } Na sequência, execute o teste. O teste vai falhar, pois não temos implementação alguma. Assim, vá ao arquivo Aluno. java. Primeiramente, vamos adicionar os dois atributos que representam as notas do aluno. Coloque antes da definição do método status: public float notaP1; public float notaP2; Em seguida, implementamos a função calcularMedia: public float calcularMedia() return (notaP1 + notaP2) 2; } Feito isso, salve o arquivo e rode o teste. O teste vai passar? Infelizmente não: Expandi a área de resultados para ver a informação. O erro foi causado pelo fato que estamos comparando um número de ponto flutuante, que nem sempre estará no seu valor exato. Um número 5.5 pode ser armazenado no computador como 5.50001, por exemplo. Isso é da natureza de armazenamento dos dados. Para lidar com isso, o método assertEquals possui um terceiro parâmetro, denominado de delta. Esse delta é uma faixa de variação em que o número de ponto flutuante pode variar. Por exemplo, se queremos que uma variável de ponto flutuante tenha um valor 6 e declararmos um delta de 0.001, significa que o valor pode transitar entre 5.999 a 6.001. Graças 188 45 a esse parâmetro temos uma garantia que o número de ponto flutuante seja testado. Portanto, altere a linha: assertEquals(7, aluno.calcularMedia()); Por: assertEquals(7, aluno.calcularMedia(), 0.001); Rode o teste. Agora ele passa. Com os testes passando, vamos para a fase da refatoração. Mas ainda não vemos a necessidade de melhorar o código. Vamos para a nossa próxima funcionalidade, que é a atualização da nossa função de status. Vamos testar três situações: Se a média for maior igual a sete, ele deve retornar “Aprovado”. Se a média for menor que sete, ele deve retornar “Necessário fazer Sub”. Assim, temos que escrever dois testes, sendo um para cada caso. Vamos ao código deles. @Test public void testStatusAprovadoDireto() aluno = ne Aluno(); aluno.notaP1 = 7; aluno.notaP2 = 8; assertEquals(“Aprovado”, aluno.status()); } @Test public void testStatusSub() aluno = ne Aluno(); aluno.notaP1 = 6; aluno.notaP2 = 6; assertEquals(“Necessário fazer Sub”, aluno.status()); } Rode os testes. Como esperado, os testes falham. Como você pode ver na mensagem, estávamos esperando textos diferentes. Mas a função status, nesse instante, só retorna a palavra “Cursando”. Precisamos criar a lógica de verificação para esse método. Assim, traçamos os seguintes passos para o método status: Se as notas não forem definidas, ele retorna o texto “Cursando”. Se as notas forem definidas, ele calcula a média, podendo cair nas seguintes situações: Se a média for maior igual a sete, o método retorna o status “Aprovado”. Se a média for menor que sete, o método retorna o status “Necessário fazer Sub”. Assim, vamos por a mão no código. Reflita um pouco antes de avançar na leitura como seria a implementação disso. A seguir, apresentaremos a nova implementação do método status: public float notaP1 = -1; public float notaP2 = -1; public String status() if (notaP1 0 && notaP2 0) return “Cursando”; } float media = calcularMedia(); if (media = 7.0) return “Aprovado”; }else return “Necessário fazer Sub”; } } Nesse código, estamos fazendo vários testes. Primeiramente, adotamos um valor padrão para as notas P1 e P2, para indicar que não foram atribuídas pelo usuário. Colocamos o valor -1 na declaração dos atributos para indicar isso. No método status, verificamos se as notas P1 e P2 são menores que zero. Se for, as notas não estão atribuídas. Assim, retornamos a string “Cursando” para esse caso. Se as notas P1 e P2 forem iguais ou maiores que zero, significa que as notas já foram atribuídas. Assim, podemos fazer o cálculo da média e fazer a verificação se o aluno está aprovado (caso tenha média igual ou maior que 7.0) ou não. Rode os testes. Agora eles funcionam. E com isso, finalizamos a nossa aula. Na próxima aula, vamos seguir com o ciclo TDD para terminar a implementação da classe Aluno. Até lá! 189 Veri cação e Validação de Soft are 46 Retomando a aula Chegamos ao nal da sétima aula. Vamos relembrar? 1 - Aplicando TDD na prática Nessa seção, aprendemos como fazer um arquivo de testes na IDE Netbeans. Além disso, vocês aprenderam como executar os seus testes dentro dessa ferramenta, e como comparar valores, usando o método assertEquals. ANICHE, Maurício. Test-Driven Development: Teste e Design no Mundo Real. São Paulo: Casa do Código, 2012. SOMMERVILLE, Ian. Engenharia de software. 9. ed. São Paulo: Pearson Addison Wesley, 2014. PRESSMAN, Roger S. Engenharia de software: uma abordagem profissional. 8. ed. São Paulo: McGraw-Hill; Porto Alegre: Bookman; Santana: AMGH Editora, 2016. Vale a pena ler Vale a pena ANICHE, Maurício. TDD. Caelum, 2014. Disponível em: < http://tdd.caelum.com.br/>. Acesso em: 16 set. 2018. GAMA, Alexandre. Test Driven Development: TDD Simples e Prático. DevMedia, 2010. Disponível em: < ht- tps://www.devmedia.com.br/test-driven-development- tdd-simples-e-pratico/1853 >. Acesso em: 16 set. 2018. Vale a pena acessar Minhas anotações 190
Compartilhar