Como executar vários casos de teste em TestNG suíte

⚡ Resumo Inteligente

Execute vários casos de teste com TestNG Suíte em Selenium Permite acionar diversas classes, pacotes ou suítes filhas a partir de um único arquivo testng.xml. Este guia passo a passo aborda threads paralelas, hierarquia de suítes, geração de relatórios e assistência de IA para aplicações modernas. TestNG Projetos 7.x.

  • 🧵 Threads paralelas: Defina thread-count e parallel="tests" para reduzir drasticamente o tempo de execução geral em todos os navegadores e pacotes.
  • 🗂️ Hierarquia de Suítes: Um arquivo testng.xml pai pode listar entradas de arquivos de suítes filhos para encadear várias suítes em um único gatilho.
  • ⚙️ TestNG Pronto para a versão 7.x: Os exemplos estão alinhados com TestNG 7.10 e Selenium 4 drivers W3C, substituindo os legados. FirefoxFiação do driver.
  • 📊 Relatórios inteligentes: Os níveis de detalhamento de 1 a 10 e os relatórios HTML que podem ser enviados por e-mail ajudam a diagnosticar rapidamente falhas em threads paralelas.
  • 🤖 Orquestração de IA: Os agendadores orientados por IA reordenam, repetem e fragmentam conjuntos de tarefas com base em dados históricos de instabilidade e duração.

Execute vários casos de teste com TestNG Suíte em Selenium

TestNG Permite executar métodos de teste, classes e suítes de teste completas em paralelo dentro de um mesmo projeto. A execução paralela reduz o tempo total de execução, pois as threads iniciam os testes simultaneamente, em vez de uma após a outra. Este guia explica como executar várias classes (suítes de teste diferentes) usando o comando `run`. TestNG 7.x com Selenium WebDriver.

Etapa 1) Criando um TestNGArquivo .xml para executar testes

Para criar a configuração, siga os passos abaixo.

  1. Criar um novo projeto em Eclipse.
  2. Crie dois pacotes no projeto (dê a eles um nome). com.suite1 e com.suite2).
  3. Crie uma classe em cada pacote (e dê um nome a elas). Flipkart.java e Snapdeal.java) e copie o código abaixo para as respectivas classes.
  4. Crie um novo arquivo em seu projeto e dê a ele um nome. testeng.xml. Certifique-se de que TestNG O plugin está instalado (instruções disponíveis). aqui.O arquivo testng.xml contém todas as configurações, como nomes de classes, nomes de testes e nomes de suítes de testes.

Flipkart.java

package com.suite1;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.interactions.Actions;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

public class Flipkart {

    WebDriver driver = new FirefoxDriver();
    String username = ""; // Change to your username and password
    String password = "";

    // This method navigates to the Flipkart URL
    @BeforeClass
    public void init() {
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
        driver.navigate().to("https://www.flipkart.com");
    }

    // Log in to Flipkart
    @Test
    public void login() {
        driver.findElement(By.partialLinkText("Login")).click();
        driver.findElement(By.cssSelector(".fk-input.login-form-input.user-email")).sendKeys(username);
        driver.findElement(By.cssSelector(".fk-input.login-form-input.user-pwd")).sendKeys(password);
        driver.findElement(By.cssSelector(".submit-btn.login-btn.btn")).click();
    }

    // Search for a product
    @Test
    public void searchAndSelectProduct() {
        driver.findElement(By.id("fk-top-search-box")).sendKeys("moto g3");
        driver.findElement(By.cssSelector("search-bar-submit.fk-font-13.fk-font-bold")).click();
        String css = ".gd-row.browse-grid-row:nth-of-type(1) > div:nth-child(1)>div>div:nth-child(2)>div>a";
        driver.findElement(By.cssSelector(css)).click();
    }

    @Test
    public void buyAndRemoveFromCart() {
        driver.findElement(By.cssSelector(".btn-express-checkout.btn-big.current")).click();
        driver.findElement(By.cssSelector(".remove.fk-inline-block")).click();
        Alert a = driver.switchTo().alert();
        a.accept();
    }

    @Test
    public void logout() {
        Actions s = new Actions(driver);
        WebElement user = driver.findElement(By.partialLinkText(username));
        s.moveToElement(user).build().perform();
        driver.findElement(By.linkText("Logout")).click();
    }

    @AfterClass
    public void quit() {
        driver.close();
    }
}

