Defina o tempo de atraso para cada <test> em TestNG

Dec 14 2020

Primeiro, como informação : coloquei cada @Testum em uma classe diferente (portanto, é claro que cada classe tem apenas 1 @Testanotação).

Na verdade, meu objetivo é querer reexecutar a mesma classe com parâmetros diferentes, mas quero executar outra classe antes.

Tentei encontrar muitas referências que TestNG não permite a repetição de uma classe ou uma @Testanotação de método em uma <test>. A repetição fornecida é uma invocationCountfunção, pelo que vejo invocationCount, mas não consigo atingir o meu objetivo invocationCountporque esta função repete um @Testao mesmo tempo e, em seguida, posso executar outra @Test.

public class SimpleTest1 {
    @Test
    @Parameters({"acc"})
    public void historyTransfer(String acc) {
        System.out.println(new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").format(Calendar.getInstance().getTime()));
    }
}
public class SimpleTest2 {
    @Test
    @Parameters({"senderAcc", "beneficiaryAcc", "amount"})
    public void tranfer(String senderAcc, String beneficiaryAcc, String amount) {
        System.out.println(new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").format(Calendar.getInstance().getTime()));
    }
}

Imagino rodar como a configuração abaixo:

<suite name="Suite">
    <test name="My Test" >
        <classes>
            <class name="com.SimpleTest1">
                <parameter name="acc" value="11111"></parameter>
            </class>
            <class name="com.SimpleTest2">
                <parameter name="senderAcc" value="11111"></parameter>
                <parameter name="beneficiaryAcc" value="22222"></parameter>
                <parameter name="amount" value="100"></parameter>
            </class>
            <class name="com.SimpleTest1">
                <parameter name="acc" value="22222"></parameter>
            </class>
        </classes>
    </test>
</suite>

Mas a configuração acima não saiu como planejado porque a segunda SimpleTest1não foi executada.

Então tentei executá-lo separadamente, <test>como abaixo e sucesso, mas estou enfrentando um novo problema sobre o tempo de atraso de cada um <test>.

Execute vários em <test>série (não paralelo) da seguinte forma:

<suite name="Suite">
    <test name="My Test1" >
        <classes>
            <class name="com.SimpleTest1">
                <parameter name="acc" value="11111"></parameter>
            </class>
        </classes>
    </test>
    <test name="My Test2" >
        <classes>
            <class name="com.SimpleTest2">
                <parameter name="senderAcc" value="11111"></parameter>
                <parameter name="beneficiaryAcc" value="22222"></parameter>
                <parameter name="amount" value="100"></parameter>
            </class>
        </classes>
    </test>
    <test name="My Test3" >
        <classes>
            <class name="com.SimpleTest1">
                <parameter name="acc" value="22222"></parameter>
            </class>
        </classes>
    </test>
</suite>

Dependência do TestNG Maven:

<dependency>
    <groupId>org.testng</groupId>
    <artifactId>testng</artifactId>
    <version>7.0.0</version>
    <scope>compile</scope>
</dependency>

Surefire:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.2</version>
    <configuration>
        <suiteXmlFiles>
            <suiteXmlFile>testng.xml</suiteXmlFile>
        </suiteXmlFiles>
      </configuration>
</plugin>

IDE: Eclipse (versão: 2018-09 (4.9.0))

SO: macOS Mojave (versão 10.14.6)

Produto :

[RemoteTestNG] detected TestNG version 7.0.0
22-12-2020 21:59:32
22-12-2020 21:59:47
22-12-2020 21:59:57

===============================================
Suite
Total tests run: 3, Passes: 3, Failures: 0, Skips: 0
===============================================

Mas depois que o primeiro <test>é concluído, há um atraso de cerca de 10 segundos antes da próxima <test>execução, bem como do próximo teste.

Nota : Achei que fosse um problema com o IDE (eu uso o Eclipse), mas não era. Tentei executá-lo de 2 maneiras, por meio do IDE e da linha de comando, e me deu o mesmo resultado sobre esse problema de atraso.

Via linha de comando usando este comando:

mvn clean test -Dsurefire.suiteXmlFiles=testng.xml

Existe alguma configuração para reduzir o tempo de atraso acima?

Respostas

2 juherr Dec 23 2020 at 19:36

Primeiro, um pacote não é um plano de teste (poderia ser uma boa solicitação de recurso, aliás), mas apenas uma maneira de selecionar testes. Isso significa que você não pode definir uma dependência entre os testes. É por isso que ter a mesma classe de teste não funciona (deve falhar ou criar instâncias diferentes).

Pelo que entendi suas necessidades, a melhor maneira é separar sua própria lógica e sua integração com a estrutura de teste:

