TestNG - Guia rápido
O teste é o processo de verificação da funcionalidade de um aplicativo para garantir que ele funcione de acordo com os requisitos. O teste de unidade surge no nível do desenvolvedor, onde medidas adequadas são tomadas para testar cada entidade (classe ou método) para garantir que o produto final atenda aos requisitos.
O JUnit levou os desenvolvedores a entender a utilidade dos testes, especialmente dos testes de unidade, quando comparados a qualquer outra estrutura de teste. Aproveitando uma arquitetura bastante simples, pragmática e rígida, JUnit foi capaz de "infectar" um grande número de desenvolvedores. Dê uma olhada em nosso tutorial sobre JUnit para ter uma boa compreensão de seus recursos. JUnit, ao mesmo tempo, também tem algumas deficiências, que estão listadas abaixo -
Inicialmente projetado para permitir apenas testes de unidade, agora usado para todos os tipos de teste.
Não é possível fazer testes de dependência.
Controle de configuração deficiente (setUp / tearDown).
Intrusivo (força você a estender classes e nomear seus métodos de uma determinada maneira).
Modelo de programação estática (força você a recompilar desnecessariamente).
O gerenciamento de diferentes suítes de testes em projetos complexos pode ser muito complicado.
O que é TestNG?
A definição de TestNG de acordo com sua documentação é a seguinte -
TestNG é um framework de teste inspirado em JUnit e NUnit, mas introduz algumas novas funcionalidades que o tornam mais poderoso e fácil de usar.
TestNG é uma estrutura de teste automatizado de código aberto; OndeNG significa NextGeneração. TestNG é semelhante ao JUnit (especialmente JUnit 4), mas não é uma extensão JUnit. É inspirado em JUnit. Ele foi projetado para ser melhor do que o JUnit, especialmente ao testar classes integradas. O criador do TestNG é Cedric Beust .
Eliminando a maioria das limitações da estrutura mais antiga, o TestNG dá ao desenvolvedor a capacidade de escrever testes mais flexíveis e poderosos. Como ele usa fortemente as anotações Java (introduzidas no JDK 5.0) para definir testes, também pode mostrar como usar esse novo recurso da linguagem Java em um ambiente de produção real.
Recursos do TestNG
Suporta anotações.
TestNG usa mais recursos Java e OO.
Oferece suporte ao teste de classes integradas (por exemplo, por padrão, não há necessidade de criar uma nova instância de classe de teste para cada método de teste).
Separa o código de teste em tempo de compilação das informações de configuração / dados em tempo de execução.
Configuração de tempo de execução flexível.
Apresenta 'grupos de teste'. Depois de compilar seus testes, você pode simplesmente pedir ao TestNG para executar todos os testes de "front-end" ou testes "rápidos", "lentos", "banco de dados", etc.
Oferece suporte a métodos de teste dependentes, teste paralelo, teste de carga e falha parcial.
API de plug-in flexível.
Suporte para testes multithread.
TestNG é uma estrutura para Java, então 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
Abra o console e execute um comando java com base no sistema operacional que você instalou em seu sistema.
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.7.0_25" Java (TM) SE Runtime Environment (build 1.7.0_25-b15) Servidor VM Java HotSpot (TM) de 64 bits (versão 23.25-b01, modo misto) |
Linux | versão java "1.7.0_25" Java (TM) SE Runtime Environment (build 1.7.0_25-b15) Servidor VM Java HotSpot (TM) de 64 bits (versão 23.25-b01, modo misto) |
Mac | versão java "1.7.0_25" Java (TM) SE Runtime Environment (build 1.7.0_25-b15) Servidor VM Java HotSpot (TM) de 64 bits (versão 23.25-b01, modo misto) |
Se você não tiver Java, instale o Java Software Development Kit (SDK) a partir de https://www.oracle.com/technetwork/java/javase/downloads/index.html. Estamos assumindo o Java 1.7.0_25 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: \ Arquivos de programas \ Java \ jdk1.7.0_25. |
Linux | Exportar JAVA_HOME = / usr / local / java-current. |
Mac | Exportar JAVA_HOME = / Library / Java / Home. |
Anexe a localização do compilador Java ao caminho do sistema.
SO | Resultado |
---|---|
janelas | Anexe a string C: \ Arquivos de programas \ Java \ jdk1.7.0_25 \ bin no final da variável do sistema, Caminho. |
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 TestNG
Baixe a versão mais recente do arquivo jar TestNG em http://www.testng.org. No momento de escrever este tutorial, baixamos testng-6.8.jar e o copiamos para a pasta C: \> TestNG.
SO | Nome do arquivo |
---|---|
janelas | testng-6.8.jar |
Linux | testng-6.8.jar |
Mac | testng-6.8.jar |
Etapa 4: definir o ambiente TestNG
Colocou o TESTNG_HOMEvariável de ambiente para apontar para o local do diretório base, onde o jar TestNG está armazenado em sua máquina. A tabela a seguir mostra como definir a variável de ambiente no Windows, Linux e Mac, supondo que armazenamos testng-6.8.jar no local C: \> TestNG.
SO | Descrição |
---|---|
janelas | Defina a variável de ambiente TESTNG_HOME para C: \ TESTNG. |
Linux | Exportar TESTNG_HOME = / usr / local / TESTNG |
Mac | Exportar TESTNG_HOME = / Library / TESTNG |
Etapa 5: definir a variável CLASSPATH
Colocou o CLASSPATH variável de ambiente para apontar para o local do jar TestNG.
SO | Descrição |
---|---|
janelas | Defina a variável de ambiente CLASSPATH como% CLASSPATH%;% TESTNG_HOME% \ testng-6.8.jar. |
Linux | Exportar CLASSPATH =$CLASSPATH:$TESTNG_HOME / testng-6.8.jar. |
Mac | Exportar CLASSPATH =$CLASSPATH:$TESTNG_HOME / testng-6.8.jar. |
Etapa 6: teste a configuração do TestNG
Crie um arquivo de classe java chamado TestNGSimpleTest em C:\>TestNG_WORKSPACE.
import org.testng.annotations.Test;
import static org.testng.Assert.assertEquals;
public class TestNGSimpleTest {
@Test
public void testAdd() {
String str = "TestNG is working fine";
AssertEquals("TestNG is working fine", str);
}
}
TestNG pode ser chamado de várias maneiras diferentes -
- Com um arquivo testng.xml.
- Com ANT.
- Na linha de comando.
Vamos invocar usando o arquivo testng.xml. Crie um arquivo xml com o nome testng.xml emC:\>TestNG_WORKSPACE para executar caso (s) de teste.
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<classes>
<class name = "TestNGSimpleTest"/>
</classes>
</test>
</suite>
Etapa 7: verificar o resultado
Compile a classe usando javac compilador da seguinte forma -
C:\TestNG_WORKSPACE>javac TestNGSimpleTest.java
Agora, invoque o testng.xml para ver o resultado -
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
Verifique a saída.
===============================================
Suite1
Total tests run: 1, Failures: 0, Skips: 0
===============================================
Escrever um teste em TestNG envolve basicamente as seguintes etapas -
Escreva a lógica de negócios de seu teste e insira anotações TestNG em seu código.
Adicione as informações sobre o seu teste (por exemplo, o nome da classe, os grupos que deseja executar, etc.) em um arquivo testng.xml ou em build.xml.
Execute TestNG.
Aqui, veremos um exemplo completo de teste TestNG usando a classe POJO, classe de lógica de negócios e um xml de teste, que será executado pelo TestNG.
Crio EmployeeDetails.java dentro C:\>TestNG_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.
Criar um EmpBusinessLogic.java dentro C:\>TestNG_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 do empregado.
- o valor de avaliação do empregado.
Agora, vamos criar uma classe TestNG chamada TestEmployeeDetails.javaem C: \> TestNG_WORKSPACE. Uma classe TestNG é uma classe Java que contém pelo menos uma anotação TestNG. Esta classe contém casos de teste a serem testados. Um teste TestNG pode ser configurado pelas anotações @BeforeXXX e @AfterXXX (veremos isso no capítulo TestNG - Procedimento de Execução ), o que permite realizar alguma lógica Java antes e depois de um determinado ponto.
import org.testng.Assert;
import org.testng.annotations.Test;
public class TestEmployeeDetails {
EmpBusinessLogic empBusinessLogic = new EmpBusinessLogic();
EmployeeDetails employee = new EmployeeDetails();
@Test
public void testCalculateAppriasal() {
employee.setName("Rajeev");
employee.setAge(25);
employee.setMonthlySalary(8000);
double appraisal = empBusinessLogic.calculateAppraisal(employee);
Assert.assertEquals(500, appraisal, 0.0, "500");
}
// Test to check yearly salary
@Test
public void testCalculateYearlySalary() {
employee.setName("Rajeev");
employee.setAge(25);
employee.setMonthlySalary(8000);
double salary = empBusinessLogic.calculateYearlySalary(employee);
Assert.assertEquals(96000, salary, 0.0, "8000");
}
}
TestEmployeeDetails classe é usada para testar os métodos de EmpBusinessLogicclasse. Ele faz o seguinte -
Testa o salário anual do funcionário.
Testa o valor da avaliação do funcionário.
Antes de poder executar os testes, você deve configurar TestNG usando um arquivo XML especial, convencionalmente denominado testng.xml. A sintaxe para este arquivo é muito simples e seu conteúdo é mostrado abaixo. Crie este arquivo emC:\>TestNG_WORKSPACE.
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<classes>
<class name = "TestEmployeeDetails"/>
</classes>
</test>
</suite>
Os detalhes do arquivo acima são os seguintes -
Um conjunto é representado por um arquivo XML. Ele pode conter um ou mais testes e é definido pela tag <suite>.
A tag <test> representa um teste e pode conter uma ou mais classes TestNG.
A tag <class> representa uma classe TestNG. É uma classe Java que contém pelo menos uma anotação TestNG. Ele pode conter um ou mais métodos de teste.
Compile as classes de caso de teste usando javac.
C:\TestNG_WORKSPACE>javac EmployeeDetails.java EmpBusinessLogic.java TestEmployeeDetails.java
Agora, TestNG com o seguinte comando -
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
Se tudo tiver sido feito corretamente, você deverá ver os resultados dos seus testes no console. Além disso, TestNG cria um relatório HTML muito bom em uma pasta chamadatest-outputque é criado automaticamente no diretório atual. Se você abri-lo e carregar index.html, verá uma página semelhante à da imagem abaixo -
A maneira tradicional de indicar métodos de teste no JUnit 3 é prefixando seus nomes com test. Este é um método muito eficaz para marcar certos métodos em uma classe como tendo um significado especial, mas a nomenclatura não escala muito bem (e se quisermos adicionar mais tags para diferentes estruturas?) E é bastante inflexível (e se nós deseja passar parâmetros adicionais para a estrutura de teste?).
As anotações foram adicionadas formalmente à linguagem Java no JDK 5, e TestNG optou por usar anotações para anotar as classes de teste.
Aqui está a lista de anotações que TestNG suporta -
Sr. Não. | Anotação e descrição |
---|---|
1 | @BeforeSuite O método anotado será executado apenas uma vez antes de todos os testes neste conjunto serem executados. |
2 | @AfterSuite O método anotado será executado apenas uma vez após a execução de todos os testes neste conjunto. |
3 | @BeforeClass O método anotado será executado apenas uma vez antes que o primeiro método de teste na classe atual seja chamado. |
4 | @AfterClass O método anotado será executado apenas uma vez depois que todos os métodos de teste na classe atual forem executados. |
5 | @BeforeTest O método anotado será executado antes que qualquer método de teste pertencente às classes dentro da tag <test> seja executado. |
6 | @AfterTest O método anotado será executado depois que todos os métodos de teste pertencentes às classes dentro da tag <test> forem executados. |
7 | @BeforeGroups A lista de grupos que este método de configuração executará antes. É garantido que esse método seja executado logo antes que o primeiro método de teste pertencente a qualquer um desses grupos seja chamado. |
8 | @AfterGroups A lista de grupos após os quais este método de configuração será executado. A execução desse método é garantida logo após o último método de teste pertencente a qualquer um desses grupos ser chamado. |
9 | @BeforeMethod O método anotado será executado antes de cada método de teste. |
10 | @AfterMethod O método anotado será executado após cada método de teste. |
11 | @DataProvider Marca um método como fornecedor de dados para um método de teste. O método anotado deve retornar um Object [] [], onde cada Object [] pode ser atribuído à lista de parâmetros do método de teste. O método @Test que deseja receber dados deste DataProvider precisa usar um nome dataProvider igual ao nome desta anotação. |
12 | @Factory
Marca um método como uma fábrica que retorna objetos que serão usados pelo TestNG como classes de teste. O método deve retornar Object []. |
13 | @Listeners Define ouvintes em uma classe de teste. |
14 | @Parameters Descreve como passar parâmetros para um método @Test. |
15 | @Test Marca uma classe ou método como parte do teste. |
Benefícios do uso de anotações
A seguir estão alguns dos benefícios do uso de anotações -
TestNG identifica os métodos em que está interessado, procurando anotações. Portanto, os nomes dos métodos não estão restritos a nenhum padrão ou formato.
Podemos passar parâmetros adicionais para anotações.
As anotações são fortemente tipadas, então o compilador irá sinalizar quaisquer erros imediatamente.
As classes de teste não precisam mais estender nada (como TestCase, para JUnit 3).
Este capítulo explica o procedimento de execução de métodos em TestNG. Ele explica a ordem dos métodos chamados. Aqui está o procedimento de execução dos métodos da API de teste TestNG com um exemplo.
Crie um nome de arquivo de classe java TestngAnnotation.java dentro C:\>TestNG_WORKSPACE para testar anotações.
import org.testng.annotations.Test;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.AfterSuite;
public class TestngAnnotation {
// 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");
}
@BeforeMethod
public void beforeMethod() {
System.out.println("in beforeMethod");
}
@AfterMethod
public void afterMethod() {
System.out.println("in afterMethod");
}
@BeforeClass
public void beforeClass() {
System.out.println("in beforeClass");
}
@AfterClass
public void afterClass() {
System.out.println("in afterClass");
}
@BeforeTest
public void beforeTest() {
System.out.println("in beforeTest");
}
@AfterTest
public void afterTest() {
System.out.println("in afterTest");
}
@BeforeSuite
public void beforeSuite() {
System.out.println("in beforeSuite");
}
@AfterSuite
public void afterSuite() {
System.out.println("in afterSuite");
}
}
A seguir, vamos criar o arquivo testng.xml dentro C:\>TestNG_WORKSPACE para executar anotações.
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<classes>
<class name = "TestngAnnotation"/>
</classes>
</test>
</suite>
Compile a classe de caso de teste usando javac.
C:\TestNG_WORKSPACE>javac TestngAnnotation.java
Agora, execute o testng.xml, que executará o caso de teste definido na classe de caso de teste fornecida.
C:\TestNG_WORKSPACE>java org.testng.TestNG testng.xml
Verifique a saída.
in beforeSuite
in beforeTest
in beforeClass
in beforeMethod
in test case 1
in afterMethod
in beforeMethod
in test case 2
in afterMethod
in afterClass
in afterTest
in afterSuite
===============================================
Suite
Total tests run: 2, Failures: 0, Skips: 0
===============================================
Com base na saída acima, o procedimento de execução é o seguinte -
Em primeiro lugar, o método beforeSuite () é executado apenas uma vez.
Por último, o método afterSuite () é executado apenas uma vez.
Mesmo os métodos beforeTest (), beforeClass (), afterClass () e afterTest () são executados apenas uma vez.
O método beforeMethod () é executado para cada caso de teste, mas antes de executar o caso de teste.
O método afterMethod () é executado para cada caso de teste, mas após a execução do caso de teste.
Entre beforeMethod () e afterMethod (), cada caso de teste é executado.
Os casos de teste são executados usando TestNGclasse. Esta classe é o principal ponto de entrada para a execução de testes na estrutura TestNG. Os usuários podem criar seu próprio objeto TestNG e invocá-lo de muitas maneiras diferentes, como -
Em um testng.xml existente.
Em um testng.xml sintético, criado inteiramente em Java.
Definindo diretamente as classes de teste.
Você também pode definir quais grupos incluir ou excluir, atribuir parâmetros, etc. Os parâmetros da linha de comando são -
-d outputdir: especifica o diretório de saída.
-testclass class_name: especifica um ou vários nomes de classe.
-testjar jar_name: especifica o jar que contém os testes.
-sourcedir src1; src2:; lista separada de diretórios de origem (usada apenas quando anotações javadoc são usadas).
-target
-groups
-testrunfactory
-listener
Criaremos o objeto TestNG um testng.xml existente em nosso exemplo abaixo.
Criar uma aula
Crie uma classe java a ser testada, digamos, MessageUtil.java dentro C:\>TestNG_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, SampleTest.java.
Adicione um método de teste testPrintMessage () à sua classe de teste.
Adicione uma Annotation @Test ao método testPrintMessage ().
Implemente a condição de teste e verifique a condição usando a API assertEquals do TestNG.
Crie um arquivo de classe java chamado SampleTest.java dentro C:\>TestNG_WORKSPACE.
import org.testng.Assert;
import org.testng.annotations.Test;
public class SampleTest {
String message = "Hello World";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testPrintMessage() {
Assert.assertEquals(message, messageUtil.printMessage());
}
}
Crie testng.xml
A seguir, vamos criar o arquivo testng.xml em C:\>TestNG_WORKSPACE, para executar caso (s) de teste. Este arquivo captura todo o seu teste em XML. Esse arquivo facilita a descrição de todos os seus conjuntos de testes e seus parâmetros em um arquivo, que você pode verificar em seu repositório de código ou enviar por e-mail para colegas de trabalho. Também torna mais fácil extrair subconjuntos de seus testes ou dividir várias configurações de tempo de execução (por exemplo, testngdatabase.xml executaria apenas testes que exercem seu banco de dados).
<?xml version = "1.0" encoding = "UTF-8"?>
<suite name = "Sample test Suite">
<test name = "Sample test">
<classes>
<class name = "SampleTest" />
</classes>
</test>
</suite>
Compile o caso de teste usando javac.
C:\TestNG_WORKSPACE>javac MessageUtil.java SampleTest.java
Agora, execute o testng.xml, que executará o caso de teste definido na tag <test>.
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
Verifique a saída.
Hello World
===============================================
Sample test Suite
Total tests run: 1, Failures: 0, Skips: 0
===============================================
UMA test suiteé uma coleção de casos de teste destinados a testar um comportamento ou um conjunto de comportamentos de um programa de software. No TestNG, não podemos definir um conjunto no teste de código-fonte, mas é representado por um arquivo XML, já que o conjunto é o recurso de execução. Também permite uma configuração flexível dos testes a serem executados. Um conjunto pode conter um ou mais testes e é definido pela tag <suite>.
<suite> é a tag raiz do seu testng.xml. Ele descreve um conjunto de testes, que por sua vez é composto de várias seções de <test>.
A tabela a seguir lista todos os atributos legais que o <suite> aceita.
Sr. Não. | Atributo e descrição |
---|---|
1 | name O nome desta suíte. É ummandatory atributo. |
2 | verbose O nível ou detalhamento desta execução. |
3 | parallel Se TestNG deve executar threads diferentes para executar este conjunto. |
4 | thread-count O número de threads a serem usados, se o modo paralelo estiver ativado (ignorado de outra forma). |
5 | annotations O tipo de anotação que você está usando em seus testes. |
6 | time-out O tempo limite padrão que será usado em todos os métodos de teste encontrados neste teste. |
Neste capítulo, mostraremos um exemplo com duas classes de teste, Test1 e Test2, para serem executadas juntas usando Test Suite.
Criar uma aula
Crie uma classe java a ser testada, digamos, MessageUtil.java dentro 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 Test1.java dentro C:\>TestNG_WORKSPACE.
import org.testng.Assert;
import org.testng.annotations.Test;
public class Test1 {
String message = "Manisha";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
Assert.assertEquals(message, messageUtil.printMessage());
}
}
Crie um arquivo de classe java chamado Test2.java dentro C:\>TestNG_WORKSPACE.
import org.testng.Assert;
import org.testng.annotations.Test;
public class Test2 {
String message = "Manisha";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "Hi!" + "Manisha";
Assert.assertEquals(message,messageUtil.salutationMessage());
}
}
Agora, vamos escrever o testng.xml em C:\>TestNG_WORKSPACE, que conteria a tag <suite> da seguinte maneira -
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "exampletest1">
<classes>
<class name = "Test1" />
</classes>
</test>
<test name = "exampletest2">
<classes>
<class name = "Test2" />
</classes>
</test>
</suite>
Suite1 inclui exampletest1 e exampletest2.
Compile todas as classes java usando javac.
C:\TestNG_WORKSPACE>javac MessageUtil.java Test1.java Test2.java
Agora, execute o testng.xml, que executará o caso de teste definido na classe de caso de teste fornecida.
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
Verifique a saída.
Inside testPrintMessage()
Manisha
Inside testSalutationMessage()
Hi!Manisha
===============================================
Suite1
Total tests run: 2, Failures: 0, Skips: 0
===============================================
Você também pode verificar a pasta de saída de teste . Na pasta Suite1 , você pode ver dois arquivos html criados, exampletest1.html e exampletest2.html, que teriam a seguinte aparência -
Às vezes, acontece que nosso código não está pronto e o caso de teste escrito para testar esse método / código falha. Nesses casos, a anotação@Test(enabled = false) ajuda a desabilitar este caso de teste.
Se um método de teste for anotado com @Test (enabled = false) , o caso de teste que não está pronto para testar é ignorado.
Agora, vamos ver @Test (enabled = false) em ação.
Criar uma aula
Crie uma classe java a ser testada, digamos, MessageUtil.java dentro C:\>TestNG_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, IgnoreTest.java.
Adicione métodos de teste, testPrintMessage () e testSalutationMessage (), à sua classe de teste.
Adicione uma Annotation @Test (enabled = false) ao método testPrintMessage ().
Crie um arquivo de classe java chamado IgnoreTest.java dentro C:\>TestNG_WORKSPACE.
import org.testng.Assert;
import org.testng.annotations.Test;
public class IgnoreTest {
String message = "Manisha";
MessageUtil messageUtil = new MessageUtil(message);
@Test(enabled = false)
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
message = "Manisha";
Assert.assertEquals(message, messageUtil.printMessage());
}
@Test
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "Hi!" + "Manisha";
Assert.assertEquals(message, messageUtil.salutationMessage());
}
}
Crie testng.xml
Crie testng.xml em C:\>TestNG_WORKSPACE para executar caso (s) de teste.
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<classes>
<class name = "IgnoreTest" />
</classes>
</test>
</suite>
Compile o MessageUtil e as classes de caso de teste usando javac.
C:\TestNG_WORKSPACE>javac MessageUtil.java IgnoreTest.java
Agora, execute o testng.xml, que não executará testPrintMessage () o caso de teste definido na classe Test Case fornecida.
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
Verifique a saída. O caso de teste testPrintMessage () não foi testado.
Inside testSalutationMessage()
Hi!Manisha
===============================================
Suite1
Total tests run: 1, Failures: 0, Skips: 0
===============================================
Você também pode ignorar um grupo de testes, que será discutido no próximo capítulo.
O teste de grupo é um novo recurso inovador no TestNG, que não existe no framework JUnit. Ele permite que você distribua métodos em porções adequadas e execute agrupamentos sofisticados de métodos de teste.
Você não apenas pode declarar os métodos que pertencem a grupos, mas também pode especificar grupos que contêm outros grupos. Então, TestNG pode ser chamado e solicitado a incluir um determinado conjunto de grupos (ou expressões regulares), enquanto exclui outro conjunto.
Os testes de grupo fornecem flexibilidade máxima em como você particiona seus testes e não exige que você recompile nada se quiser executar dois conjuntos diferentes de testes consecutivos.
Os grupos são especificados em seu arquivo testng.xml usando a tag <groups>. Ele pode ser encontrado na tag <test> ou <suite>. Grupos especificados na tag <suite> se aplicam a todas as tags <test> abaixo.
Agora, vamos dar um exemplo para ver como funciona o teste de grupo.
Criar uma aula
Crie uma classe java a ser testada, digamos, MessageUtil.java dentro C:\> TestNG_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 "tutorialspoint" to the message
public String salutationMessage() {
message = "tutorialspoint" + message;
System.out.println(message);
return message;
}
// add "www." to the message
public String exitMessage() {
message = "www." + message;
System.out.println(message);
return message;
}
}
Criar classe de caso de teste
Crie uma classe de teste java, digamos, GroupTestExample.java.
Adicione métodos de teste, testPrintMessage () e testSalutationMessage (), à sua classe de teste.
Agrupe o método de teste em duas categorias -
Check-in tests (checkintest)- Esses testes devem ser executados antes de enviar um novo código. Eles normalmente devem ser rápidos e apenas garantir que nenhuma funcionalidade básica seja interrompida.
Functional tests (functest) - Esses testes devem cobrir todas as funcionalidades do seu software e ser executados pelo menos uma vez por dia, embora o ideal seja executá-los continuamente.
Crie o arquivo de classe java chamado GroupTestExample.java dentro C:\>TestNG_WORKSPACE.
import org.testng.Assert;
import org.testng.annotations.Test;
public class GroupTestExample {
String message = ".com";
MessageUtil messageUtil = new MessageUtil(message);
@Test(groups = { "functest", "checkintest" })
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
message = ".com";
Assert.assertEquals(message, messageUtil.printMessage());
}
@Test(groups = { "checkintest" })
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "tutorialspoint" + ".com";
Assert.assertEquals(message, messageUtil.salutationMessage());
}
@Test(groups = { "functest" })
public void testingExitMessage() {
System.out.println("Inside testExitMessage()");
message = "www." + "tutorialspoint"+".com";
Assert.assertEquals(message, messageUtil.exitMessage());
}
}
Crie testng.xml
Crie testng.xml em C:\> TestNG_WORKSPACE, para executar caso (s) de teste. Aqui, estaríamos executando apenas aqueles testes, que pertencem ao grupo functest .
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<groups>
<run>
<include name = "functest" />
</run>
</groups>
<classes>
<class name = "GroupTestExample" />
</classes>
</test>
</suite>
Compile o MessageUtil, classes de caso de teste usando javac.
C:\TestNG_WORKSPACE>javac MessageUtil.java GroupTestExample.java
Agora, execute o testng.xml, que executará apenas o método testPrintMessage (), por pertencer ao grupo functest .
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
Verifique a saída. Apenas o método testPrintMessage () é executado.
Inside testPrintMessage()
.com
Inside testExitMessage()
www..com
===============================================
Suite1
Total tests run: 2, Failures: 1, Skips: 0
===============================================
Grupo de Grupos
Os grupos também podem incluir outros grupos. Esses grupos são chamadosMetaGroups. Por exemplo, você pode querer definir um grupo todo que inclui checkintest e functest . Vamos modificar nosso arquivo testng.xml da seguinte maneira -
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<groups>
<define name = "all">
<include name = "functest"/>
<include name = "checkintest"/>
</define>
<run>
<include name = "all"/>
</run>
</groups>
<classes>
<class name = "GroupTestExample" />
</classes>
</test>
</suite>
Executar o testng.xml acima executará todos os três testes e fornecerá o seguinte resultado -
Inside testPrintMessage()
.com
Inside testSalutationMessage()
tutorialspoint.com
Inside testExitMessage()
www.tutorialspoint.com
===============================================
Suite1
Total tests run: 3, Failures: 0, Skips: 0
===============================================
Grupos de Exclusão
Você pode ignorar um grupo usando a tag <exclude> conforme mostrado abaixo -
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<groups>
<define name = "all">
<exclude name = "functest"/>
<include name = "checkintest"/>
</define>
<run>
<include name = "all"/>
</run>
</groups>
<classes>
<class name = "GroupTestExample" />
</classes>
</test>
</suite>
TestNG fornece uma opção de rastrear a manipulação de exceção do código. Você pode testar se um código lança uma exceção desejada ou não. Aqui oexpectedExceptionsparâmetro é usado junto com a anotação @Test. Agora vamos ver@Test(expectedExceptions) em ação.
Criar uma aula
Crie uma classe java a ser testada, digamos, MessageUtil.java dentro C:\> TestNG_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, digamos, ExpectedExceptionTest.java.
Adicione uma exceção esperada ArithmeticException ao caso de teste testPrintMessage ().
Crie um arquivo de classe java chamado ExpectedExceptionTest.java dentro C:\> TestNG_WORKSPACE.
import org.testng.Assert;
import org.testng.annotations.Test;
public class ExpectedExceptionTest {
String message = "Manisha";
MessageUtil messageUtil = new MessageUtil(message);
@Test(expectedExceptions = ArithmeticException.class)
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
messageUtil.printMessage();
}
@Test
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "Hi!" + "Manisha";
Assert.assertEquals(message,messageUtil.salutationMessage());
}
}
Criar executor de teste
Crie testng.xml em C:\>TestNG_WORKSPACE para executar caso (s) de teste.
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<classes>
<class name = "ExpectedExceptionTest" />
</classes>
</test>
</suite>
Compile o MessageUtil, classes de caso de teste usando javac.
C:\TestNG_WORKSPACE>javac MessageUtil.java TestJunit.java
Agora, execute o Test Runner, que executará casos de teste definidos na classe Test Case fornecida.
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
Verifique a saída. O caso de teste testPrintMessage () será aprovado.
Inside testPrintMessage()
Manisha
Inside testSalutationMessage()
Hi!Manisha
===============================================
Suite1
Total tests run: 2, Failures: 0, Skips: 0
===============================================
Às vezes, você pode precisar invocar métodos em um caso de teste em uma ordem específica ou pode desejar compartilhar alguns dados e estado entre os métodos. Este tipo de dependência é suportado pelo TestNG, uma vez que suporta a declaração de dependências explícitas entre métodos de teste.
TestNG permite que você especifique dependências com -
Usando o atributo dependsOnMethods em anotações @Test, OR.
Usando o atributo dependsOnGroups em anotações @Test.
Exemplo de uso de dependsOnMethods
Criar uma aula
Crie uma classe java a ser testada, digamos, MessageUtil.java dentro C:\>TestNG_WORKSPACE.
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, DependencyTestUsingAnnotation.java.
Adicione métodos de teste, testPrintMessage () e testSalutationMessage (), e initEnvironmentTest (), à sua classe de teste.
Adicionar atributo dependsOnMethods = {"initEnvironmentTest"} para a anotação @Test de testSalutationMessage() método.
Crie um nome de arquivo de classe java DependencyTestUsingAnnotation.java dentro C:\>TestNG_WORKSPACE.
import org.testng.Assert;
import org.testng.annotations.Test;
public class DependencyTestUsingAnnotation {
String message = "Manisha";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
message = "Manisha";
Assert.assertEquals(message, messageUtil.printMessage());
}
@Test(dependsOnMethods = { "initEnvironmentTest" })
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "Hi!" + "Manisha";
Assert.assertEquals(message, messageUtil.salutationMessage());
}
@Test
public void initEnvironmentTest() {
System.out.println("This is initEnvironmentTest");
}
}
Crie testng.xml
Crie testng.xml em C:\>TestNG_WORKSPACE para executar caso (s) de teste.
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<classes>
<class name = "DependencyTestUsingAnnotation" />
</classes>
</test>
</suite>
Compile o MessageUtil, classes de caso de teste usando javac.
C:\TestNG_WORKSPACE>javac MessageUtil.java DependencyTestUsingAnnotation.java
Agora, execute o testng.xml, que executará o método testSalutationMessage () somente após a execução do método initEnvironmentTest ().
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
Verifique a saída.
This is initEnvironmentTest
Inside testPrintMessage()
Manisha
Inside testSalutationMessage()
Hi!Manisha
===============================================
Suite1
Total tests run: 3, Failures: 0, Skips: 0
===============================================
Exemplo de uso de dependsOnGroups
Você também pode ter métodos que dependem de grupos inteiros. Vamos ter um exemplo para demonstrar isso.
Criar uma aula
Crie uma classe java a ser testada, digamos, MessageUtil.java dentro C:\>TestNG_WORKSPACE.
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, DependencyTestUsingAnnotation.java.
Adicione métodos de teste, testPrintMessage () testSalutationMessage () e initEnvironmentTest () à sua classe de teste e adicione-os ao grupo "init".
Adicione o atributo dependsOnMethods = {"init.*"} para a anotação @Test de testSalutationMessage() método.
Crie um arquivo de classe java chamado DependencyTestUsingAnnotation.java dentro C:\>TestNG_WORKSPACE.
import org.testng.Assert;
import org.testng.annotations.Test;
public class DependencyTestUsingAnnotation {
String message = "Manisha";
MessageUtil messageUtil = new MessageUtil(message);
@Test(groups = { "init" })
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
message = "Manisha";
Assert.assertEquals(message, messageUtil.printMessage());
}
@Test(dependsOnGroups = { "init.*" })
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "Hi!" + "Manisha";
Assert.assertEquals(message, messageUtil.salutationMessage());
}
@Test(groups = { "init" })
public void initEnvironmentTest() {
System.out.println("This is initEnvironmentTest");
}
}
Neste exemplo, testSalutationMessage () é declarado como dependente de qualquer grupo, correspondendo à expressão regular "init. *", O que garante que os métodos testPrintMessage () e initEnvironmentTest () sempre serão chamados antes de testSalutationMessage ().
Se um método dependente falhar e você tiver uma dependência rígida dele (alwaysRun = false, que é o padrão), os métodos que dependem dele não são marcados como FAIL, mas como SKIP. Os métodos ignorados serão relatados como tal no relatório final (em uma cor que não seja vermelha nem verde no HTML), o que é importante, pois os métodos ignorados não são necessariamente falhas.
Crie testng.xml
Crie testng.xml em C:\>TestNG_WORKSPACE para executar caso (s) de teste.
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<classes>
<class name = "DependencyTestUsingAnnotation" />
</classes>
</test>
</suite>
Compile o MessageUtil, classes de caso de teste usando javac.
C:\TestNG_WORKSPACE>javac MessageUtil.java DependencyTestUsingAnnotation.java
Agora, execute o testng.xml, que executará o método testSalutationMessage () somente após a execução do método initEnvironmentTest () .
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
Verifique a saída.
This is initEnvironmentTest
Inside testPrintMessage()
Manisha
Inside testSalutationMessage()
Hi!Manisha
===============================================
Suite1
Total tests run: 3, Failures: 0, Skips: 0
===============================================
DependeOnGroups Vs DependeOnMethods
Ao usar grupos, não estamos mais expostos a problemas de refatoração. Desde que não modifiquemos os atributos dependsOnGroups ou groups, nossos testes continuarão sendo executados com as dependências adequadas configuradas.
Sempre que um novo método precisa ser adicionado ao gráfico de dependência, tudo o que precisamos fazer é colocá-lo no grupo certo e ter certeza de que depende do grupo correto. Não precisamos modificar nenhum outro método.
Outro recurso interessante disponível no TestNG é parametric testing. Na maioria dos casos, você se deparará com um cenário em que a lógica de negócios requer um número extremamente variável de testes.Parameterized tests permitem que os desenvolvedores executem o mesmo teste repetidamente usando valores diferentes.
TestNG permite que você passe parâmetros diretamente para seus métodos de teste de duas maneiras diferentes -
- Com testng.xml
- Com provedores de dados
Passando parâmetros com testng.xml
Com essa técnica, você define os parâmetros simples no arquivo testng.xml e, a seguir, faz referência a esses parâmetros nos arquivos de origem. Vamos ter um exemplo para demonstrar como usar essa técnica para passar parâmetros.
Criar classe de caso de teste
Crie uma classe de teste java, digamos, ParameterizedTest1.java.
Adicione o método de teste parameterTest () à sua classe de teste. Este método usa uma string como parâmetro de entrada.
Adicione a anotação @Parameters ("myName") a este método. O parâmetro seria passado um valor de testng.xml, que veremos na próxima etapa.
Crie um arquivo de classe java chamado ParameterizedTest1.java dentro C:\>TestNG_WORKSPACE.
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
public class ParameterizedTest1 {
@Test
@Parameters("myName")
public void parameterTest(String myName) {
System.out.println("Parameterized value is : " + myName);
}
}
Crie testng.xml
Crie testng.xml em C:\>TestNG_WORKSPACE para executar caso (s) de teste.
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<parameter name = "myName" value="manisha"/>
<classes>
<class name = "ParameterizedTest1" />
</classes>
</test>
</suite>
Também podemos definir os parâmetros no nível <suite>. Suponha que tenhamos definido meuNome nos níveis <suite> e <test>. Nesses casos, as regras regulares de escopo se aplicam. Isso significa que qualquer classe dentro da tag <test> verá o valor do parâmetro definido em <test>, enquanto as classes no restante do arquivo testng.xml verão o valor definido em <suite>.
Compile a classe de caso de teste usando javac.
C:\TestNG_WORKSPACE>javac ParameterizedTest1.java
Agora, execute testng.xml, que executará o método parameterTest . TestNG tentará encontrar um parâmetro denominado myName primeiro na tag <test> e, em seguida, se não puder encontrá-lo, ele pesquisará na tag <suit> que o envolve.
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
Verifique a saída.
Parameterized value is : manisha
===============================================
Suite1
Total tests run: 1, Failures: 0, Skips: 0
===============================================
TestNG tentará automaticamente converter o valor especificado em testng.xml para o tipo de seu parâmetro. Aqui estão os tipos suportados -
- String
- int/Integer
- boolean/Boolean
- byte/Byte
- char/Character
- double/Double
- float/Float
- long/Long
- short/Short
Passando parâmetros com provedores de dados
Quando você precisa passar parâmetros complexos ou parâmetros que precisam ser criados em Java (objetos complexos, objetos lidos de um arquivo de propriedades ou banco de dados, etc.), os parâmetros podem ser passados usando provedores de dados.
Um provedor de dados é um método anotado com @DataProvider. Esta anotação possui apenas um atributo de string: seu nome. Se o nome não for fornecido, o nome do provedor de dados será automaticamente padronizado como o nome do método. Um provedor de dados retorna uma matriz de objetos.
Os exemplos a seguir demonstram como usar provedores de dados. O primeiro exemplo é sobre @DataProvider usando Vector, String ou Integer como parâmetro, e o segundo exemplo é sobre @DataProvider usando objeto como parâmetro.
Exemplo 1
Aqui, o @DataProvider passa Inteiro e Booleano como parâmetro.
Create Java class
Crie uma classe java chamada PrimeNumberChecker.java. Esta classe verifica se o número é primo. Crie esta classe emC:\>TestNG_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;
}
}
Create Test Case Class
Crie uma classe de teste java, digamos, ParamTestWithDataProvider1.java.
Defina o método primeNumbers (), que é definido como um provedor de dados usando a anotação. Este método retorna uma matriz de objetos.
Adicione o método de teste testPrimeNumberChecker () à sua classe de teste. Este método usa um inteiro e um booleano como parâmetros de entrada. Este método valida se o parâmetro passado é um número primo.
Adicione a anotação @Test (dataProvider = "test1") a este método. O atributo dataProvider é mapeado para "test1".
Crie um arquivo de classe java chamado ParamTestWithDataProvider1.java dentro C:\>TestNG_WORKSPACE.
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class ParamTestWithDataProvider1 {
private PrimeNumberChecker primeNumberChecker;
@BeforeMethod
public void initialize() {
primeNumberChecker = new PrimeNumberChecker();
}
@DataProvider(name = "test1")
public static Object[][] primeNumbers() {
return 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(dataProvider = "test1")
public void testPrimeNumberChecker(Integer inputNumber, Boolean expectedResult) {
System.out.println(inputNumber + " " + expectedResult);
Assert.assertEquals(expectedResult, primeNumberChecker.validate(inputNumber));
}
}
Create testng.xml
Crie um testng.xml C:\>TestNG_WORKSPACE para executar caso (s) de teste.
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<classes>
<class name = "ParamTestWithDataProvider1" />
</classes>
</test>
</suite>
Compile a classe de caso de teste usando javac.
C:\TestNG_WORKSPACE>.javac ParamTestWithDataProvider1.java PrimeNumberChecker.java
Agora, execute testng.xml.
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
Verifique a saída.
2 true
6 false
19 true
22 false
23 true
===============================================
Suite1
Total tests run: 5, Failures: 0, Skips: 0
===============================================
Exemplo 2
Aqui, o @DataProvider passa Object como parâmetro.
Create Java class
Crie uma classe java Bean.java, que é um objeto simples com métodos get / set, em C:\>TestNG_WORKSPACE.
public class Bean {
private String val;
private int i;
public Bean(String val, int i) {
this.val = val;
this.i = i;
}
public String getVal() {
return val;
}
public void setVal(String val) {
this.val = val;
}
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
}
Create Test Case Class
Crie uma classe de teste java, digamos, ParamTestWithDataProvider2.java.
Defina o método primeNumbers (), que é definido como um provedor de dados usando anotação. Este método retorna uma matriz de objeto.
Adicione o método de teste testMethod () à sua classe de teste. Este método usa um bean de objeto como parâmetro.
Adicione a anotação @Test (dataProvider = "test1") a este método. O atributo dataProvider é mapeado para "test1".
Crie um arquivo de classe java chamado ParamTestWithDataProvider2.java em C:\>TestNG_WORKSPACE.
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class ParamTestWithDataProvider2 {
@DataProvider(name = "test1")
public static Object[][] primeNumbers() {
return new Object[][] { { new Bean("hi I am the bean", 111) } };
}
@Test(dataProvider = "test1")
public void testMethod(Bean myBean) {
System.out.println(myBean.getVal() + " " + myBean.getI());
}
}
Create testng.xml
Crie testng.xml em C:\>TestNG_WORKSPACE para executar caso (s) de teste.
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name = "Suite1">
<test name = "test1">
<classes>
<class name = "ParamTestWithDataProvider2" />
</classes>
</test>
</suite>
Compile a classe de caso de teste usando javac.
C:\TestNG_WORKSPACE>javac ParamTestWithDataProvider2.java Bean.java
Agora, execute testng.xml.
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE" org.testng.TestNG testng.xml
Verifique a saída.
hi I am the bean 111
===============================================
Suite1
Total tests run: 1, Failures: 0, Skips: 0
===============================================
Agora que você entendeu o TestNG e seus vários testes, você deve estar preocupado agora em como refatorar seu código JUnit existente. Não há necessidade de se preocupar, pois o TestNG fornece uma maneira de mudar de JUnit para TestNG em seu próprio ritmo. Você pode executar seus casos de teste JUnit existentes usando TestNG.
TestNG pode reconhecer e executar testes JUnit automaticamente, para que você possa usar TestNG como um executor para todos os seus testes existentes e escrever novos testes usando TestNG. Tudo que você precisa fazer é colocar a biblioteca JUnit no classpath TestNG, para que ela possa localizar e usar classes JUnit, alterar o executor de teste de JUnit para TestNG no Ant e, em seguida, executar TestNG no modo "misto". Dessa forma, você pode ter todos os seus testes no mesmo projeto, mesmo no mesmo pacote, e começar a usar o TestNG. Essa abordagem também permite que você converta seus testes JUnit existentes para TestNG de forma incremental.
Deixe-nos dar um exemplo para demonstrar essa incrível capacidade do TestNG.
Criar classe de caso de teste JUnit
Crie uma classe java, que é uma classe de teste JUnit, TestJunit.java em C:\>TestNG_WORKSPACE.
import org.junit.Test;
import static org.testng.AssertJUnit.assertEquals;
public class TestJunit {
@Test
public void testAdd() {
String str = "Junit testing using TestNG";
AssertEquals("Junit testing using TestNG",str);
}
}
Agora, vamos escrever o testng.xml em C:\>TestNG_WORKSPACE, que conteria a tag <suite> da seguinte maneira -
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name = "Converted JUnit suite" >
<test name = "JUnitTests" junit="true">
<classes>
<class name = "TestJunit" />
</classes>
</test>
</suite>
Para executar os casos de teste JUnit, defina a propriedade junit = "true" como no xml acima. A classe de caso de teste JUnit, TestJunit, é definida no nome da classe.
Para JUnit 4, TestNG usará o executor org.junit.runner.JUnitCore para executar seus testes.
Compile todas as classes java usando javac.
C:\TestNG_WORKSPACE>javac TestJunit.java
Agora, execute testng.xml, que executará o caso de teste JUnit como TestNG.
C:\TestNG_WORKSPACE>java -cp "C:\TestNG_WORKSPACE:C:\TestNG_WORKSPACE\lib\junit-4.11.jar" org.testng.TestNG testng.xml
Aqui, colocamos junit-4.11.jar em C: \ TestNG_WORKSPACE \ lib \ junit-4.11.jar.
Verifique a saída.
===============================================
Converted JUnit suite
Total tests run: 1, Failures: 0, Skips: 0
===============================================
O relatório é a parte mais importante de qualquer execução de teste, pois ajuda o usuário a entender o resultado da execução do teste, o ponto de falha e os motivos da falha. O log, por outro lado, é importante para ficar de olho no fluxo de execução ou para depuração em caso de falhas.
TestNG, por padrão, gera um tipo diferente de relatório para sua execução de teste. Isso inclui uma saída de relatório HTML e XML. TestNG também permite que seus usuários escrevam seu próprio repórter e o usem com TestNG. Também existe a opção de escrever seus próprios registradores, que são notificados em tempo de execução pelo TestNG.
Existem duas maneiras de gerar um relatório com TestNG -
Listeners- Para implementar uma classe de ouvinte, a classe deve implementar a interface org.testng.ITestListener . Essas classes são notificadas em tempo de execução pelo TestNG quando o teste começa, termina, falha, pula ou passa.
Reporters- Para implementar uma classe de relatório, a classe deve implementar uma interface org.testng.IReporter . Essas classes são chamadas quando toda a execução do pacote termina. O objeto que contém as informações de toda a execução do teste é passado para essa classe quando chamado.
Neste capítulo, teremos quatro exemplos diferentes para demonstrar quatro casos diferentes de relatório e registro -
Sr. Não. | Caso e Exemplo |
---|---|
1 | Registro Personalizado Este exemplo ilustra como escrever seu próprio logger. |
2 | Repórter personalizado Este exemplo ilustra como escrever seu próprio repórter. |
3 | Relatório HTML e XML Este exemplo ilustra o relatório HTML e XML padrão gerado pelo TestNG. |
4 | Relatórios JUnit Este exemplo ilustra como gerar relatórios JUnit a partir de relatórios TestNG. |
Neste capítulo, demonstraremos como executar o TestNG usando ANT. Vamos seguir as etapas abaixo -
Etapa 1: Baixe o Apache Ant
Baixe a última versão do Apache Ant
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. Vamos supor que armazenamos as bibliotecas Ant na pasta apache-ant-1.8.4.
SO | Resultado |
---|---|
janelas | Defina a variável de ambiente ANT_HOME para C: \ Arquivos de programas \ Apache Software Foundation \ apache-ant-1.8.4 |
Linux | Exportar ANT_HOME = / usr / local / apache-ant-1.8.4 |
Mac | Exportar ANT_HOME = / Library / apache-ant-1.8.4 |
Anexe a localização do compilador Ant ao caminho do sistema da seguinte forma -
SO | Descrição |
---|---|
janelas | Anexe 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 TestNG
Baixe os arquivos jar necessários http://www.testng.org.
SO | Nome do arquivo |
---|---|
janelas | testng-6.8.jar |
Linux | testng-6.8.jar |
Mac | testng-6.8.jar |
Etapa 4: Criar Estrutura do Projeto
Crie uma pasta TestNGWithAnt dentro C:\>TestNG_WORKSPACE.
Crie uma pasta src dentro C:\>TestNG_WORKSPACE>TestNGWithAnt.
Crie uma pasta test dentro C:\>TestNG_WORKSPACE>TestNGWithAnt.
Crie uma pasta lib dentro C:\>TestNG_WORKSPACE>TestNGWithAnt.
Crio MessageUtil classe em C:\>TestNG_WORKSPACE>TestNGWithAnt>src pasta.
/*
* 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);
return message;
}
// add "Hi!" to the message
public String salutationMessage() {
message = "Hi!" + message;
System.out.println(message);
return message;
}
}
Crie a classe TestMessageUtil em C:\>TestNG_WORKSPACE>TestNGWithAnt>src pasta.
import org.testng.Assert;
import org.testng.annotations.Test;
public class TestMessageUtil {
String message = "Manisha";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testPrintMessage() {
System.out.println("Inside testPrintMessage()");
Assert.assertEquals(message,messageUtil.printMessage());
}
@Test
public void testSalutationMessage() {
System.out.println("Inside testSalutationMessage()");
message = "Hi!" + "Manisha";
Assert.assertEquals(message,messageUtil.salutationMessage());
}
}
Copiar testng-6.8.jar em C:\>TestNG_WORKSPACE>TestNGWithAnt>lib pasta.
Crie ANT build.xml
Primeiro, precisamos definir a tarefa TestNG Ant da seguinte forma -
<taskdef name = "testng" classname = "org.testng.TestNGAntTask">
<classpath>
<pathelement location = "lib/testng-6.8.jar"/>
</classpath>
</taskdef>
Então, estaremos usando <testng> tarefa no Ant para executar nossos casos de teste TestNG.
o build.xml arquivo é o seguinte -
<project name = "TestNGTest" default = "test" basedir = ".">
<!-- Define <testng> task -->
<taskdef name = "testng" classname = "org.testng.TestNGAntTask">
<classpath>
<pathelement location = "lib/testng-6.8.jar"/>
</classpath>
</taskdef>
<property name = "testdir" location = "test" />
<property name = "srcdir" location = "src" />
<property name = "libdir" location = "lib" />
<property name = "full-compile" value="true" />
<path id = "classpath.base"/>
<path id = "classpath.test">
<fileset dir = "${libdir}"> <include name = "**/*.jar" /> </fileset> <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">
<testng outputdir = "${testdir}" classpathref="classpath.test"> <xmlfileset dir = "${srcdir}" includes="testng.xml"/>
</testng>
</target>
</project>
Execute o seguinte comando Ant.
C:\TestNG_WORKSPACE\TestNGWithAnt>ant
Verifique a saída.
test:
[testng] [TestNG] Running:
[testng] C:\TestNG_WORKSPACE\TestNGWithAnt\src\testng.xml
[testng]
[testng] Inside testPrintMessage()
[testng] Manisha
[testng] Inside testSalutationMessage()
[testng] Hi!Manisha
[testng]
[testng] ===============================================
[testng] Plug ANT test Suite
[testng] Total tests run: 2, Failures: 0, Skips: 0
[testng] ===============================================
[testng]
BUILD SUCCESSFUL
Total time: 1 second
Para configurar TestNG com Eclipse, siga as etapas fornecidas abaixo -
Etapa 1: Baixe o arquivo TestNG
Baixe a versão mais recente do arquivo jar TestNG em http://www.testng.org
SO | Nome do arquivo |
---|---|
janelas | testng-6.8.jar |
Linux | testng-6.8.jar |
Mac | testng-6.8.jar |
Presumimos que você copiou o arquivo JAR acima na pasta C: \> TestNG.
Etapa 2: definir o ambiente Eclipse
Abra eclipse → clique com o botão direito do mouse no projeto e vá para propriedade → Build Path → Configure Build Path e adicione testng-6.8.jar nas bibliotecas usando o botão Add External Jar .
Presumimos que seu Eclipse tenha o plug-in TestNG embutido; se não estiver disponível, obtenha a versão mais recente usando o site de atualização.
Em seu Eclipse IDE, selecione Ajuda / Atualizações de software / Localizar e instalar .
Procure por novos recursos para instalar.
Novo site remoto.
Para Eclipse 3.4 e superior, digite http://beust.com/eclipse.
Para Eclipse 3.3 e abaixo, digite http://beust.com/eclipse1.
Certifique-se de que a caixa de seleção ao lado do URL esteja marcada e clique em Avançar .
O Eclipse irá guiá-lo através do processo.
Agora, seu Eclipse está pronto para o desenvolvimento de casos de teste TestNG.
Etapa 3: verificar a instalação do TestNG no Eclipse
Crie um projeto TestNGProject no Eclipse em qualquer local.
Crie uma classe MessageUtil 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 TestNGExample no projeto.
import org.testng.Assert;
import org.testng.annotations.Test;
public class TestNGExample {
String message = "Hello World";
MessageUtil messageUtil = new MessageUtil(message);
@Test
public void testPrintMessage() {
Assert.assertEquals(message,messageUtil.printMessage());
}
}
A estrutura do projeto deve ser a seguinte -
Finalmente, verifique a saída do programa clicando com o botão direito do mouse no programa e executando como TestNG.
Verifique o resultado.