Testng: parâmetros de suporte no nível do método?

Criado em 12 out. 2015  ·  12Comentários  ·  Fonte: cbeust/testng

É possível suportar parâmetros especiais no nível do método?
Por exemplo,

<test name="Regression1">
<groups>
    <run>
      <exclude name="brokenTests"  />
      <include name="checkinTests"  />
    </run>
  </groups>

  <classes>
    <class name="test.IndividualMethodsTest">
      <methods>
        <include name="testMethod" param1="121" param2="1212"  />
      </methods>
    </class>
  </classes>
</test>

Estou tentando conseguir isso modificando o código testng - eu apreciaria qualquer orientação/início para isso.

Comentários muito úteis

Na verdade, existem parâmetros no nível do método. Aqui está um exemplo:

<suite name="my-suite" verbose="1">
    <test name="my-test">
        <classes>
            <class name="testng.ex1.TestParams">
                <methods>
                    <include name="m1">
                        <parameter name="key1"  value="val1"/>
                        <parameter name="key2"  value="val2"/>
                    </include>
                    <include name="m2">
                        <parameter name="key1"  value="valA"/>
                        <parameter name="key2"  value="valB"/>
                    </include>
                </methods>
            </class>
        </classes>
    </test>
</suite>
package testng.ex1;

import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

public class TestParams {

    <strong i="8">@Test</strong>
    @Parameters({ "key1", "key2" })
    public void m1(String key1, String key2) throws Exception {
        System.out.println(key1 + ", " + key2);
    }

    <strong i="9">@Test</strong>
    @Parameters({ "key1", "key2" })
    public void m2(String key1, String key2) throws Exception {
        System.out.println(key1 + ", " + key2);
    }
}

Todos 12 comentários

Não, você deve usar @DataProvider para isso.

@cbeust , o desafio com @DataProvider é que ele não pode ser definido em testng.xml? A razão para passar este parâmetro é que os dados para o método vêm de um banco de dados e este parâmetro é a chave primária. Eu quero usar essa chave, buscar dados, criar um objeto de dados para o método em tempo de execução usando reflexão. Então, resumindo, mesmo que eu use um DataProvider, tenho que passar um valor em tempo de execução para ele, para indicar qual conjunto de linhas ele deve pegar no banco de dados. Observe que isso é para um cenário com uso programático de testng.

Você pode definir uma quantidade limitada de parâmetros em seu testng.xml :

http://testng.org/doc/documentation-main.html#parameters -testng-xml

Cédric

Em segunda-feira, 12 de outubro de 2015 às 21:03, JayVem [email protected] escreveu:

@cbeust https://github.com/cbeust , o desafio com @DataProvider é
que não pode ser definido a partir de testng.xml? A razão para passar este
parâmetro, é que os dados para o método vem de um banco de dados e isso
parâmetro é a chave primária. Eu quero usar esta chave, buscar dados, criar um
dataobject para o método em tempo de execução usando reflexão. Então, resumindo, mesmo
se eu usar um DataProvider, eu tenho que passar um valor em tempo de execução para ele, para
indicar qual conjunto de linhas ele deve escolher do banco de dados. Por favor, note que este
é para um cenário com uso programático de testng.


Responda a este e-mail diretamente ou visualize-o no GitHub
https://github.com/cbeust/testng/issues/823#issuecomment -147592710.

@cbeust Esses parâmetros não estão no nível da suíte? E se eu quisesse criar um tipo de dados complexo no nível do método. Por exemplo, considere este código...

public class EmployeeBenefitsCalculator {

    <strong i="7">@Test</strong>
    public void calculateBenefits(Employee employee) {
        //do something with employee here.
    }
}

O parâmetro Employee que está sendo enviado para o método calculateBenefits deve ser criado a partir do banco de dados. Como eu conseguiria isso? Gostaria de passar uma chave primária e dentro do método calculateBenefits, quero ler essa chave primária, buscar dados do db e criar um objeto empregado para essa execução de teste. Eu sei que parece complicado. Acho que é isso que estou procurando -

public class EmployeeBenefitsCalculator {

    <strong i="11">@Test</strong>
    public void calculateBenefits(Employee employee) {
        employee = DataStore.fetch("id_from_testng_xml");
    }
}

Como forneço parâmetros a um provedor de dados para um teste em tempo de execução? Quão fácil é criar esse comportamento alterando a fonte de teste?

Você pode misturar provedor de dados + parâmetros. Seu provedor de dados pegará a chave primária do parâmetro e criará seu objeto Employee + passará quaisquer outros atributos. Em seguida, seu método de teste usará o provedor de dados e seus atributos.
Fácil! ;)

