当我们使用TestNG数据提供程序而不是工厂时,ITest工作吗

当我们使用TestNG数据提供程序而不是工厂时,ITest工作吗,testng,testng-dataprovider,Testng,Testng Dataprovider,我正试图使用ITest接口从数据提供商处获取Jenkins报告的自定义名称,以供我的测试使用。我尝试了下面这样的示例程序,以了解TestNG在什么时候调用gettestname方法 粘贴输出和程序 正如您在下面看到的,输出是令人困惑的,有些地方的测试名称也是“null”。所以我的问题是Itest是否设计用于数据提供者?另外,当我们使用parallel=true运行下面的dataprovider时,它会变得更加混乱,因为成员“testName”是跨线程共享的,并且只有一个类实例在运行 我可以看到I

我正试图使用ITest接口从数据提供商处获取Jenkins报告的自定义名称,以供我的测试使用。我尝试了下面这样的示例程序,以了解TestNG在什么时候调用gettestname方法

粘贴输出和程序

正如您在下面看到的,输出是令人困惑的,有些地方的测试名称也是“null”。所以我的问题是Itest是否设计用于数据提供者?另外,当我们使用parallel=true运行下面的dataprovider时,它会变得更加混乱,因为成员“testName”是跨线程共享的,并且只有一个类实例在运行

我可以看到ITest如何与@factory一起使用,因为当我们使用factories时,每个testmethod运行都会调用一个新的TestClass,所以这不会是一个问题

输出:

TestNGThreadingTest:31 - DataProvider running on Thread id = 1
TestNGThreadingTest:53 - GetTestname Method Thread id = 1 TestName = null
TestNGThreadingTest:43 - Before Method Thread id = 1 TestName = test1
TestNGThreadingTest:53 - GetTestname Method Thread id = 1 TestName = test1
TestNGThreadingTest:37 - Run Method Thread id = 1 TestName = test1
TestNGThreadingTest:53 - GetTestname Method Thread id = 1 TestName = test1
TestNGThreadingTest:48 - After Method Thread id = 1 TestName = test1
TestNGThreadingTest:53 - GetTestname Method Thread id = 1 TestName = test1
TestNGThreadingTest:43 - Before Method Thread id = 1 TestName = test2
TestNGThreadingTest:53 - GetTestname Method Thread id = 1 TestName = test2
TestNGThreadingTest:37 - Run Method Thread id = 1 TestName = test2
TestNGThreadingTest:53 - GetTestname Method Thread id = 1 TestName = test2
TestNGThreadingTest:48 - After Method Thread id = 1 TestName = test2
TestNGThreadingTest:53 - GetTestname Method Thread id = 1 TestName = test2
TestNGThreadingTest:43 - Before Method Thread id = 1 TestName = test3
TestNGThreadingTest:53 - GetTestname Method Thread id = 1 TestName = test3
TestNGThreadingTest:37 - Run Method Thread id = 1 TestName = test3
TestNGThreadingTest:53 - GetTestname Method Thread id = 1 TestName = test3
TestNGThreadingTest:48 - After Method Thread id = 1 TestName = test3
TestNGThreadingTest:53 - GetTestname Method Thread id = 1 TestName = test3
TestNGThreadingTest:43 - Before Method Thread id = 1 TestName = test4
TestNGThreadingTest:53 - GetTestname Method Thread id = 1 TestName = test4
TestNGThreadingTest:37 - Run Method Thread id = 1 TestName = test4
TestNGThreadingTest:53 - GetTestname Method Thread id = 1 TestName = test4
TestNGThreadingTest:48 - After Method Thread id = 1 TestName = test4
TestNGThreadingTest:53 - GetTestname Method Thread id = 1 TestName = test4
TestNGThreadingTest:43 - Before Method Thread id = 1 TestName = test5
TestNGThreadingTest:53 - GetTestname Method Thread id = 1 TestName = test5
TestNGThreadingTest:37 - Run Method Thread id = 1 TestName = test5
TestNGThreadingTest:53 - GetTestname Method Thread id = 1 TestName = test5
TestNGThreadingTest:48 - After Method Thread id = 1 TestName = test5
TestNGThreadingTest:53 - GetTestname Method Thread id = 1 TestName = test5
TestNGThreadingTest:53 - GetTestname Method Thread id = 1 TestName = test5
TestNGThreadingTest:53 - GetTestname Method Thread id = 1 TestName = test5
TestNGThreadingTest:53 - GetTestname Method Thread id = 1 TestName = test5
TestNGThreadingTest:53 - GetTestname Method Thread id = 1 TestName = test5
PASSED: test1("test1")
PASSED: test2("test2")
PASSED: test3("test3")
PASSED: test4("test4")
PASSED: test5("test5")
输出[当parallel=true时]

