JUnit - Guia rápido
Teste é o processo de verificar a funcionalidade de um aplicativo para garantir que ele seja executado de acordo com os requisitos. O teste de unidade surge no nível dos desenvolvedores; é o teste de uma única entidade (classe ou método). O teste de unidade desempenha um papel crítico em ajudar uma empresa de software a entregar produtos de qualidade a seus clientes.
O teste de unidade pode ser feito de duas maneiras - teste manual e teste automatizado.
Teste Manual | Teste Automatizado |
---|---|
Executar casos de teste manualmente sem qualquer suporte de ferramenta é conhecido como teste manual. | Obter suporte de ferramenta e executar os casos de teste usando uma ferramenta de automação é conhecido como teste de automação. |
Time-consuming and tedious - Como os casos de teste são executados por recursos humanos, é muito lento e tedioso. | Fast - A automação executa casos de teste significativamente mais rápido do que recursos humanos. |
Huge investment in human resources - Como os casos de teste precisam ser executados manualmente, mais testadores são necessários no teste manual. | Less investment in human resources - Casos de teste são executados usando ferramentas de automação, portanto, menos número de testadores são necessários nos testes de automação. |
Less reliable - O teste manual é menos confiável, pois leva em consideração os erros humanos. | More reliable - Os testes de automação são precisos e confiáveis. |
Non-programmable - Nenhuma programação pode ser feita para escrever testes sofisticados para buscar informações ocultas. | Programmable - Os testadores podem programar testes sofisticados para revelar informações ocultas. |
O que é JUnit?
JUnit é uma estrutura de teste de unidade para a linguagem de programação Java. Ele desempenha um papel crucial no desenvolvimento orientado a testes e é uma família de estruturas de teste de unidade conhecidas coletivamente como xUnit.
JUnit promove a ideia de "primeiro testar e depois codificar", que enfatiza a configuração dos dados de teste para um trecho de código que pode ser testado primeiro e depois implementado. Essa abordagem é como "teste um pouco, codifique um pouco, teste um pouco, codifique um pouco". Ele aumenta a produtividade do programador e a estabilidade do código do programa, o que, por sua vez, reduz o estresse do programador e o tempo gasto na depuração.
Recursos do JUnit
JUnit é uma estrutura de código aberto, usada para escrever e executar testes.
Fornece anotações para identificar métodos de teste.
Fornece afirmações para testar os resultados esperados.
Fornece executores de teste para testes em execução.
Os testes JUnit permitem escrever códigos mais rapidamente, o que aumenta a qualidade.
JUnit é elegantemente simples. É menos complexo e leva menos tempo.
Os testes JUnit podem ser executados automaticamente e eles verificam seus próprios resultados e fornecem feedback imediato. Não há necessidade de vasculhar manualmente um relatório de resultados de teste.
Os testes JUnit podem ser organizados em suítes de teste contendo casos de teste e até mesmo outras suítes de teste.
O JUnit mostra o andamento do teste em uma barra que fica verde se o teste está funcionando sem problemas e fica vermelha quando um teste falha.
O que é um caso de teste de unidade?
Um Caso de Teste de Unidade é uma parte do código, o que garante que outra parte do código (método) funcione conforme o esperado. Para alcançar os resultados desejados rapidamente, uma estrutura de teste é necessária. JUnit é uma estrutura de teste de unidade perfeita para a linguagem de programação Java.
Um caso de teste de unidade formal escrito é caracterizado por uma entrada conhecida e uma saída esperada, que é elaborada antes da execução do teste. A entrada conhecida deve testar uma pré-condição e a saída esperada deve testar uma pós-condição.
Deve haver pelo menos dois casos de teste de unidade para cada requisito - um teste positivo e um teste negativo. Se um requisito tiver sub-requisitos, cada sub-requisito deve ter pelo menos dois casos de teste como positivos e negativos.
Configuração de ambiente local
JUnit é uma estrutura para Java, portanto, o primeiro requisito é ter o JDK instalado em sua máquina.
Requisitos do sistema
JDK | 1,5 ou superior. |
---|---|
Memória | Sem requisitos mínimos. |
Espaço em disco | Sem requisitos mínimos. |
Sistema operacional | Sem requisitos mínimos. |
Etapa 1: verifique a instalação do Java em sua máquina
Em primeiro lugar, abra o console e execute um comando java baseado no sistema operacional em que está trabalhando.
SO | Tarefa | Comando |
---|---|---|
janelas | Abrir console de comando | c: \> versão java |
Linux | Abra o terminal de comando | $ java -version |
Mac | Terminal aberto | máquina: ~ joseph $ java -version |
Vamos verificar a saída de todos os sistemas operacionais -
SO | Resultado |
---|---|
janelas | versão java "1.8.0_101" Java (TM) SE Runtime Environment (build 1.8.0_101) |
Linux | versão java "1.8.0_101" Java (TM) SE Runtime Environment (build 1.8.0_101) |
Mac | versão java "1.8.0_101" Java (TM) SE Runtime Environment (build 1.8.0_101) |
Se você não tiver o Java instalado em seu sistema, baixe o Java Software Development Kit (SDK) do seguinte link https://www.oracle.com. Estamos assumindo o Java 1.8.0_101 como a versão instalada para este tutorial.
Etapa 2: definir o ambiente JAVA
Colocou o JAVA_HOMEvariável de ambiente para apontar para o local do diretório base onde o Java está instalado em sua máquina. Por exemplo.
SO | Resultado |
---|---|
janelas | Defina a variável de ambiente JAVA_HOME para C: \ Program Files \ Java \ jdk1.8.0_101 |
Linux | export JAVA_HOME = / usr / local / java-current |
Mac | export JAVA_HOME = / Library / Java / Home |
Anexe a localização do compilador Java ao caminho do sistema.
SO | Resultado |
---|---|
janelas | Anexar a string C:\Program Files\Java\jdk1.8.0_101\bin no final da variável do sistema, Path. |
Linux | exportar PATH = $PATH:$JAVA_HOME / bin / |
Mac | não requerido |
Verifique a instalação do Java usando o comando java -version conforme explicado acima.
Etapa 3: Baixe o arquivo JUnit
Baixe a versão mais recente do arquivo JUnit jar em http://www.junit.org. No momento de escrever este tutorial, baixamos Junit-4.12.jar e o copiamos para a pasta C: \> JUnit.
SO | Nome do arquivo |
---|---|
janelas | junit4.12.jar |
Linux | junit4.12.jar |
Mac | junit4.12.jar |
Etapa 4: definir o ambiente JUnit
Colocou o JUNIT_HOMEvariável de ambiente para apontar para o local do diretório base onde o jar JUNIT está armazenado em sua máquina. Vamos supor que armazenamos junit4.12.jar na pasta JUNIT.
Sr. Não | SO e descrição |
---|---|
1 | Windows Defina a variável de ambiente JUNIT_HOME para C: \ JUNIT |
2 | Linux export JUNIT_HOME = / usr / local / JUNIT |
3 | Mac export JUNIT_HOME = / Biblioteca / JUNIT |
Etapa 5: definir a variável CLASSPATH
Colocou o CLASSPATH variável de ambiente para apontar para a localização do jar JUNIT.
Sr. Não | SO e descrição |
---|---|
1 | Windows Defina a variável de ambiente CLASSPATH como% CLASSPATH%;% JUNIT_HOME% \ junit4.12.jar;.; |
2 | Linux export CLASSPATH = $CLASSPATH:$JUNIT_HOME / junit4.12.jar :. |
3 | Mac export CLASSPATH = $CLASSPATH:$JUNIT_HOME / junit4.12.jar :. |
Etapa 6: teste a configuração do JUnit
Crie um arquivo de classe java com o nome TestJunit em C:\>JUNIT_WORKSPACE
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class TestJunit {
@Test
public void testAdd() {
String str = "Junit is working fine";
assertEquals("Junit is working fine",str);
}
}
Crie um arquivo de classe java com o nome TestRunner em C:\>JUNIT_WORKSPACE para executar caso (s) de teste.
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(TestJunit.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
Etapa 7: verificar o resultado
Compile as classes usando javac compilador da seguinte forma -
C:\JUNIT_WORKSPACE>javac TestJunit.java TestRunner.java
Agora execute o Test Runner para ver o resultado da seguinte forma -
C:\JUNIT_WORKSPACE>java TestRunner
Verifique a saída.
true
JUnit é um Regression Testing Frameworkusado por desenvolvedores para implementar testes de unidade em Java e acelerar a velocidade de programação e aumentar a qualidade do código. O JUnit Framework pode ser facilmente integrado com qualquer um dos seguintes -
- Eclipse
- Ant
- Maven
Recursos do JUnit Test Framework
A estrutura de teste JUnit fornece os seguintes recursos importantes -
- Fixtures
- Suítes de teste
- Corredores de teste
- Classes JUnit
Luminárias
Fixturesé um estado fixo de um conjunto de objetos usados como linha de base para a execução de testes. O objetivo de um dispositivo de teste é garantir que haja um ambiente bem conhecido e fixo no qual os testes são executados para que os resultados sejam repetidos. Inclui -
- método setUp (), que é executado antes de cada invocação de teste.
- método tearDown (), que é executado após cada método de teste.
Vamos verificar um exemplo -
import junit.framework.*;
public class JavaTest extends TestCase {
protected int value1, value2;
// assigning the values
protected void setUp(){
value1 = 3;
value2 = 3;
}
// test method to add two values
public void testAdd(){
double result = value1 + value2;
assertTrue(result == 6);
}
}
Suites de teste
Um conjunto de testes agrupa alguns casos de teste de unidade e os executa juntos. No JUnit, as anotações @RunWith e @Suite são usadas para executar o teste do conjunto. Abaixo está um exemplo que usa as classes de teste TestJunit1 e TestJunit2.
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
//JUnit Suite Test
@RunWith(Suite.class)
@Suite.SuiteClasses({
TestJunit1.class ,TestJunit2.class
})
public class JunitTestSuite {
}
import org.junit.Test;
import org.junit.Ignore;
import static org.junit.Assert.assertEquals;
public class TestJunit1 {
String message = "Robert";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
assertEquals(message, messageUtil.printMessage());
}
}
import org.junit.Test;
import org.junit.Ignore;
import static org.junit.Assert.assertEquals;
public class TestJunit2 {
String message = "Robert";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "Hi!" + "Robert";
assertEquals(message,messageUtil.salutationMessage());
}
}
Executores de teste
O executor de teste é usado para executar os casos de teste. Aqui está um exemplo que assume a classe de testeTestJunit já existe.
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(TestJunit.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
Classes JUnit
As classes JUnit são classes importantes, usadas para escrever e testar JUnits. Algumas das classes importantes são -
Assert - Contém um conjunto de métodos de declaração.
TestCase - Contém um caso de teste que define o aparelho para executar vários testes.
TestResult - Contém métodos para coletar os resultados da execução de um caso de teste.
Vamos agora ter um exemplo básico para demonstrar o processo passo a passo de usar JUnit.
Criar uma aula
Crie uma classe java a ser testada, digamos, MessageUtil.java em C:\>JUNIT_WORKSPACE
/*
* This class prints the given message on console.
*/
public class MessageUtil {
private String message;
//Constructor
//@param message to be printed
public MessageUtil(String message){
this.message = message;
}
// prints the message
public String printMessage(){
System.out.println(message);
return message;
}
}
Criar classe de caso de teste
- Crie uma classe de teste java, digamos, TestJunit.java.
- Adicione um método de teste testPrintMessage () à sua classe de teste.
- Adicione um Annotaion @Test ao método testPrintMessage ().
- Implemente a condição de teste e verifique a condição usando a API assertEquals do JUnit.
Crie um arquivo de classe java com o nome TestJunit.java em C:\>JUNIT_WORKSPACE.
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class TestJunit {
String message = "Hello World";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testPrintMessage() {
assertEquals(message,messageUtil.printMessage());
}
}
Criar classe de executor de teste
- Crie uma classe Java TestRunner.
- Use o método runClasses da classe JUnitCore de JUnit para executar o caso de teste da classe de teste criada acima.
- Obtenha o resultado dos casos de teste executados no Objeto Result.
- Obtenha falha (s) usando o método getFailures () do objeto Result.
- Obtenha o resultado de Sucesso usando o método wasSuccessful () do objeto Result.
Crie um arquivo de classe java chamado TestRunner.java em C:\>JUNIT_WORKSPACE para executar caso (s) de teste.
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(TestJunit.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
Compile as classes MessageUtil, Test case e Test Runner usando javac.
C:\JUNIT_WORKSPACE>javac MessageUtil.java TestJunit.java TestRunner.java
Agora execute o Test Runner, que executará o caso de teste definido na classe Test Case fornecida.
C:\JUNIT_WORKSPACE>java TestRunner
Verifique a saída.
Hello World
true
Agora atualize TestJunit em C:\>JUNIT_WORKSPACEpara que o teste falhe. Altere a string da mensagem.
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class TestJunit {
String message = "Hello World";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testPrintMessage() {
message = "New Word";
assertEquals(message,messageUtil.printMessage());
}
}
Vamos manter o resto das classes como estão e tentar executar o mesmo Test Runner.
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(TestJunit.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
Agora execute o Test Runner, que executará o caso de teste definido na classe Test Case fornecida.
C:\JUNIT_WORKSPACE>java TestRunner
Verifique a saída.
Hello World
testPrintMessage(TestJunit): expected:<[New Wor]d> but was:<[Hello Worl]d>
false
O pacote mais importante no JUnit é junit.framework, que contém todas as classes principais. Algumas das classes importantes são as seguintes -
Sr. Não. | Nome da classe | Funcionalidade |
---|---|---|
1 | Afirmar | Um conjunto de métodos de declaração. |
2 | Caso de teste | Um caso de teste define o dispositivo para executar vários testes. |
3 | Resultado do teste | Um TestResult coleta os resultados da execução de um caso de teste. |
4 | Suíte de teste | Um TestSuite é um composto de testes. |
Classe Assert
A seguir está a declaração para org.junit.Assert classe -
public class Assert extends java.lang.Object
Esta classe fornece um conjunto de métodos de asserção úteis para escrever testes. Apenas as afirmações com falha são registradas. Alguns dos métodos importantes da classe Assert são os seguintes -
Sr. Não. | Métodos e Descrição |
---|---|
1 | void assertEquals(boolean expected, boolean actual) Verifica se dois primitivos / objetos são iguais. |
2 | void assertFalse(boolean condition) Verifica se uma condição é falsa. |
3 | void assertNotNull(Object object) Verifica se um objeto não é nulo. |
4 | void assertNull(Object object) Verifica se um objeto é nulo. |
5 | void assertTrue(boolean condition) Verifica se uma condição é verdadeira. |
6 | void fail() Falha em um teste sem mensagem. |
Vamos usar alguns dos métodos mencionados acima em um exemplo. Crie um arquivo de classe java chamado TestJunit1.java emC:\>JUNIT_WORKSPACE.
import org.junit.Test;
import static org.junit.Assert.*;
public class TestJunit1 {
@Test
public void testAdd() {
//test data
int num = 5;
String temp = null;
String str = "Junit is working fine";
//check for equality
assertEquals("Junit is working fine", str);
//check for false condition
assertFalse(num > 6);
//check for not null value
assertNotNull(temp);
}
}
Em seguida, crie um arquivo de classe java chamado TestRunner1.java em C: \> JUNIT_WORKSPACE para executar caso (s) de teste.
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner1 {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(TestJunit1.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
Compile o caso de teste e as classes Test Runner usando javac.
C:\JUNIT_WORKSPACE>javac TestJunit1.java TestRunner1.java
Agora execute o Test Runner, que executará o caso de teste definido na classe Test Case fornecida.
C:\JUNIT_WORKSPACE>java TestRunner1
Verifique a saída.
true
Classe TestCase
A seguir está a declaração para org.junit.TestCase classe -
public abstract class TestCase extends Assert implements Test
Um caso de teste define o dispositivo para executar vários testes. Alguns dos métodos importantes deTestCase classe são as seguintes -
Sr. Não. | Métodos e Descrição |
---|---|
1 | int countTestCases() Conta o número de casos de teste executados por execução (resultado do TestResult). |
2 | TestResult createResult() Cria um objeto TestResult padrão. |
3 | String getName() Obtém o nome de um TestCase. |
4 | TestResult run() Um método conveniente para executar este teste, coletando os resultados com um objeto TestResult padrão. |
5 | void run(TestResult result) Executa o caso de teste e coleta os resultados em TestResult. |
6 | void setName(String name) Define o nome de um TestCase. |
7 | void setUp() Configura o aparelho, por exemplo, abre uma conexão de rede. |
8 | void tearDown() Derruba o aparelho, por exemplo, fecha uma conexão de rede. |
9 | String toString() Retorna uma representação de string do caso de teste. |
Vamos usar alguns dos métodos mencionados acima em um exemplo. Crie um arquivo de classe java chamadoTestJunit2.java em C: \> JUNIT_WORKSPACE.
import junit.framework.TestCase;
import org.junit.Before;
import org.junit.Test;
public class TestJunit2 extends TestCase {
protected double fValue1;
protected double fValue2;
@Before
public void setUp() {
fValue1 = 2.0;
fValue2 = 3.0;
}
@Test
public void testAdd() {
//count the number of test cases
System.out.println("No of Test Case = "+ this.countTestCases());
//test getName
String name = this.getName();
System.out.println("Test Case Name = "+ name);
//test setName
this.setName("testNewAdd");
String newName = this.getName();
System.out.println("Updated Test Case Name = "+ newName);
}
//tearDown used to close the connection or clean up activities
public void tearDown( ) {
}
}
Em seguida, crie um arquivo de classe java chamado TestRunner2.java em C: \> JUNIT_WORKSPACE para executar caso (s) de teste.
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner2 {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(TestJunit2.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
Compile o caso de teste e as classes Test Runner usando javac.
C:\JUNIT_WORKSPACE>javac TestJunit2.java TestRunner2.java
Agora execute o Test Runner, que executará o caso de teste definido na classe Test Case fornecida.
C:\JUNIT_WORKSPACE>java TestRunner2
Verifique a saída.
No of Test Case = 1
Test Case Name = testAdd
Updated Test Case Name = testNewAdd
true
Classe TestResult
A seguir está a declaração para org.junit.TestResult classe -
public class TestResult extends Object
Um TestResult coleta os resultados da execução de um caso de teste. É uma instância do padrão de parâmetro de coleta. A estrutura de teste distingue entre falhas e erros. Uma falha é antecipada e verificada com afirmações. Erros são problemas imprevistos, como uma ArrayIndexOutOfBoundsException. Alguns dos métodos importantes deTestResult classe são as seguintes -
Sr. Não. | Métodos e Descrição |
---|---|
1 | void addError(Test test, Throwable t) Adiciona um erro à lista de erros. |
2 | void addFailure(Test test, AssertionFailedError t) Adiciona uma falha à lista de falhas. |
3 | void endTest(Test test) Informa o resultado de que um teste foi concluído. |
4 | int errorCount() Obtém o número de erros detectados. |
5 | Enumeration<TestFailure> errors() Retorna uma Enumeração para os erros. |
6 | int failureCount() Obtém o número de falhas detectadas. |
7 | void run(TestCase test) Executa um TestCase. |
8 | int runCount() Obtém o número de testes de execução. |
9 | void startTest(Test test) Informa o resultado de que um teste será iniciado. |
10 | void stop() Marca que a execução do teste deve parar. |
Crie um arquivo de classe java chamado TestJunit3.java em C: \> JUNIT_WORKSPACE.
import org.junit.Test;
import junit.framework.AssertionFailedError;
import junit.framework.TestResult;
public class TestJunit3 extends TestResult {
// add the error
public synchronized void addError(Test test, Throwable t) {
super.addError((junit.framework.Test) test, t);
}
// add the failure
public synchronized void addFailure(Test test, AssertionFailedError t) {
super.addFailure((junit.framework.Test) test, t);
}
@Test
public void testAdd() {
// add any test
}
// Marks that the test run should stop.
public synchronized void stop() {
//stop the test here
}
}
Em seguida, crie um arquivo de classe java chamado TestRunner3.java em C: \> JUNIT_WORKSPACE para executar caso (s) de teste.
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner3 {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(TestJunit3.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
Compile o caso de teste e as classes Test Runner usando javac.
C:\JUNIT_WORKSPACE>javac TestJunit3.java TestRunner3.java
Agora execute o Test Runner, que executará o caso de teste definido na classe Test Case fornecida.
C:\JUNIT_WORKSPACE>java TestRunner3
Verifique a saída.
true
Classe TestSuite
A seguir está a declaração para org.junit.TestSuite classe:
public class TestSuite extends Object implements Test
Um TestSuite é um composto de testes. Ele executa uma coleção de casos de teste. Alguns dos métodos importantes deTestSuite classe são as seguintes -
Sr. Não. | Métodos e Descrição |
---|---|
1 | void addTest(Test test) Adiciona um teste ao conjunto. |
2 | void addTestSuite(Class<? extends TestCase> testClass) Adiciona os testes da classe dada ao conjunto. |
3 | int countTestCases() Conta o número de casos de teste que serão executados por este teste. |
4 | String getName() Retorna o nome da suíte. |
5 | void run(TestResult result) Executa os testes e coleta seu resultado em um TestResult. |
6 | void setName(String name) Define o nome da suíte. |
7 | Test testAt(int index) Retorna o teste no índice fornecido. |
8 | int testCount() Retorna o número de testes neste conjunto. |
9 | static Test warning(String message) Retorna um teste que falhará e registrará uma mensagem de aviso. |
Crie um arquivo de classe java chamado JunitTestSuite.java em C: \> JUNIT_WORKSPACE para criar o conjunto de testes.
import junit.framework.*;
public class JunitTestSuite {
public static void main(String[] a) {
// add the test's in the suite
TestSuite suite = new TestSuite(TestJunit1.class, TestJunit2.class, TestJunit3.class );
TestResult result = new TestResult();
suite.run(result);
System.out.println("Number of test cases = " + result.runCount());
}
}
Compile as classes do conjunto de testes usando javac.
C:\JUNIT_WORKSPACE>javac JunitTestSuite.java
Agora execute o Test Suite.
C:\JUNIT_WORKSPACE>java JunitTestSuite
Verifique a saída.
No of Test Case = 1
Test Case Name = testAdd
Updated Test Case Name = testNewAdd
Number of test cases = 3
Aqui, veremos um exemplo completo de teste JUnit usando a classe POJO, a classe de lógica de negócios e uma classe de teste, que será executada pelo executor de teste.
Crio EmployeeDetails.java em C: \> JUNIT_WORKSPACE, que é uma classe POJO.
public class EmployeeDetails {
private String name;
private double monthlySalary;
private int age;
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the monthlySalary
*/
public double getMonthlySalary() {
return monthlySalary;
}
/**
* @param monthlySalary the monthlySalary to set
*/
public void setMonthlySalary(double monthlySalary) {
this.monthlySalary = monthlySalary;
}
/**
* @return the age
*/
public int getAge() {
return age;
}
/**
* @param age the age to set
*/
public void setAge(int age) {
this.age = age;
}
}
EmployeeDetails classe é usada para -
- obter / definir o valor do nome do funcionário.
- obter / definir o valor do salário mensal do funcionário.
- obter / definir o valor da idade do funcionário.
Crie um arquivo chamado EmpBusinessLogic.java em C: \> JUNIT_WORKSPACE, que contém a lógica de negócios.
public class EmpBusinessLogic {
// Calculate the yearly salary of employee
public double calculateYearlySalary(EmployeeDetails employeeDetails) {
double yearlySalary = 0;
yearlySalary = employeeDetails.getMonthlySalary() * 12;
return yearlySalary;
}
// Calculate the appraisal amount of employee
public double calculateAppraisal(EmployeeDetails employeeDetails) {
double appraisal = 0;
if(employeeDetails.getMonthlySalary() < 10000){
appraisal = 500;
}else{
appraisal = 1000;
}
return appraisal;
}
}
EmpBusinessLogic classe é usada para calcular -
- o salário anual de um empregado.
- o valor de avaliação de um funcionário.
Crie um arquivo chamado TestEmployeeDetails.java em C: \> JUNIT_WORKSPACE, que contém os casos de teste a serem testados.
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class TestEmployeeDetails {
EmpBusinessLogic empBusinessLogic = new EmpBusinessLogic();
EmployeeDetails employee = new EmployeeDetails();
//test to check appraisal
@Test
public void testCalculateAppriasal() {
employee.setName("Rajeev");
employee.setAge(25);
employee.setMonthlySalary(8000);
double appraisal = empBusinessLogic.calculateAppraisal(employee);
assertEquals(500, appraisal, 0.0);
}
// test to check yearly salary
@Test
public void testCalculateYearlySalary() {
employee.setName("Rajeev");
employee.setAge(25);
employee.setMonthlySalary(8000);
double salary = empBusinessLogic.calculateYearlySalary(employee);
assertEquals(96000, salary, 0.0);
}
}
TestEmployeeDetails classe é usada para testar os métodos de EmpBusinessLogicclasse. isto
- testa o salário anual do funcionário.
- testa o valor de avaliação do funcionário.
Em seguida, crie um arquivo de classe java chamado TestRunner.java em C: \> JUNIT_WORKSPACE para executar caso (s) de teste.
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(TestEmployeeDetails.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
Compile o caso de teste e as classes Test Runner usando javac.
C:\JUNIT_WORKSPACE>javac EmployeeDetails.java
EmpBusinessLogic.java TestEmployeeDetails.java TestRunner.java
Agora execute o Test Runner, que executará o caso de teste definido na classe Test Case fornecida.
C:\JUNIT_WORKSPACE>java TestRunner
Verifique a saída.
true
Afirmação
Todas as asserções estão na classe Assert.
public class Assert extends java.lang.Object
Esta classe fornece um conjunto de métodos de asserção, úteis para escrever testes. Apenas as afirmações com falha são registradas. Alguns dos métodos importantes da classe Assert são os seguintes -
Sr. Não. | Métodos e Descrição |
---|---|
1 | void assertEquals(boolean expected, boolean actual) Verifica se dois primitivos / objetos são iguais. |
2 | void assertTrue(boolean condition) Verifica se uma condição é verdadeira. |
3 | void assertFalse(boolean condition) Verifica se uma condição é falsa. |
4 | void assertNotNull(Object object) Verifica se um objeto não é nulo. |
5 | void assertNull(Object object) Verifica se um objeto é nulo. |
6 | void assertSame(object1, object2) O método assertSame () testa se duas referências de objeto apontam para o mesmo objeto. |
7 | void assertNotSame(object1, object2) O método assertNotSame () testa se duas referências de objeto não apontam para o mesmo objeto. |
8 | void assertArrayEquals(expectedArray, resultArray); O método assertArrayEquals () testará se dois arrays são iguais. |
Vamos usar alguns dos métodos mencionados acima em um exemplo. Crie um arquivo de classe java chamadoTestAssertions.java em C: \> JUNIT_WORKSPACE.
import org.junit.Test;
import static org.junit.Assert.*;
public class TestAssertions {
@Test
public void testAssertions() {
//test data
String str1 = new String ("abc");
String str2 = new String ("abc");
String str3 = null;
String str4 = "abc";
String str5 = "abc";
int val1 = 5;
int val2 = 6;
String[] expectedArray = {"one", "two", "three"};
String[] resultArray = {"one", "two", "three"};
//Check that two objects are equal
assertEquals(str1, str2);
//Check that a condition is true
assertTrue (val1 < val2);
//Check that a condition is false
assertFalse(val1 > val2);
//Check that an object isn't null
assertNotNull(str1);
//Check that an object is null
assertNull(str3);
//Check if two object references point to the same object
assertSame(str4,str5);
//Check if two object references not point to the same object
assertNotSame(str1,str3);
//Check whether two arrays are equal to each other.
assertArrayEquals(expectedArray, resultArray);
}
}
Em seguida, crie um arquivo de classe java chamado TestRunner.java em C: \> JUNIT_WORKSPACE para executar caso (s) de teste.
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner2 {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(TestAssertions.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
Compile o caso de teste e as classes Test Runner usando javac.
C:\JUNIT_WORKSPACE>javac TestAssertions.java TestRunner.java
Agora execute o Test Runner, que executará o caso de teste definido na classe Test Case fornecida.
C:\JUNIT_WORKSPACE>java TestRunner
Verifique a saída.
true
Anotação
As anotações são como metatags que você pode adicionar ao seu código e aplicá-las a métodos ou em classe. Essas anotações no JUnit fornecem as seguintes informações sobre os métodos de teste -
- quais métodos serão executados antes e depois dos métodos de teste.
- quais métodos são executados antes e depois de todos os métodos e.
- quais métodos ou classes serão ignorados durante a execução.
A tabela a seguir fornece uma lista de anotações e seu significado no JUnit -
Sr. Não. | Anotação e descrição |
---|---|
1 | @Test A anotação de teste informa ao JUnit que o método void público ao qual está anexado pode ser executado como um caso de teste. |
2 | @Before Vários testes precisam de objetos semelhantes criados antes de serem executados. Anotar um método void público com @Before faz com que esse método seja executado antes de cada método de teste. |
3 | @After Se você alocar recursos externos em um método Before, precisará liberá-los após a execução do teste. Anotar um método void público com @After faz com que esse método seja executado após o método Test. |
4 | @BeforeClass Anotar um método void estático público com @BeforeClass faz com que ele seja executado uma vez antes de qualquer um dos métodos de teste na classe. |
5 | @AfterClass Isso executará o método após a conclusão de todos os testes. Isso pode ser usado para realizar atividades de limpeza. |
6 | @Ignore A anotação Ignorar é usada para ignorar o teste e esse teste não será executado. |
Crie um arquivo de classe java chamado JunitAnnotation.java em C: \> JUNIT_WORKSPACE para testar a anotação.
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
public class JunitAnnotation {
//execute before class
@BeforeClass
public static void beforeClass() {
System.out.println("in before class");
}
//execute after class
@AfterClass
public static void afterClass() {
System.out.println("in after class");
}
//execute before test
@Before
public void before() {
System.out.println("in before");
}
//execute after test
@After
public void after() {
System.out.println("in after");
}
//test case
@Test
public void test() {
System.out.println("in test");
}
//test case ignore and will not execute
@Ignore
public void ignoreTest() {
System.out.println("in ignore test");
}
}
Em seguida, crie um arquivo de classe java chamado TestRunner.java em C: \> JUNIT_WORKSPACE para executar anotações.
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(JunitAnnotation.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
Compile o caso de teste e as classes Test Runner usando javac.
C:\JUNIT_WORKSPACE>javac JunitAnnotation.java TestRunner.java
Agora execute o Test Runner, que executará o caso de teste definido na classe Test Case fornecida.
C:\JUNIT_WORKSPACE>java TestRunner
Verifique a saída.
in before class
in before
in test
in after
in after class
true
Este capítulo explica o procedimento de execução de métodos em JUnit, que define a ordem dos métodos chamados. Discutido a seguir é o procedimento de execução dos métodos de API de teste JUnit com exemplo.
Crie um arquivo de classe java denominado ExecutionProcedureJunit.java em C: \> JUNIT_WORKSPACE para testar a anotação.
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
public class ExecutionProcedureJunit {
//execute only once, in the starting
@BeforeClass
public static void beforeClass() {
System.out.println("in before class");
}
//execute only once, in the end
@AfterClass
public static void afterClass() {
System.out.println("in after class");
}
//execute for each test, before executing test
@Before
public void before() {
System.out.println("in before");
}
//execute for each test, after executing test
@After
public void after() {
System.out.println("in after");
}
//test case 1
@Test
public void testCase1() {
System.out.println("in test case 1");
}
//test case 2
@Test
public void testCase2() {
System.out.println("in test case 2");
}
}
Em seguida, crie um arquivo de classe java chamado TestRunner.java em C: \> JUNIT_WORKSPACE para executar anotações.
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(ExecutionProcedureJunit.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
Compile o caso de teste e as classes Test Runner usando javac.
C:\JUNIT_WORKSPACE>javac ExecutionProcedureJunit.java TestRunner.java
Agora execute o Test Runner, que executará o caso de teste definido na classe Test Case fornecida.
C:\JUNIT_WORKSPACE>java TestRunner
Verifique a saída.
in before class
in before
in test case 1
in after
in before
in test case 2
in after
in after class
Veja a saída acima. O procedimento de execução é o seguinte -
- Em primeiro lugar, o método beforeClass () executa apenas uma vez.
- O método afterClass () é executado apenas uma vez.
- O método before () executa para cada caso de teste, mas antes de executar o caso de teste.
- O método after () é executado para cada caso de teste, mas após a execução do caso de teste.
- Entre before () e after (), cada caso de teste é executado.
Os casos de teste são executados usando JUnitCoreclasse. JUnitCore é uma fachada para a execução de testes. Ele suporta a execução de testes JUnit 4, testes JUnit 3.8.x e misturas. Para executar testes na linha de comando, execute java org.junit.runner.JUnitCore <TestClass>. Para execuções de teste único, use o método estático runClasses (Class []).
A seguir está a declaração para org.junit.runner.JUnitCore classe:
public class JUnitCore extends java.lang.Object
Aqui veremos como executar os testes com a ajuda do JUnitCore.
Criar uma aula
Crie uma classe java a ser testada, digamos, MessageUtil.java, em C: \> JUNIT_WORKSPACE.
/*
* This class prints the given message on console.
*/
public class MessageUtil {
private String message;
//Constructor
//@param message to be printed
public MessageUtil(String message){
this.message = message;
}
// prints the message
public String printMessage(){
System.out.println(message);
return message;
}
}
Criar classe de caso de teste
Crie uma classe de teste java, digamos, TestJunit.java.
Adicione um método de teste testPrintMessage () à sua classe de teste.
Adicione um Annotaion @Test ao método testPrintMessage ().
Implemente a condição de teste e verifique a condição usando a API assertEquals do JUnit.
Crie um arquivo de classe java chamado TestJunit.java em C: \> JUNIT_WORKSPACE.
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class TestJunit {
String message = "Hello World";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testPrintMessage() {
assertEquals(message,messageUtil.printMessage());
}
}
Criar classe de executor de teste
Agora crie um arquivo de classe java chamado TestRunner.javaem C: \> JUNIT_WORKSPACE para executar caso (s) de teste. Ele importa a classe JUnitCore e usa o método runClasses () que usa o nome da classe de teste como seu parâmetro.
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(TestJunit.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
Compile o caso de teste e as classes Test Runner usando javac.
C:\JUNIT_WORKSPACE>javac MessageUtil.java TestJunit.java TestRunner.java
Agora execute o Test Runner, que executará o caso de teste definido na classe Test Case fornecida.
C:\JUNIT_WORKSPACE>java TestRunner
Verifique a saída.
Hello World
true
Test suiteé usado para agrupar alguns casos de teste de unidade e executá-los juntos. No JUnit, ambos@RunWith e @Suiteas anotações são usadas para executar os testes do conjunto. Este capítulo dá um exemplo com duas classes de teste,TestJunit1 E TestJunit2, que são executados juntos usando o Test Suite.
Criar uma aula
Crie uma classe java a ser testada, digamos, MessageUtil.java em C: \> JUNIT_WORKSPACE.
/*
* This class prints the given message on console.
*/
public class MessageUtil {
private String message;
//Constructor
//@param message to be printed
public MessageUtil(String message){
this.message = message;
}
// prints the message
public String printMessage(){
System.out.println(message);
return message;
}
// add "Hi!" to the message
public String salutationMessage(){
message = "Hi!" + message;
System.out.println(message);
return message;
}
}
Criar classes de caso de teste
Crie um arquivo de classe java chamado TestJunit1.java em C: \> JUNIT_WORKSPACE.
import org.junit.Test;
import org.junit.Ignore;
import static org.junit.Assert.assertEquals;
public class TestJunit1 {
String message = "Robert";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
assertEquals(message, messageUtil.printMessage());
}
}
Crie um arquivo de classe java chamado TestJunit2.java em C: \> JUNIT_WORKSPACE.
import org.junit.Test;
import org.junit.Ignore;
import static org.junit.Assert.assertEquals;
public class TestJunit2 {
String message = "Robert";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "Hi!" + "Robert";
assertEquals(message,messageUtil.salutationMessage());
}
}
Criar classe de suíte de teste
- Crie uma classe java.
- Anexe a anotação @RunWith (Suite.class) com a classe.
- Adicione referência às classes de teste JUnit usando a anotação @ Suite.SuiteClasses.
Crie um arquivo de classe java chamado TestSuite.java em C: \> JUNIT_WORKSPACE para executar caso (s) de teste.
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses({
TestJunit1.class,
TestJunit2.class
})
public class JunitTestSuite {
}
Criar classe de executor de teste
Crie um arquivo de classe java chamado TestRunner.java em C: \> JUNIT_WORKSPACE para executar caso (s) de teste.
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(JunitTestSuite.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
Compile todas as classes java usando javac.
C:\JUNIT_WORKSPACE>javac MessageUtil.java TestJunit1.java
TestJunit2.java JunitTestSuite.java TestRunner.java
Agora execute o Test Runner, que executará o caso de teste definido na classe Test Case fornecida.
C:\JUNIT_WORKSPACE>java TestRunner
Verifique a saída.
Inside testPrintMessage()
Robert
Inside testSalutationMessage()
Hi Robert
true
Às vezes acontece que nosso código não está completamente pronto durante a execução de um caso de teste. Como resultado, o caso de teste falha. o@Ignore a anotação ajuda neste cenário.
Um método de teste anotado com @Ignore não será executado.
Se uma classe de teste for anotada com @Ignore, nenhum de seus métodos de teste será executado.
Agora vamos ver @Ignore em ação.
Criar uma aula
Crie uma classe java a ser testada, digamos, MessageUtil.java em C: \> JUNIT_WORKSPACE.
/*
* This class prints the given message on console.
*/
public class MessageUtil {
private String message;
//Constructor
//@param message to be printed
public MessageUtil(String message){
this.message = message;
}
// prints the message
public String printMessage(){
System.out.println(message);
return message;
}
// add "Hi!" to the message
public String salutationMessage(){
message = "Hi!" + message;
System.out.println(message);
return message;
}
}
Criar classe de caso de teste
Crie uma classe de teste java, digamos, TestJunit.java.
Adicione um método de teste testPrintMessage () ou testSalutationMessage () à sua classe de teste.
Adicione um Annotaion @Ignore ao método testPrintMessage ().
Crie um arquivo de classe java chamado TestJunit.java em C: \ JUNIT_WORKSPACE.
import org.junit.Test;
import org.junit.Ignore;
import static org.junit.Assert.assertEquals;
public class TestJunit {
String message = "Robert";
MessageUtil messageUtil = new MessageUtil(message);
@Ignore
@Test
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
message = "Robert";
assertEquals(message,messageUtil.printMessage());
}
@Test
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "Hi!" + "Robert";
assertEquals(message,messageUtil.salutationMessage());
}
}
Criar classe de executor de teste
Crie um arquivo de classe java chamado TestRunner.java em C: \> JUNIT_WORKSPACE para executar caso (s) de teste.
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(TestJunit.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
Compile as classes MessageUtil, Test case e Test Runner usando javac.
C:\JUNIT_WORKSPACE>javac MessageUtil.java TestJunit.java TestRunner.java
Agora execute o Test Runner, que não executará o caso de teste testPrintMessage () definido na classe Test Case fornecida.
C:\JUNIT_WORKSPACE>java TestRunner
Verifique a saída. O caso de teste testPrintMessage () não foi testado.
Inside testSalutationMessage()
Hi!Robert
true
Agora, atualize TestJunit em C: \> JUNIT_WORKSPACE para ignorar todos os casos de teste. Adicione @Ignore no nível da classe.
import org.junit.Test;
import org.junit.Ignore;
import static org.junit.Assert.assertEquals;
@Ignore
public class TestJunit {
String message = "Robert";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
message = "Robert";
assertEquals(message,messageUtil.printMessage());
}
@Test
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "Hi!" + "Robert";
assertEquals(message,messageUtil.salutationMessage());
}
}
Compile o caso de teste usando javac.
C:\JUNIT_WORKSPACE>javac TestJunit.java
Mantenha o seu Test Runner inalterado da seguinte maneira -
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(TestJunit.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
Agora execute o Test Runner, que não executará nenhum caso de teste definido na classe Test Case fornecida.
C:\JUNIT_WORKSPACE>java TestRunner
Verifique a saída. Nenhum caso de teste é testado.
true
JUnit fornece uma opção útil de Timeout. Se um caso de teste levar mais tempo do que o número especificado de milissegundos, o JUnit o marcará automaticamente como falha. otimeoutparâmetro é usado junto com a anotação @Test. Vamos ver o @Test (tempo limite) em ação.
Criar uma aula
Crie uma classe java a ser testada, digamos, MessageUtil.java em C: \> JUNIT_WORKSPACE.
Adicione um loop while infinito dentro do método printMessage ().
/*
* This class prints the given message on console.
*/
public class MessageUtil {
private String message;
//Constructor
//@param message to be printed
public MessageUtil(String message){
this.message = message;
}
// prints the message
public void printMessage(){
System.out.println(message);
while(true);
}
// add "Hi!" to the message
public String salutationMessage(){
message = "Hi!" + message;
System.out.println(message);
return message;
}
}
Criar classe de caso de teste
Crie uma classe de teste java, digamos, TestJunit.java. Adicione um tempo limite de 1000 ao caso de teste testPrintMessage ().
Crie um arquivo de classe java chamado TestJunit.java em C: \> JUNIT_WORKSPACE.
import org.junit.Test;
import org.junit.Ignore;
import static org.junit.Assert.assertEquals;
public class TestJunit {
String message = "Robert";
MessageUtil messageUtil = new MessageUtil(message);
@Test(timeout = 1000)
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
messageUtil.printMessage();
}
@Test
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "Hi!" + "Robert";
assertEquals(message,messageUtil.salutationMessage());
}
}
Criar classe de executor de teste
Crie um arquivo de classe java chamado TestRunner.java em C: \> JUNIT_WORKSPACE para executar caso (s) de teste.
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(TestJunit.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
Compile as classes MessageUtil, Test case e Test Runner usando javac.
C:\JUNIT_WORKSPACE>javac MessageUtil.java TestJunit.java TestRunner.java
Agora execute o Test Runner, que executará os casos de teste definidos na classe Test Case fornecida.
C:\JUNIT_WORKSPACE>java TestRunner
Verifique a saída. O caso de teste testPrintMessage () marcará o teste de unidade com falha.
Inside testPrintMessage()
Robert
Inside testSalutationMessage()
Hi!Robert
testPrintMessage(TestJunit): test timed out after 1000 milliseconds
false
JUnit fornece uma opção de rastrear a manipulação de exceção do código. Você pode testar se o código lança uma exceção desejada ou não. oexpectedparâmetro é usado junto com a anotação @Test. Vamos ver @Test (esperado) em ação.
Criar uma aula
Crie uma classe java a ser testada, digamos, MessageUtil.java em C: \> JUNIT_WORKSPACE.
Adicione uma condição de erro dentro do método printMessage ().
/*
* This class prints the given message on console.
*/
public class MessageUtil {
private String message;
//Constructor
//@param message to be printed
public MessageUtil(String message){
this.message = message;
}
// prints the message
public void printMessage(){
System.out.println(message);
int a = 0;
int b = 1/a;
}
// add "Hi!" to the message
public String salutationMessage(){
message = "Hi!" + message;
System.out.println(message);
return message;
}
}
Criar classe de caso de teste
Crie uma classe de teste java chamada TestJunit.java. Adicione uma exceção esperada ArithmeticException ao caso de teste testPrintMessage ().
Crie um arquivo de classe java chamado TestJunit.java em C: \> JUNIT_WORKSPACE.
import org.junit.Test;
import org.junit.Ignore;
import static org.junit.Assert.assertEquals;
public class TestJunit {
String message = "Robert";
MessageUtil messageUtil = new MessageUtil(message);
@Test(expected = ArithmeticException.class)
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
messageUtil.printMessage();
}
@Test
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "Hi!" + "Robert";
assertEquals(message,messageUtil.salutationMessage());
}
}
Criar classe de executor de teste
Crie um arquivo de classe java chamado TestRunner.java em C: \> JUNIT_WORKSPACE para executar caso (s) de teste.
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(TestJunit.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
Compile as classes MessageUtil, Test case e Test Runner usando javac.
C:\JUNIT_WORKSPACE>javac MessageUtil.java TestJunit.java TestRunner.java
Agora execute o Test Runner, que executará os casos de teste definidos na classe Test Case fornecida.
C:\JUNIT_WORKSPACE>java TestRunner
Verifique a saída. O caso de teste testPrintMessage () será aprovado.
Inside testPrintMessage()
Robert
Inside testSalutationMessage()
Hi!Robert
true
JUnit 4 introduziu um novo recurso chamado parameterized tests. Os testes parametrizados permitem que um desenvolvedor execute o mesmo teste repetidamente usando valores diferentes. Existem cinco etapas que você precisa seguir para criar um teste parametrizado.
Anote a classe de teste com @RunWith (Parameterized.class).
Crie um método estático público anotado com @Parameters que retorna uma coleção de objetos (como matriz) como conjunto de dados de teste.
Crie um construtor público que obtenha o que é equivalente a uma "linha" de dados de teste.
Crie uma variável de instância para cada "coluna" de dados de teste.
Crie seu (s) caso (s) de teste usando as variáveis de instância como a fonte dos dados de teste.
O caso de teste será chamado uma vez para cada linha de dados. Vamos ver os testes parametrizados em ação.
Criar uma aula
Crie uma classe java a ser testada, digamos, PrimeNumberChecker.java em C: \> JUNIT_WORKSPACE.
public class PrimeNumberChecker {
public Boolean validate(final Integer primeNumber) {
for (int i = 2; i < (primeNumber / 2); i++) {
if (primeNumber % i == 0) {
return false;
}
}
return true;
}
}
Criar classe de caso de teste parametrizado
Crie uma classe de teste java, digamos, PrimeNumberCheckerTest.java. Crie um arquivo de classe java chamadoPrimeNumberCheckerTest.java em C: \> JUNIT_WORKSPACE.
import java.util.Arrays;
import java.util.Collection;
import org.junit.Test;
import org.junit.Before;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import org.junit.runner.RunWith;
import static org.junit.Assert.assertEquals;
@RunWith(Parameterized.class)
public class PrimeNumberCheckerTest {
private Integer inputNumber;
private Boolean expectedResult;
private PrimeNumberChecker primeNumberChecker;
@Before
public void initialize() {
primeNumberChecker = new PrimeNumberChecker();
}
// Each parameter should be placed as an argument here
// Every time runner triggers, it will pass the arguments
// from parameters we defined in primeNumbers() method
public PrimeNumberCheckerTest(Integer inputNumber, Boolean expectedResult) {
this.inputNumber = inputNumber;
this.expectedResult = expectedResult;
}
@Parameterized.Parameters
public static Collection primeNumbers() {
return Arrays.asList(new Object[][] {
{ 2, true },
{ 6, false },
{ 19, true },
{ 22, false },
{ 23, true }
});
}
// This test will run 4 times since we have 5 parameters defined
@Test
public void testPrimeNumberChecker() {
System.out.println("Parameterized Number is : " + inputNumber);
assertEquals(expectedResult,
primeNumberChecker.validate(inputNumber));
}
}
Criar classe de executor de teste
Crie um arquivo de classe java chamado TestRunner.java em C: \> JUNIT_WORKSPACE para executar caso (s) de teste.
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(PrimeNumberCheckerTest.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
Compile as classes PrimeNumberChecker, PrimeNumberCheckerTest e Test Runner usando javac.
C:\JUNIT_WORKSPACE>javac PrimeNumberChecker.java PrimeNumberCheckerTest.java
TestRunner.java
Agora execute o Test Runner, que executará os casos de teste definidos na classe Test Case fornecida.
C:\JUNIT_WORKSPACE>java TestRunner
Verifique a saída.
Parameterized Number is : 2
Parameterized Number is : 6
Parameterized Number is : 19
Parameterized Number is : 22
Parameterized Number is : 23
true
Teremos um exemplo para demonstrar como executar JUnit usando ANT. Siga as etapas fornecidas abaixo.
Etapa 1: Baixe o Apache Ant
Baixe o Apache Ant com base no sistema operacional em que está trabalhando.
SO | Nome do Arquivo |
---|---|
janelas | apache-ant-1.8.4-bin.zip |
Linux | apache-ant-1.8.4-bin.tar.gz |
Mac | apache-ant-1.8.4-bin.tar.gz |
Etapa 2: definir o ambiente do Ant
Colocou o ANT_HOMEvariável de ambiente para apontar para o local do diretório base, onde as bibliotecas ANT são armazenadas em sua máquina. Suponhamos que as bibliotecas Ant estejam armazenadas na pasta apache-ant-1.8.4.
Sr. Não. | SO e descrição |
---|---|
1 | Windows Defina a variável de ambiente ANT_HOME para C: \ Arquivos de programas \ Apache Software Foundation \ apache-ant-1.8.4 |
2 | Linux export ANT_HOME = /usr/local/apache-ant-1.8.4 |
3 | Mac export ANT_HOME = /Library/apache-ant-1.8.4 |
Anexe a localização do compilador Ant ao caminho do sistema da seguinte maneira -
SO | Resultado |
---|---|
janelas | Anexar a string %ANT_HOME\bin no final da variável do sistema, Path. |
Linux | exportar PATH = $PATH:$ANT_HOME / bin / |
Mac | não requerido |
Etapa 3: Baixe o arquivo JUnit
Baixe um arquivo JUnit adequado ao seu sistema operacional.
SO | Nome do Arquivo |
---|---|
janelas | junit4.10.jar |
Linux | junit4.10.jar |
Mac | junit4.10.jar |
Etapa 4: Criar Estrutura do Projeto
Crie uma pasta TestJunitWithAnt em C: \> JUNIT_WORKSPACE.
Crie uma pasta src em C: \> JUNIT_WORKSPACE> TestJunitWithAnt.
Crie uma pasta test em C: \> JUNIT_WORKSPACE> TestJunitWithAnt.
Crie uma pasta lib em C: \> JUNIT_WORKSPACE> TestJunitWithAnt.
Crio MessageUtil classe em C: \> JUNIT_WORKSPACE> TestJunitWithAnt> srcfolder.
/*
* This class prints the given message on console.
*/
public class MessageUtil {
private String message;
//Constructor
//@param message to be printed
public MessageUtil(String message){
this.message = message;
}
// prints the message
public String printMessage(){
System.out.println(message);
return message;
}
// add "Hi!" to the message
public String salutationMessage(){
message = "Hi!" + message;
System.out.println(message);
return message;
}
}
Crio TestMessageUtil classe na pasta C: \> JUNIT_WORKSPACE> TestJunitWithAnt> src.
import org.junit.Test;
import org.junit.Ignore;
import static org.junit.Assert.assertEquals;
public class TestMessageUtil {
String message = "Robert";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
assertEquals(message,messageUtil.printMessage());
}
@Test
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "Hi!" + "Robert";
assertEquals(message,messageUtil.salutationMessage());
}
}
Copie junit-4.10.jar para a pasta C: \> JUNIT_WORKSPACE> TestJunitWithAnt> lib.
Criar ANT Build.xml
Estaremos usando <junit> tarefa no Ant para executar nossos casos de teste JUnit.
<project name = "JunitTest" default = "test" basedir = ".">
<property name = "testdir" location = "test" />
<property name = "srcdir" location = "src" />
<property name = "full-compile" value = "true" />
<path id = "classpath.base"/>
<path id = "classpath.test">
<pathelement location = "lib/junit-4.10.jar" />
<pathelement location = "${testdir}" /> <pathelement location = "${srcdir}" />
<path refid = "classpath.base" />
</path>
<target name = "clean" >
<delete verbose = "${full-compile}"> <fileset dir = "${testdir}" includes = "**/*.class" />
</delete>
</target>
<target name = "compile" depends = "clean">
<javac srcdir = "${srcdir}" destdir = "${testdir}"
verbose = "${full-compile}">
<classpath refid = "classpath.test"/>
</javac>
</target>
<target name = "test" depends = "compile">
<junit>
<classpath refid = "classpath.test" />
<formatter type = "brief" usefile = "false" />
<test name = "TestMessageUtil" />
</junit>
</target>
</project>
Execute o seguinte comando Ant.
C:\JUNIT_WORKSPACE\TestJunitWithAnt>ant
Verifique a saída.
Buildfile: C:\JUNIT_WORKSPACE\TestJunitWithAnt\build.xml
clean:
compile:
[javac] Compiling 2 source files to C:\JUNIT_WORKSPACE\TestJunitWithAnt\test
[javac] [parsing started C:\JUNIT_WORKSPACE\TestJunitWithAnt\src\
MessageUtil.java]
[javac] [parsing completed 18ms]
[javac] [parsing started C:\JUNIT_WORKSPACE\TestJunitWithAnt\src\
TestMessageUtil.java]
[javac] [parsing completed 2ms]
[javac] [search path for source files: C:\JUNIT_WORKSPACE\
TestJunitWithAnt\src]
[javac] [loading java\lang\Object.class(java\lang:Object.class)]
[javac] [loading java\lang\String.class(java\lang:String.class)]
[javac] [loading org\junit\Test.class(org\junit:Test.class)]
[javac] [loading org\junit\Ignore.class(org\junit:Ignore.class)]
[javac] [loading org\junit\Assert.class(org\junit:Assert.class)]
[javac] [loading java\lang\annotation\Retention.class
(java\lang\annotation:Retention.class)]
[javac] [loading java\lang\annotation\RetentionPolicy.class
(java\lang\annotation:RetentionPolicy.class)]
[javac] [loading java\lang\annotation\Target.class
(java\lang\annotation:Target.class)]
[javac] [loading java\lang\annotation\ElementType.class
(java\lang\annotation:ElementType.class)]
[javac] [loading java\lang\annotation\Annotation.class
(java\lang\annotation:Annotation.class)]
[javac] [checking MessageUtil]
[javac] [loading java\lang\System.class(java\lang:System.class)]
[javac] [loading java\io\PrintStream.class(java\io:PrintStream.class)]
[javac] [loading java\io\FilterOutputStream.class
(java\io:FilterOutputStream.class)]
[javac] [loading java\io\OutputStream.class(java\io:OutputStream.class)]
[javac] [loading java\lang\StringBuilder.class
(java\lang:StringBuilder.class)]
[javac] [loading java\lang\AbstractStringBuilder.class
(java\lang:AbstractStringBuilder.class)]
[javac] [loading java\lang\CharSequence.class(java\lang:CharSequence.class)]
[javac] [loading java\io\Serializable.class(java\io:Serializable.class)]
[javac] [loading java\lang\Comparable.class(java\lang:Comparable.class)]
[javac] [loading java\lang\StringBuffer.class(java\lang:StringBuffer.class)]
[javac] [wrote C:\JUNIT_WORKSPACE\TestJunitWithAnt\test\MessageUtil.class]
[javac] [checking TestMessageUtil]
[javac] [wrote C:\JUNIT_WORKSPACE\TestJunitWithAnt\test\TestMessageUtil.class]
[javac] [total 281ms]
test:
[junit] Testsuite: TestMessageUtil
[junit] Tests run: 2, Failures: 0, Errors: 0, Time elapsed: 0.008 sec
[junit]
[junit] ------------- Standard Output ---------------
[junit] Inside testPrintMessage()
[junit] Robert
[junit] Inside testSalutationMessage()
[junit] Hi!Robert
[junit] ------------- ---------------- ---------------
BUILD SUCCESSFUL
Total time: 0 seconds
Para configurar o JUnit com o eclipse, siga as etapas fornecidas abaixo.
Etapa 1: Baixe o arquivo JUnit
Baixe um jar JUnit com base no sistema operacional que você tem em seu sistema.
SO | Nome do Arquivo |
---|---|
janelas | junit4.10.jar |
Linux | junit4.10.jar |
Mac | junit4.10.jar |
Suponha que você tenha copiado o arquivo JAR acima para a pasta C: \> JUnit.
Etapa 2: definir o ambiente Eclipse
Abra eclipse → clique com o botão direito no projeto e clique em propriedade> Build Path> Configure Build Path e adicione junit-4.10.jar nas bibliotecas usando o botão Add External Jar.
Presumimos que seu Eclipse tenha um plugin JUnit embutido. Se não estiver disponível no diretório C: \> eclipse \ plugins, você pode baixá-lo emJUnit Plugin. Descompacte o arquivo zip baixado na pasta de plug-ins do Eclipse. Finalmente reinicie o Eclipse.
Agora seu Eclipse está pronto para o desenvolvimento de casos de teste JUnit.
Etapa 3: verificar a instalação do JUnit no Eclipse
Crie um projeto TestJunitno Eclipse em qualquer local. Em seguida, crie uma classeMessageUtil para testar no projeto.
/*
* This class prints the given message on console.
*/
public class MessageUtil {
private String message;
//Constructor
//@param message to be printed
public MessageUtil(String message){
this.message = message;
}
// prints the message
public String printMessage(){
System.out.println(message);
return message;
}
}
Crie uma classe de teste TestJunit no projeto.
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class TestJunit {
String message = "Hello World";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testPrintMessage() {
assertEquals(message,messageUtil.printMessage());
}
}
A seguir deve estar a estrutura do projeto -
Finalmente, clique com o botão direito no programa e execute como JUnit para verificar a saída do programa.
Verifique o resultado.
A seguir estão as extensões JUnit -
- Cactus
- JWebUnit
- XMLUnit
- MockObject
Cacto
Cactus é uma estrutura de teste simples para teste de unidade de código java do lado do servidor (Servlets, EJBs, Tag Libs, Filtros). A intenção do Cactus é reduzir o custo de escrever testes para código do lado do servidor. Ele usa JUnit e o estende. Cactus implementa uma estratégia dentro do contêiner que executa os testes dentro de um contêiner.
O ecossistema de cactos é feito de vários componentes -
Cactus Frameworké o coração do Cactus. É o mecanismo que fornece a API para escrever testes Cactus.
Cactus Integration Modules são front-ends e frameworks que fornecem maneiras fáceis de usar o Cactus Framework (scripts Ant, plug-in Eclipse e plug-in Maven).
O código a seguir demonstra como o Cactus pode ser usado.
import org.apache.cactus.*;
import junit.framework.*;
public class TestSampleServlet extends ServletTestCase {
@Test
public void testServlet() {
// Initialize class to test
SampleServlet servlet = new SampleServlet();
// Set a variable in session as the doSomething()
// method that we are testing
session.setAttribute("name", "value");
// Call the method to test, passing an
// HttpServletRequest object (for example)
String result = servlet.doSomething(request);
// Perform verification that test was successful
assertEquals("something", result);
assertEquals("otherValue", session.getAttribute("otherName"));
}
}
JWebUnit
JWebUnit é uma estrutura de teste baseada em Java para aplicativos da web. Ele envolve as estruturas de teste existentes, como HtmlUnit e Selenium, com uma interface de teste simples e unificada para testar a exatidão de seus aplicativos da web.
JWebUnit fornece uma API Java de alto nível para navegar em um aplicativo da web combinada com um conjunto de asserções para verificar a exatidão do aplicativo. Isso inclui navegação por meio de links, entrada e envio de formulário, validação de conteúdo de tabela e outros recursos típicos de aplicativos da Web de negócios.
Os métodos de navegação simples e asserções prontas para uso permitem a criação de testes mais rápida do que usar apenas JUnit ou HtmlUnit. E se você quiser mudar de HtmlUnit para outros plug-ins como Selenium (disponível em breve), não há necessidade de reescrever seus testes.
Aqui está um código de amostra.
import junit.framework.TestCase;
import net.sourceforge.jwebunit.WebTester;
public class ExampleWebTestCase extends TestCase {
private WebTester tester;
public ExampleWebTestCase(String name) {
super(name);
tester = new WebTester();
}
//set base url
public void setUp() throws Exception {
getTestContext().setBaseUrl("http://myserver:8080/myapp");
}
// test base info
@Test
public void testInfoPage() {
beginAt("/info.html");
}
}
XMLUnit
XMLUnit fornece uma única classe de extensão JUnit, XMLTestCase, e um conjunto de classes de suporte que permitem que asserções sejam feitas sobre -
As diferenças entre duas partes do XML (por meio das classes Diff e DetailedDiff).
A validade de uma parte do XML (via classe Validator).
O resultado da transformação de um pedaço de XML usando XSLT (via classe Transform).
A avaliação de uma expressão XPath em um pedaço de XML (por meio de classes que implementam a interface XpathEngine).
Nós individuais em um fragmento de XML que são expostos pelo DOM Traversal (via classe NodeTest).
Vamos supor que temos duas peças de XML que desejamos comparar e afirmar que são iguais. Poderíamos escrever uma classe de teste simples como esta -
import org.custommonkey.xmlunit.XMLTestCase;
public class MyXMLTestCase extends XMLTestCase {
// this test method compare two pieces of the XML
@Test
public void testForXMLEquality() throws Exception {
String myControlXML = "<msg><uuid>0x00435A8C</uuid></msg>";
String myTestXML = "<msg><localId>2376</localId></msg>";
assertXMLEqual("Comparing test xml to control xml", myControlXML, myTestXML);
}
}
MockObject
Em um teste de unidade, os objetos fictícios podem simular o comportamento de objetos reais complexos (não fictícios) e, portanto, são úteis quando um objeto real é impraticável ou impossível de ser incorporado em um teste de unidade.
O estilo de codificação comum para teste com objetos fictícios é -
- Crie instâncias de objetos fictícios.
- Defina o estado e as expectativas nos objetos fictícios.
- Chame o código de domínio com objetos fictícios como parâmetros.
- Verifique a consistência nos objetos fictícios.
A seguir está um exemplo de MockObject usando Jmock.
import org.jmock.Mockery;
import org.jmock.Expectations;
class PubTest extends TestCase {
Mockery context = new Mockery();
public void testSubReceivesMessage() {
// set up
final Sub sub = context.mock(Sub.class);
Pub pub = new Pub();
pub.add(sub);
final String message = "message";
// expectations
context.checking(new Expectations() {
oneOf (sub).receive(message);
});
// execute
pub.publish(message);
// verify
context.assertIsSatisfied();
}
}