Provedor de dados & TestNG XML: Parametrização em Selênio (exemplo)

Índice:

Anonim

À medida que criamos software, sempre desejamos que ele funcione de maneira diferente com um conjunto diferente de dados. Quando se trata de testar o mesmo software, não podemos ser injustos em testá-lo com apenas um conjunto de dados. Aqui, novamente, precisamos verificar se nosso sistema está pegando todos os conjuntos de combinações que devem oferecer suporte. Para isso, precisamos parametrizar nossos scipts de teste. Aí vem a parametrização na imagem.

Parametrização em Selênio

A parametrização no Selenium é um processo para parametrizar os scripts de teste a fim de passar vários dados para o aplicativo em tempo de execução. É uma estratégia de execução que executa automaticamente casos de teste várias vezes usando valores diferentes. O conceito alcançado pela parametrização dos scripts de teste é denominado Data Driven Testing .

Neste tutorial, você aprenderá-

  • Tipo de parametrização em TestNG-
  • Anotação de parâmetros com Testng.xml
  • Solução de problemas
  • Parâmetros usando Dataprovider
  • Invoque DataProvider de uma classe diferente
  • Tipos de parâmetros no provedor de dados

Tipo de parametrização em TestNG-

Para tornar a parametrização mais clara, examinaremos as opções de parametrização em um dos frameworks mais populares para Selenium Webdriver - TestNG .

Existem duas maneiras pelas quais podemos alcançar a parametrização no TestNG

  1. Com a ajuda da anotação de parâmetros e arquivo XML TestNG .

  2. Com a ajuda da anotação DataProvider .

Os parâmetros de Testng.xml podem ser suite ou nível de teste

O parâmetro de DataProvider pode aceitar Método e ITestContext como o parâmetro.

Vamos estudá-los em detalhes -

Parâmetros de anotação em TestNG

A anotação de parâmetros em TestNG é um método usado para passar valores para os métodos de teste como argumentos usando um arquivo .xml. Os usuários podem ser solicitados a passar os valores aos métodos de teste durante o tempo de execução. O método de anotação @Parameters pode ser usado em qualquer método que tenha a anotação @Test, @Before, @After ou @Factory.

Anotação de parâmetros com Testng.xml

Selecione a parametrização usando anotações quando quiser lidar com a complexidade e o número de combinações de entrada for menor.

Vamos ver como isso funciona

Cenário de Teste

Etapa 1) Abra o navegador e vá para Google.com

Etapa 2) Insira uma palavra-chave de pesquisa

Etapa 3) Verifique se o valor inserido é o mesmo fornecido por nossos dados de teste

Etapa 4) Repita 2 e 3 até que todos os valores sejam inseridos

Autor do Teste SearchKey
Guru99 Índia
Krishna EUA
Bhupesh China

Aqui está um exemplo de como fazer isso SEM parâmetros