@juherr Você poderia me dar um exemplo de como posso ter vários parâmetros no nível do método, cada um indo para um provedor de dados?

@juherr Para simplificar minha pergunta, estou gerando programaticamente um testng.xml. Agora, digamos que eu tenha um método modifyEmployee(Employee Employee). Preciso criar um xml de forma que esse método seja invocado 4 vezes, mas cada vez com um Employee diferente. Eu saberia a chave primária de cada um desses funcionários no momento da criação do testng.xml. Então, qual é a melhor maneira de alcançar o que estou tentando fazer?

Suponho que @DataProvider possa trabalhar com @Parameters , mas não tenho certeza (devo testá-lo um dia).
BTW, se eu entendi o que você quer, você pode apenas tentar parâmetros no nível de teste (parâmetros no nível do método não existem):

<suite>
<test name="Regression1">
<parameter name="param1" value="121" />
<parameter name="param2" value="1212" />
<groups>
    <run>
      <exclude name="brokenTests"  />
      <include name="checkinTests"  />
    </run>
  </groups>

  <classes>
    <class name="test.IndividualMethodsTest">
      <methods>
        <include name="testMethod"  />
      </methods>
    </class>
  </classes>
</test>

<test name="Regression2">
<parameter name="param1" value="454" />
<parameter name="param2" value="4545" />
<groups>
    <run>
      <exclude name="brokenTests"  />
      <include name="checkinTests"  />
    </run>
  </groups>

  <classes>
    <class name="test.IndividualMethodsTest">
      <methods>
        <include name="testMethod"  />
      </methods>
    </class>
  </classes>
</test>
<suite>

Você deve fazer sua pergunta no Staskoverflow ou na lista de discussão se quiser mais ideias ;)

Na verdade, existem parâmetros no nível do método. Aqui está um exemplo:

<suite name="my-suite" verbose="1">
    <test name="my-test">
        <classes>
            <class name="testng.ex1.TestParams">
                <methods>
                    <include name="m1">
                        <parameter name="key1"  value="val1"/>
                        <parameter name="key2"  value="val2"/>
                    </include>
                    <include name="m2">
                        <parameter name="key1"  value="valA"/>
                        <parameter name="key2"  value="valB"/>
                    </include>
                </methods>
            </class>
        </classes>
    </test>
</suite>
package testng.ex1;

import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

public class TestParams {

    <strong i="8">@Test</strong>
    @Parameters({ "key1", "key2" })
    public void m1(String key1, String key2) throws Exception {
        System.out.println(key1 + ", " + key2);
    }

    <strong i="9">@Test</strong>
    @Parameters({ "key1", "key2" })
    public void m2(String key1, String key2) throws Exception {
        System.out.println(key1 + ", " + key2);
    }
}

:+1: Bom saber! Eu nunca vi isso antes.

@JayVem Eu encerro o problema, pois ele já existe.

outra abordagem é usar um provedor de dados que busca as chaves de testng.xml. Consultar exemplo:

<suite name="my-suite" verbose="1">
    <test name="my-test">
        <classes>
            <parameter name="keys" value="key1,key2,key3,key4" />
            <class name="testng.ex2.TestParams" />
        </classes>
    </test>
</suite>
package testng.ex2;

import java.util.Arrays;
import java.util.List;

import org.testng.ITestContext;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

public class TestParams {

    @Test(dataProvider = "dp")
    public void m1(Employee e) throws Exception {
        System.out.println("name: " + e.getName() + ", age: " + e.getAge());
    }

    @DataProvider(name = "dp")
    @Parameters("keys")
    public Object[][] createData(ITestContext ctx) {
        String keysString = ctx.getCurrentXmlTest().getLocalParameters().get("keys");
        List<String> keys = Arrays.asList(keysString.split(","));

        Object[][] result = new Object[keys.size()][1];
        for (int i = 0; i < keys.size(); i++) {
            String key = keys.get(i);
            result[i] = new Object[] { new Employee(key) };
        }
        return result;
    }
}

package testng.ex2;

public class Employee {

    private final String name;
    private final int age;

    public Employee(String key) {
        // use 'key' to lookup employee in database
        name = key + "_name"; // dummy value
        age = 41; // dummy value
    }

    String getName() {
        return name;
    }

    int getAge() {
        return age;
    }
}

Obrigado @drapostolos , acho que dataprovider com testcontext parece que vai funcionar. Eu vou tentar isso. Muito obrigado pela resposta rápida!

Esta página foi útil?
0 / 5 - 0 avaliações