Testng: Adicionar uma API para injeção de parâmetro de método de teste personalizado

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

Preciso de uma maneira de injetar um parâmetro personalizado nos métodos de teste do TestNG. O parâmetro é meu próprio objeto construído dinamicamente no tempo de execução a partir das anotações do método de teste . O parâmetro personalizado não é conhecido pelo TestNG, é meu próprio tipo, por exemplo:

@com.mypackage.MyAnnotation("someValue)"
@org.testng.Test
public void test(MyCustomObject val) {
    ...
}

Parece que agora não consigo fazer isso facilmente.

Podemos adicionar essa funcionalidade / SPI? Qual é a maneira mais fácil de conseguir isso atualmente?

injection Feature request

Comentários muito úteis

Seria muito útil eu tenho as mesmas necessidades

Todos 12 comentários

Não quero usar a anotação @DataProvider .

Por que você não quer usar @DataProvider , é de longe a abordagem mais fácil
(apenas algumas linhas de código).

Cédric

Na terça - feira, 3 de março de 2015 às 6h09, Crazyjavahacking
escreveu:

_Eu não quero usar a anotação @DataProvider._

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

O problema é que o objeto que desejo injetar é criado dinamicamente com base nos dados das anotações no método de teste.

No meu exemplo inicial, preciso analisar o conteúdo de @MyAnnotation e, com base nisso, criar uma instância de MyCustomObject .

O que está impedindo você de fazer tudo isso no provedor de dados?

Cédric

Na terça - feira, 3 de março de 2015 às 15:12, Crazyjavahacking
escreveu:

O problema é que o objeto que desejo injetar é criado dinamicamente
com base nos dados dentro das anotações no método de teste.

No meu exemplo inicial, preciso analisar o conteúdo de @MyAnnotation e
com base nisso, preciso criar uma instância de MyCustomObject.

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

A funcionalidade não é realmente um teste parametrizado e também não quero usar provedores de dados, por exemplo:

@Columns("col1 | col2 || val)"
<strong i="6">@Rows</strong>  ({"a    | b    || c",
         "d    | e    || f})
@org.testng.Test
public void test1(MyCustomObject val) {
    // MyCustomerObject is created from the annotation values
    // some menipulation with val ...
}

@Columns("col1 | col2 || val)"
<strong i="7">@Rows</strong>  ({"1    | 2    || a",
         "3    | 3    || b})
@org.testng.Test
public void test1(MyCustomObject val) {
    // MyCustomerObject is created from the annotation values
    // some menipulation with val ...
}

então não acho que os provedores de dados sejam uma boa abordagem aqui

Seria muito útil eu tenho as mesmas necessidades

A ideia é interessante, mas como @cbeust disse há muito tempo, um provedor de dados é uma boa alternativa.
De acordo com a amostra anterior:

@Columns("col1 | col2 || val)")
@Rows(  {"a    | b    || c",
         "d    | e    || f"})
@Test(dataProvider = "dp")
public void test1(MyCustomObject val) {
    // MyCustomerObject is created from the annotation values
    // some menipulation with val ...
}

@Columns("col1 | col2 || val)"
@Rows(  {"1    | 2    || a",
         "3    | 3    || b"})
@Test(dataProvider = "dp")
public void test1(MyCustomObject val) {
    // MyCustomerObject is created from the annotation values
    // some menipulation with val ...
}

<strong i="8">@DataProvider</strong>
public static MyCustomObject[] dp(Method m) {
    Columns colums = m.getAnnotation(Columns.class);
    Rows rows = m.getAnnotation(Rows.class);
    MyCustomObject[] results = new MyCustomObject[rows.values().length];
    for (int i=0; i < rows.values().length; i++) {
        String value = rows.values()[i];
        // extract params with custom business
        results[i] = new MyCustomObject(/* params */);
    }
    return results;
}

isso é verdade @juherr , acabei fazendo assim. Mas, a única coisa que falta é a capacidade de definir um provedor de dados padrão para todos os testes, no meu caso, meu provedor de dados é genérico e passa apenas se houver certas anotações

Acho que uma combinação de dataProvider e adicionar a capacidade de definir um provedor padrão ou uma classe de provedor resolveria o problema e abrirá um buraco para novas possibilidades

@ g13013 Você quer dizer algo como

public class UseMyDataProvider implements IAnnotationTransformer {
  public void transform(ITest annotation, Class testClass, Constructor testConstructor, Method testMethod) {
    if (/* business logic (for example: testMethod has expected annotations) */) {
      annotation.setDataProviderClass(MyExternalClassWithDataProvider.class);
      annotation.setDataProvider("dataprovider name");
    }
  }
}

Eu também adoraria usar o Guice para injetar parâmetros em testes.
DataProvider + IAnnotationTransformer é uma solução alternativa interessante, mas falta flexibilidade (por exemplo, é impossível definir o IAnnotationTransformer via @Listeners)

é impossível definir o IAnnotationTransformer via @Listeners

@gjuillot Pode ser um pedido de recurso. Você poderia abrir um problema com isso?

Eu farei. Mas ainda assim, o melhor para mim seria ter a possibilidade de usar o Guice para injetar parâmetros em testes.

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