Хорошо, поэтому у меня есть класс, подобный этому
public class Calculator {
@Test(dataProvider = "dp")
public void add(int a, int b) {
System.out.println("Invoked add: a, b" + a + "," + b);
}
@DataProvider(name = "dp")
public Object[][] createData(ITestContext ctx) {
return new Object[][] { new Object[] { 1, 2 }, new Object[] { 2, 3 } };
}
Когда при запуске теста он будет запускать метод добавления дважды. Я хочу отслеживать каждый вызов, добавляемый уникально на основе его ввода. Так сказать, add вызывается с 1,2 в качестве ввода, а затем уникальным вызовом. Если это не удается, я хочу сохранить эту информацию в базе данных с идентификатором вызова.
Как достичь этого с помощью testng? Все слушатели (methodinvocationlistener и т.д.), Похоже, не предоставляют контекст, который однозначно идентифицирует прогон метода. Да, они позволяют вам видеть параметры, но я не могу отслеживать отдельные параметры. Итак, каким-то образом я ввожу свой собственный уникальный параметр в объект результата и отслеживаю его там?
UPDATE
Я добавляю улучшенный код, чтобы лучше понять контекст. Это мой testng.xml
<suite name="Default Suite">
<test name="test">
<classes>
<class name="com.test.testng.Calculator">
<methods>
<include name="add">
<parameter name="data-id" value="1"/>
</include> <!-- add -->
<include name="add">
<parameter name="data-id" value="2"/>
</include> <!-- add -->
<include name="subtract">
<parameter name="data-id" value="3"/>
</include> <!-- subtract -->
</methods>
</class> <!-- com.test.testng.Calculator -->
</classes>
</test> <!-- test -->
</suite> <!-- Default Suite -->
У меня есть два вызова add и один вызов вычитания. Здесь мой поставщик данных
public class Calculator {
@Test(dataProvider = "dp")
public void add(int first, int second) {
System.out.println("invoked add");
}
@Test(dataProvider = "dp")
public void subtract(int first, int second) {
System.out.println("invoked subtract");
}
@DataProvider(name = "dp")
public Object[][] createData(Method m, ITestContext ctx) {
Object[][] data = new Object[][] { new Object[] { 1, 2 }, new Object[] { 2, 3 }, new Object[] { 3, 4 } };
for (XmlClass test : ctx.getCurrentXmlTest().getXmlClasses()) {
for (XmlInclude method : test.getIncludedMethods()) {
if (method.getName().equals(m.getName()))
int key = Integer.parseInt(method.getAllParameters().get("data-id"));
return new Object[][] { data[key - 1] };
}
}
return null ;
}
}
Я ожидал, добавьте для запуска дважды, один раз с 1,2 в качестве входных данных, а другой раз с 2,3 в качестве ввода. Аналогично, вычитайте с 3,4 в качестве входных данных. Но, что я увидел, это -
[SuiteRunner] Created 1 TestRunners
[TestRunner] Running test test on 1 classes, included groups:[] excluded groups:[]
===== Test class
com.test.testng.Calculator
@Test Calculator.add(int, int)[pri:0, instance:[email protected]]
@Test Calculator.subtract(int, int)[pri:0, instance:[email protected]]
======
method.getAllParamas(){data-id=1}
[Invoker 665576141] Invoking com.test.testng.Calculator.add
invoked
[Invoker 665576141] Invoking com.test.testng.Calculator.subtract
subtract
===== Invoked methods
Calculator.add(int, int)[pri:0, instance:[email protected]]1 2 966808741
Calculator.subtract(int, int)[pri:0, instance:[email protected]]1 2 966808741
=====
Мне нужно предоставить данные для каждого метода на основе специального параметра, который я собираюсь отправить из testng xml. Как достичь этого?