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?
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.
Comentários muito úteis
Seria muito útil eu tenho as mesmas necessidades