parâmetros de pacote;import org.testng.annotations.Test;import org.testng.AssertJUnit;import java.util.concurrent.TimeUnit;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.firefox.FirefoxDriver;public class NoParameterWithTestNGXML {String driverPath = "C: \\ geckodriver.exe";Driver WebDriver;@Testepublic void testNoParameter () throws InterruptedException {String autor = "guru99";String searchKey = "índia";System.setProperty ("webdriver.gecko.driver", driverPath);driver = novo FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");WebElement searchText = driver.findElement (By.name ("q"));// Pesquisando texto na caixa de texto do googlesearchText.sendKeys (searchKey);System.out.println ("Bem-vindo ->" + autor + "Sua chave de pesquisa é ->" + searchKey);System.out.println ("Thread vai dormir agora");Thread.sleep (3000);System.out.println ("Valor na caixa de pesquisa do Google =" + searchText.getAttribute ("valor") + "::: Valor fornecido por input =" + searchKey);// verificar o valor na caixa de pesquisa do GoogleAssertJUnit.assertTrue (searchText.getAttribute ("valor"). EqualsIgnoreCase (searchKey));}}

Um estudo, o exemplo acima. Imagine como o código se tornará complexo quando fizermos isso para 3 combinações de entrada

Agora, vamos parametrizar isso usando TestNG

Para fazer isso, você precisará

  • Crie um arquivo XML que armazenará os parâmetros
  • No teste, adicione a anotação @Parameters

Aqui está o código completo

Nível de teste TestNG.xml




Arquivo ParameterWithTestNGXML.java

parâmetros de pacote;import org.testng.AssertJUnit;import java.util.concurrent.TimeUnit;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.firefox.FirefoxDriver;import org.testng.annotations.Optional;import org.testng.annotations.Parameters;import org.testng.annotations.Test;public class ParameterWithTestNGXML {String driverPath = "C: \\ geckodriver.exe";Driver WebDriver;@Teste@Parameters ({"author", "searchKey"})public void testParameterWithXML (@Optional ("Abc") String autor, String searchKey) throws InterruptedException {System.setProperty ("webdriver.gecko.driver", driverPath);driver = novo FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");WebElement searchText = driver.findElement (By.name ("q"));// Pesquisando texto na caixa de texto do googlesearchText.sendKeys (searchKey);System.out.println ("Bem-vindo ->" + autor + "Sua chave de pesquisa é ->" + searchKey);System.out.println ("Thread vai dormir agora");Thread.sleep (3000);System.out.println ("Valor na caixa de pesquisa do Google =" + searchText.getAttribute ("valor") + "::: Valor fornecido por input =" + searchKey);// verificar o valor na caixa de pesquisa do GoogleAssertJUnit.assertTrue (searchText.getAttribute ("valor"). EqualsIgnoreCase (searchKey));}}

Instruções para executar o script, selecione o arquivo XML e execute como Test NG Suite

Clique com o botão direito no arquivo .xml -> Executar como -> Testng Suite (Nota: Suite)

Agora, os parâmetros podem ser definidos em 2 níveis

  1. Nível de suíte - Os parâmetros dentro da tag do arquivo TestNG XML serão um parâmetro de nível de suíte.
  2. Nível de teste - Os parâmetros dentro da tag do arquivo XML de teste serão um parâmetro de nível de teste.

Aqui está o mesmo teste com parâmetros de nível de suíte

NOTA: Caso o nome do parâmetro seja o mesmo no nível de suíte e no nível de teste, o parâmetro de nível de teste terá preferência sobre o nível de suíte. Portanto, nesse caso, todas as classes dentro desse nível de teste compartilharão o parâmetro substituído e outras classes que estão fora do nível de teste compartilharão o parâmetro de nível de suíte.

Solução de problemas

Problema # 1 O valor do parâmetro em testng.xml não pode ser convertido para o parâmetro do método de teste correspondente, ele gerará um erro.

Considere o seguinte exemplo

Aqui, o atributo 'autor' é igual a 'Guru99' que é uma string e no método de teste correspondente espera um valor inteiro, portanto, obteremos uma exceção aqui.

Problema # 2 Seus @Parameters não têm um valor correspondente em testing.xml.

Você pode resolver esta situação adicionando a anotação @optional no parâmetro correspondente no método de teste.

Problema nº 3: você deseja testar vários valores do mesmo parâmetro usando Testng.xml

A resposta simples é que isso não pode ser feito! Você pode ter vários parâmetros diferentes, mas cada parâmetro pode ter apenas um único valor. Isso ajuda a evitar a codificação de valores no script. Isso torna o código reutilizável. Pense nisso como arquivos de configuração para o seu script. Se você quiser usar vários valores para um parâmetro, use DataProviders

Provedor de dados em TestNG

Provedor de dados em TestNG é um método usado quando um usuário precisa passar parâmetros complexos. Parâmetros complexos precisam ser criados em Java, como objetos complexos, objetos de arquivos de propriedade ou de um banco de dados podem ser passados ​​pelo método do provedor de dados. O método é anotado por @DataProvider e retorna uma matriz de objetos.

Parâmetros usando Dataprovider

A anotação @Parameters é fácil, mas para testar com vários conjuntos de dados, precisamos usar o Provedor de Dados.

Para preencher milhares de formulários da web usando nossa estrutura de teste, precisamos de uma metodologia diferente que pode nos dar um conjunto de dados muito grande em um único fluxo de execução.

Este conceito baseado em dados é alcançado pela anotação @DataProvider no TestNG.

Possui apenas um atributo 'nome' . Se você não especificar o atributo name, o nome do DataProvider será igual ao nome do método correspondente.

O provedor de dados retorna um objeto JAVA bidimensional para o método de teste e o método de teste invocará M vezes em um tipo M * N de matriz de objeto. Por exemplo, se o DataProvider retornar uma matriz de 2 * 3 objetos, o caso de teste correspondente será chamado 2 vezes com 3 parâmetros de cada vez.

Exemplo Completo

parâmetros de pacote;import java.util.concurrent.TimeUnit;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.firefox.FirefoxDriver;import org.testng.Assert;import org.testng.annotations.BeforeTest;import org.testng.annotations.DataProvider;import org.testng.annotations.Test;public class ParameterByDataprovider {Driver WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTestpublic void setup () {// Criar objeto de driver do firefoxSystem.setProperty ("webdriver.gecko.driver", driverPath);driver = novo FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}/ ** Caso de teste para verificar a caixa de pesquisa do Google* autor @param* @param searchKey* @throws InterruptedException* /@Test (dataProvider = "SearchProvider")public void testMethod (String autor, String searchKey) throws InterruptedException {{WebElement searchText = driver.findElement (By.name ("q"));// valor de pesquisa na caixa de pesquisa do googlesearchText.sendKeys (searchKey);System.out.println ("Bem-vindo ->" + autor + "Sua chave de pesquisa é ->" + searchKey);Thread.sleep (3000);String testValue = searchText.getAttribute ("valor");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Verifique se o valor na caixa de pesquisa do google está corretoAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** @return Object [] [] onde a primeira coluna contém 'autor'* e a segunda coluna contém 'searchKey'* /@DataProvider (name = "SearchProvider")public Object [] [] getDataFromDataprovider () {retornar novo objeto [] []{{"Guru99", "Índia"},{"Krishna", "UK"},{"Bhupesh", "EUA"}};}}

Invoque DataProvider de uma classe diferente

Por padrão, DataProvider reside na mesma classe onde está o método de teste ou em sua classe base. Para colocá-lo em alguma outra classe, precisamos tornar o método do provedor de dados estático e no método de teste precisamos adicionar um atributo dataProviderClass na anotação @Test .

Exemplo de Código

TestClass ParameterDataproviderWithClassLevel.java

parâmetros de pacote;import java.util.concurrent.TimeUnit;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.firefox.FirefoxDriver;import org.testng.Assert;import org.testng.annotations.BeforeTest;import org.testng.annotations.Test;public class ParameterDataproviderWithClassLevel {Driver WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTestpublic void setup () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = novo FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}@Test (dataProvider = "SearchProvider", dataProviderClass = DataproviderClass.class)public void testMethod (String autor, String searchKey) throws InterruptedException {WebElement searchText = driver.findElement (By.name ("q"));// Pesquisar texto na caixa de texto do googlesearchText.sendKeys (searchKey);System.out.println ("Bem-vindo ->" + autor + "Sua chave de pesquisa é ->" + searchKey);Thread.sleep (3000);// obter texto da caixa de pesquisaString testValue = searchText.getAttribute ("valor");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// verifique se a caixa de pesquisa tem o valor corretoAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}

DataproviderClass.java

parâmetros de pacote;import org.testng.annotations.DataProvider;public class DataproviderClass {@DataProvider (name = "SearchProvider")public static Object [] [] getDataFromDataprovider () {return new Object [] [] {{"Guru99", "Índia"},{"Krishna", "UK"},{"Bhupesh", "EUA"}};}}

Tipos de parâmetros no provedor de dados

Existem dois tipos de parâmetros suportados pelo método DataProvider.

Método - Se o SAME DataProvider deve se comportar de maneira diferente com métodos de teste diferentes, use o parâmetro Método.

No exemplo a seguir,

  • Verificamos se o nome do método é testMethodA.
  • Se sim, retorna um conjunto de valores
  • Caso contrário, retorne outro conjunto de valores
parâmetros de pacote;import java.lang.reflect.Method;import java.util.concurrent.TimeUnit;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.firefox.FirefoxDriver;import org.testng.Assert;import org.testng.annotations.BeforeTest;import org.testng.annotations.DataProvider;import org.testng.annotations.Test;public class ParameterByMethodInDataprovider {Driver WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTestpublic void setup () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = novo FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}@Test (dataProvider = "SearchProvider")public void testMethodA (String autor, String searchKey) throws InterruptedException {WebElement searchText = driver.findElement (By.name ("q"));// Pesquisar texto na caixa de pesquisasearchText.sendKeys (searchKey);// Imprimir autor e string de pesquisaSystem.out.println ("Bem-vindo ->" + autor + "Sua chave de pesquisa é ->" + searchKey);Thread.sleep (3000);String testValue = searchText.getAttribute ("valor");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Verifique se a caixa de texto do google mostra o valor corretoAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}@Test (dataProvider = "SearchProvider")public void testMethodB (String searchKey) throws InterruptedException {{WebElement searchText = driver.findElement (By.name ("q"));// Pesquisar texto na caixa de pesquisasearchText.sendKeys (searchKey);// Imprime apenas string de pesquisaSystem.out.println ("Bem-vindo -> Usuário desconhecido Sua chave de pesquisa é ->" + searchKey);Thread.sleep (3000);String testValue = searchText.getAttribute ("valor");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Verifique se a caixa de texto do google mostra o valor corretoAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** Aqui, DataProvider retorna valor com base no nome do método de teste* @param m* @Retorna** /@DataProvider (name = "SearchProvider")public Object [] [] getDataFromDataprovider (Método m) {if (m.getName (). equalsIgnoreCase ("testMethodA")) {return new Object [] [] {{"Guru99", "Índia"},{"Krishna", "UK"},{"Bhupesh", "EUA"}};}outro{return new Object [] [] {{"Canadá"},{"Rússia"},{"Japão"}};}}}

Aqui está o resultado

ITestContext - pode ser usado para criar diferentes parâmetros para casos de teste com base em grupos.

Na vida real, você pode usar ITestContext para variar os valores dos parâmetros com base nos métodos de teste, hosts e configurações do teste.

No exemplo de código a seguir

  • Temos 2 grupos A e B
  • Cada método de teste é atribuído a um grupo
  • Se o valor do grupo for A, um determinado conjunto de dados será retornado
  • Se o valor do grupo for B, outro conjunto de dados será retornado
parâmetros de pacote;import java.util.concurrent.TimeUnit;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.firefox.FirefoxDriver;import org.testng.Assert;import org.testng.ITestContext;import org.testng.annotations.BeforeTest;import org.testng.annotations.DataProvider;import org.testng.annotations.Test;public class ParameterByITestContextInDataprovider {Driver WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTest (grupos = {"A", "B"})public void setup () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = novo FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}@Test (dataProvider = "SearchProvider", grupos = "A")public void testMethodA (String autor, String searchKey) throws InterruptedException {{// search google textboxWebElement searchText = driver.findElement (By.name ("q"));// pesquise um valor nelesearchText.sendKeys (searchKey);System.out.println ("Bem-vindo ->" + autor + "Sua chave de pesquisa é ->" + searchKey);Thread.sleep (3000);String testValue = searchText.getAttribute ("valor");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// verifique o valor correto na caixa de pesquisaAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}@Test (dataProvider = "SearchProvider", grupos = "B")public void testMethodB (String searchKey) throws InterruptedException {{// encontre a caixa de pesquisa do googleWebElement searchText = driver.findElement (By.name ("q"));// pesquise um valor nelesearchText.sendKeys (searchKey);System.out.println ("Bem-vindo -> Usuário desconhecido Sua chave de pesquisa é ->" + searchKey);Thread.sleep (3000);String testValue = searchText.getAttribute ("valor");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// verifique o valor correto na caixa de pesquisaAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** Aqui, o DAtaProvider fornecerá a matriz de objetos com base em ITestContext* @param c* @Retorna* /@DataProvider (name = "SearchProvider")public Object [] [] getDataFromDataprovider (ITestContext c) {Object [] [] groupArray = null;para (grupo String: c.getIncludedGroups ()) {if (group.equalsIgnoreCase ("A")) {groupArray = novo Objeto [] [] {{"Guru99", "Índia"},{"Krishna", "UK"},{"Bhupesh", "EUA"}};intervalo;}else if (group.equalsIgnoreCase ("B")){groupArray = novo Objeto [] [] {{"Canadá"},{"Rússia"},{"Japão"}};}intervalo;}return groupArray;}}

Nota: Se você executar diretamente sua classe de teste, ela primeiro chamará dataprovider, que não pode obter informações de grupos, pois os grupos não estão disponíveis. Mas, em vez disso, se você chamar essa classe via testng.xml, ela terá informações de grupos disponíveis com ITestContext. Use o seguinte XML para chamar o teste

Resumo :

  • A parametrização é necessária para criar testes orientados a dados .
  • TestNG suporta dois tipos de parametrização, usando @ Parameter + TestNG.xml e usando @DataProvider
  • Em @ Parameter + TestNG.xml, os parâmetros podem ser colocados em nível de suíte e nível de teste. Se

    O mesmo nome de parâmetro é declarado em ambos os lugares; o parâmetro de nível de teste terá preferência sobre o parâmetro de nível de terno.

  • usando @ Parameter + TestNG.xml, apenas um valor pode ser definido por vez, mas @DataProvider retorna um array 2d de Object .
  • Se DataProvider estiver presente na classe diferente, então a classe onde reside o método de teste, DataProvider deve ser um método estático .
  • Existem dois parâmetros suportados pelo DataProvider são Method e ITestContext.