SnapDeal.java

package com.suite2;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.interactions.Actions;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

public class SnapDeal {

    WebDriver driver = new FirefoxDriver();
    String username = ""; // Change to your username and password
    String password = "";
    String pinCode = "";

    // This method navigates to the Snapdeal URL
    @BeforeClass
    public void init() {
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
        driver.navigate().to("https://www.snapdeal.com");
    }

    @Test
    public void login() {
        driver.findElement(By.xpath("//button[text()='Login']")).click();
        driver.switchTo().frame("loginIframe");
        driver.findElement(By.cssSelector("div[onClick='getLoginForm()']")).click();
        driver.findElement(By.id("j_username")).sendKeys(username);
        driver.findElement(By.id("j_password_login")).sendKeys(password);
        driver.findElement(By.id("signin_submit")).click();
        driver.switchTo().defaultContent();
    }

    @Test
    public void searchAndSelectProduct() {
        driver.findElement(By.cssSelector(".col-xs-20.searchformInput.keyword")).sendKeys("iphone 6s");
        driver.findElement(By.cssSelector(".sd-icon.sd-icon-search")).click();
        String css = ".product_grid_row:nth-of-type(1)>div:nth-child(1)";
        driver.findElement(By.cssSelector(css)).click();
    }

    @Test
    public void buyAndRemoveFromCart() {
        driver.findElement(By.xpath("//li[contains(text(),'Silver')]")).click();
        driver.findElement(By.id("pincode-check")).sendKeys(pinCode);
        driver.findElement(By.id("buy-button-id")).click();
        driver.findElement(By.cssSelector("i[title='Delete Item']")).click();
        Alert a = driver.switchTo().alert();
        a.accept();
    }

    @Test
    public void logout() {
        driver.findElement(By.linkText("START SHOPPING NOW")).click();
        Actions s = new Actions(driver);
        WebElement user = driver.findElement(By.cssSelector(".sd-icon.sd-icon-user"));
        s.moveToElement(user).build().perform();
        driver.findElement(By.linkText("Logout")).click();
    }

    @AfterClass
    public void quit() {
        driver.close();
    }
}

TestNG.xml

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">

<suite thread-count="2" verbose="1" name="Gmail Suite" parallel="tests">

  <test name="flipkart">
    <classes>
      <class name="com.suite1.Flipkart"/>
    </classes>
  </test>

  <test name="Myntra">
    <classes>
      <class name="com.suite2.SnapDeal"/>
    </classes>
  </test>
</suite>

A estrutura final do projeto se assemelha ao exemplo abaixo.

Criando um TestNGArquivo .xml para execução de teste

Etapa 2) Execução paralela em TestNG

Após salvar o arquivo XML acima, o próximo passo é executar os testes paralelos. O código é mostrado abaixo.

Execução Paralela em TestNG

1) contagem de fiosDefine quantas threads TestNG Pode-se iniciar a execução em paralelo. Um valor mais alto executa mais testes simultaneamente, até o limite da CPU.

2) detalhado: Exibe detalhes da execução no console. Os valores permitidos variam de 1 a 10. Valores mais altos geram registros mais detalhados e granulares.

3) nomeNome da suíte. Aqui está:Gmail Suíte".

4) paralelo: Conta TestNG O que executar simultaneamente. Os valores válidos são testes, classes, métodos ou instâncias. O valor padrão é Nenhum.

Clique com o botão direito do mouse no arquivo testng.xml e selecione Executar como > TestNG suíteAssim que terminar, você verá os resultados consolidados.

Ao executar o código acima, você obterá a seguinte saída.

Saída:

Execução Paralela em TestNG

1) Nome do conjunto de testes definido em testng.xml.

Execução Paralela em TestNG

2) Nome do teste definido em testng.xml.

Execução Paralela em TestNG

3) Nome da classe declarada em testng.xml.

Execução Paralela em TestNG

4) Nomes de métodos anotados com @Test no arquivo .java.

Execução Paralela em TestNG

O mesmo fluxo é executado para o teste SnapDeal, portanto, ambas as classes são executadas em paralelo.

Etapa 3) Executando vários conjuntos de testes a partir de um arquivo testng.xml pai.