TestNGThreadingTest:31 - DataProvider running on Thread id = 1
TestNGThreadingTest:53 - GetTestname Method Thread id = 9 TestName = null
TestNGThreadingTest:53 - GetTestname Method Thread id = 11 TestName = null
TestNGThreadingTest:53 - GetTestname Method Thread id = 10 TestName = null
TestNGThreadingTest:53 - GetTestname Method Thread id = 13 TestName = null
TestNGThreadingTest:53 - GetTestname Method Thread id = 12 TestName = null
TestNGThreadingTest:43 - Before Method Thread id = 11 TestName = test3
TestNGThreadingTest:43 - Before Method Thread id = 13 TestName = test5
TestNGThreadingTest:43 - Before Method Thread id = 9 TestName = test1
TestNGThreadingTest:43 - Before Method Thread id = 12 TestName = test4
TestNGThreadingTest:43 - Before Method Thread id = 10 TestName = test2
TestNGThreadingTest:53 - GetTestname Method Thread id = 12 TestName = test2
TestNGThreadingTest:53 - GetTestname Method Thread id = 9 TestName = test2
TestNGThreadingTest:53 - GetTestname Method Thread id = 13 TestName = test2
TestNGThreadingTest:53 - GetTestname Method Thread id = 11 TestName = test2
TestNGThreadingTest:53 - GetTestname Method Thread id = 10 TestName = test2
TestNGThreadingTest:37 - Run Method Thread id = 11 TestName = test3
TestNGThreadingTest:37 - Run Method Thread id = 12 TestName = test4
TestNGThreadingTest:37 - Run Method Thread id = 9 TestName = test1
TestNGThreadingTest:37 - Run Method Thread id = 10 TestName = test2
TestNGThreadingTest:37 - Run Method Thread id = 13 TestName = test5
TestNGThreadingTest:53 - GetTestname Method Thread id = 12 TestName = test2
TestNGThreadingTest:53 - GetTestname Method Thread id = 11 TestName = test2
TestNGThreadingTest:53 - GetTestname Method Thread id = 9 TestName = test2
TestNGThreadingTest:53 - GetTestname Method Thread id = 10 TestName = test2
TestNGThreadingTest:48 - After Method Thread id = 12 TestName = test4
TestNGThreadingTest:48 - After Method Thread id = 10 TestName = test2
TestNGThreadingTest:48 - After Method Thread id = 9 TestName = test1
TestNGThreadingTest:53 - GetTestname Method Thread id = 13 TestName = test2
TestNGThreadingTest:48 - After Method Thread id = 11 TestName = test3
TestNGThreadingTest:48 - After Method Thread id = 13 TestName = test5
TestNGThreadingTest:53 - GetTestname Method Thread id = 1 TestName = test2
TestNGThreadingTest:53 - GetTestname Method Thread id = 1 TestName = test2
TestNGThreadingTest:53 - GetTestname Method Thread id = 1 TestName = test2
TestNGThreadingTest:53 - GetTestname Method Thread id = 1 TestName = test2
TestNGThreadingTest:53 - GetTestname Method Thread id = 1 TestName = test2
PASSED: test2("test3")
PASSED: test2("test4")
PASSED: test2("test1")
PASSED: test2("test2")
PASSED: test2("test5")
代码:


这是一个一致性问题,也许是一个测试问题

通过ThreadLocal testName=new ThreadLocal重新放置字符串testName可以解决您的问题


或者您也可以使用链接到@DataProvider的@Factory,但是@Factory。

我在这里没有看到任何问题。预期的行为是什么?我的问题是我们是否可以使用这个ITest特性,即提供自定义名称和数据提供程序?……我可以理解它们与@factory一起正常工作,因为对于每个条目,都使用了一个新的测试类实例。我还看到在初始化测试名称的before方法之前调用了gettestname。在aftermethod之前还有一些额外的调用…TestNG确切地使用哪些调用来确定测试的名称?您的输出告诉我们ITest正在使用数据提供程序:PASSED:test1test1。如果没有ITest,显示将不一样。啊,我的坏…但是我在dataprovider注释中使用parallel=true运行,结果不同。我用输出更新了问题部分。好的,我看到问题了。但是现在,我们需要所有的输出来查看testng何时调用what;棒极了,它的工作和感谢其他信息!
public class TestNGThreadingTest implements ITest {

public String testName;

final static Logger logger = Logger.getLogger(TestNGThreadingTest.class);

@DataProvider(name="dp")
public Iterator<Object[]> getTests() {
    Collection<Object[]> tests = new ArrayList<Object[]>();

    tests.add(new Object[]{"test1"});
    tests.add(new Object[]{"test2"});
    tests.add(new Object[]{"test3"});
    tests.add(new Object[]{"test4"});
    tests.add(new Object[]{"test5"});

    logger.info("DataProvider running on Thread id = " + Thread.currentThread().getId());
    return tests.iterator();
}

@Test(dataProvider="dp")
public void run(String testName) {
    logger.info("Run Method Thread id = " + Thread.currentThread().getId() + " TestName = "+ testName );
}

@BeforeMethod
public void init(Object[] testArgs) {
    this.testName = (String) testArgs[0];
    logger.info("Before Method Thread id = " + Thread.currentThread().getId() + " TestName = " + testArgs[0]);
}

@AfterMethod
public void tearDown(Object[] testArgs) {
    logger.info("After Method Thread id = " + Thread.currentThread().getId() + " TestName = " + testArgs[0]);
}

@Override
public String getTestName() {
    logger.info("GetTestname Method Thread id = " + Thread.currentThread().getId() + " TestName = " + testName);
    return testName;
}

}