  1. projete suas classes auxiliares / de fixação como desejar:

_

public class SimpleClass1 {
  public void historyTransfer(String acc) {
    System.out.println(new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").format(Calendar.getInstance().getTime()));
  }
}

public class SimpleClass2 {
  public void tranfer(String senderAcc, String beneficiaryAcc, String amount) {
    System.out.println(new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").format(Calendar.getInstance().getTime()));
  }
}
  1. definir as classes para a integração com o framework de teste

_

public class SimpleTest {
  @Test
  @Parameters({"acc"})
  public void step1(String acc) {
    (new SimpleClass1()).historyTransfer(acc);
  }

  @Test(dependsOnMethods = {"step1"})
  @Parameters({"senderAcc", "beneficiaryAcc", "amount"})
  public void step2(String senderAcc, String beneficiaryAcc, String amount) {
    (new SimpleClass2()).transfer(acc);
  }

  @Test(dependsOnMethods = {"step2"})
  @Parameters({"acc"})
  public void step3(String acc) {
    (new SimpleClass1()).historyTransfer(acc);
  }
}

E a suíte com os parâmetros esperados:

<suite name="Suite">
  <test name="My Test" >
    <classes>
        <class name="com.SimpleTest">
            <methods>
              <include name="step1">
              <parameter name="acc" value="11111"></parameter>
            </methods>
            <methods>
              <include name="step2">
              <parameter name="senderAcc" value="11111"></parameter>
              <parameter name="beneficiaryAcc" value="22222"></parameter>
              <parameter name="amount" value="100"></parameter>
            </methods>
            <methods>
              <include name="step3">
              <parameter name="acc" value="22222"></parameter>
            </methods>
        </class>
    </classes>
  </test>
</suite>

(isenção de responsabilidade: não verifiquei o XML em relação ao dtd, pode estar errado, mas você tem a ideia)

A nomenclatura ou a maneira de criar acessórios depende de suas próprias convenções.

1 vbn Dec 16 2020 at 15:36

Você pode definir a prioridade ou dependência de outro método usando as anotações conforme descrito aqui:

https://testng.org/doc/documentation-main.html#annotations

verifique se há @ Test.priority ou @ Test.dependsOnMethods

Isso permitirá que você execute os testes um após o outro em série.

1 user7294900 Dec 22 2020 at 16:22

Não sei por que você precisa executar a mesma classe de teste em testes separados, mas ao iniciar o teste pode carregar todo o contexto relevante, o que pode levar algum tempo e talvez após o término do teste, pode ser necessário fechar alguns recursos, ambos podem demorar / poucos segundos

Você pode usar verboso para usar mais detalhes da causa do atraso (e adicionar mais registros para ver o tempo)

<suite name="Suite" verbose="10">

O nível de verbosidade é de 0 a 10, onde 10 é o mais detalhado. Depois de defini-lo para 10, você verá que a saída do console conterá informações sobre os testes, métodos e ouvintes, etc.

Para acelerar o processo, você também pode usar o recurso paralelo do TestNG

O atributo threadPoolSize permite que você especifique quantos threads devem ser alocados para esta execução.