Um requisito comum em projetos maiores é encadear vários arquivos testng.xml em um único gatilho. TestNG A versão 7.x suporta um conjunto de aplicativos principal que faz referência a um aplicativo filho. arquivo de suíte entradas, para que cada filho possa manter sua própria contagem de threads, listeners e parâmetros. Salve cada suíte filha separadamente e, em seguida, indique o caminho para o arquivo pai. Execute apenas o arquivo pai a partir do arquivo filho. Eclipse, Maven ou a linha de comando.

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Parent Suite" parallel="tests" thread-count="4">
  <suite-files>
    <suite-file path="./flipkart-suite.xml"/>
    <suite-file path="./snapdeal-suite.xml"/>
  </suite-files>
</suite>

Esse padrão mantém os conjuntos de testes de regressão, fumaça e sanidade separados, porém reutilizáveis. Você também pode acionar o arquivo pai a partir do Maven Surefire configurando <suiteXmlFile>parent-suite.xml</suiteXmlFile> dentro da configuração do plugin, o que permite que o mesmo layout paralelo funcione em pipelines de integração contínua.

Etapa 4) Melhores práticas para paralelo TestNG é executado

  • pino TestNG 7.x: Uso TestNG 7.10 ou posterior com Selenium 4. Assim, os drivers compatíveis com W3C se comportam de maneira consistente em todas as threads.
  • Evite estados compartilhados: Mova o webdriver O campo é transformado em um ThreadLocal para que cada thread mantenha sua própria sessão.
  • Ajuste a quantidade de fios: Comece verificando a quantidade de núcleos da CPU e, em seguida, observe o relatório HTML que pode ser enviado por e-mail e a carga do Grid antes de aumentá-la.
  • Dados de teste de isolamento: Utilize usuários, carrinhos e códigos PIN exclusivos para cada tópico, evitando conflitos de login.
  • Capturar screenshots em caso de falha: Prenda-os através de um ITestListener para depurar execuções paralelas instáveis ​​mais rapidamente.
  • Utilize a assistência da IA: Ferramentas como Testim, mabl e CodiumAI podem sinalizar testes instáveis ​​e sugerir seletores estáveis ​​antes da próxima execução.

Conclusão

O exemplo acima mostra como usar TestNG Para executar testes em paralelo. TestNG A versão 7.x oferece um único arquivo XML para executar várias classes de teste, vincular diversos conjuntos de testes filhos e ajustar threads paralelas, de modo que seja possível executar testes de grande porte. Selenium Os projetos são concluídos muito mais rapidamente.

Perguntas Frequentes

Coloque cada turma em sua própria sala. Adicione a tag dentro do arquivo testng.xml, defina parallel="tests" e um número de threads de pelo menos 2. TestNG Inicia ambos os testes em threads separadas, de forma que as classes sejam executadas simultaneamente em vez de sequencialmente.

Sim. Crie um conjunto de arquivos pai que liste os arquivos filhos dentro dele. Cada caminho de arquivo filho executa sua própria configuração. O padrão funciona em Eclipse, Maven Surefire e Gradlee é apoiado por TestNG A partir da versão 6, incluindo a versão atual 7.x.

O atributo `parallel` aceita testes, classes, métodos, instâncias ou nenhum. Escolha `tests` quando cada A tag é autocontida, classes são usadas para isolamento de classes inteiras e métodos são usados ​​quando os métodos individuais anotados com @Test são thread-safe. O valor padrão é nenhum, o que executa tudo sequencialmente.

Use um ThreadLocal Ou inicialize o driver dentro de um bloco `@BeforeMethod` em vez de como um campo estático. Dessa forma, cada thread terá sua própria sessão de navegador, o que elimina as condições de corrida que causam falhas em paralelo. TestNG corre em Selenium Rede.

Os orquestradores de IA estudam dados de execuções anteriores para prever falhas, isolar testes instáveis ​​e reordenar os lentos. Plataformas como a Launchable, Testime conectar mabl em TestNG Dessa forma, os conjuntos de testes com maior probabilidade de falha são executados primeiro, o que encurta os ciclos de feedback nos servidores de integração contínua.

Sim. Os agendadores baseados em IA do Launchable e do BuildPulse medem a duração histórica e a taxa de falhas por teste e, em seguida, dividem o arquivo testng.xml em fragmentos balanceados. Cada fragmento é executado em um agente separado, de modo que o tempo total de execução diminui enquanto a utilização paralela permanece alta.

Resuma esta postagem com: