【问题标题】:TestNG parallel execution behavior doesn't match the expected oneTestNG 并行执行行为与预期不符
【发布时间】:2016-04-18 09:01:12
【问题描述】:

我目前面临一个我无法识别的问题。

我正在尝试使用 testNG 并行运行测试。并行运行不同的测试没有问题,但是当我尝试在不同的线程中多次运行单个测试时,我有一个奇怪的行为。

所以,我尝试调试以找出问题所在。当我尝试从 TestNG XML 配置文件中获取值时发生错误:

public class LocalWebDriverListener implements IInvokedMethodListener {

    static Logger log = Logger.getLogger(LocalWebDriverListener.class);

    public void beforeInvocation(IInvokedMethod method, ITestResult testResult) {
        log.debug("BEGINNING: LocalWebDriverListener.beforeInvocation");
        if (method.isTestMethod()) {
            //Error on this line
            String browserName = method.getTestMethod().getXmlTest().getLocalParameters().get("browserName");
            //getXmlTest() returns null
            WebDriver driver = LocalDriverFactory.createInstance(browserName);
            DriverManager.setWebDriver(driver);
        } else {
            log.warn("Not a TestNG test");
        }
        log.debug("END: LocalWebDriverListener.beforeInvocation");
    }
}

我不明白为什么 getXmlTest() 只有在 @Test 参数中的 threadPoolSize > 1 时才返回 null。

public class TestClass {

    static Logger log = Logger.getLogger(TestClass.class);

    @Test(invocationCount = 5, threadPoolSize = 5)
    public void testMethod1() {
        invokeBrowser("http://www.google.com/");
    }
}

XML:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Test executed using WebDriver" parallel="tests" thread-count="5">
    <listeners>
        <listener class-name="my.organization.WebDriverListener" />
    </listeners>
    <test name="Tests run in Chrome">
        <parameter name="browserName" value="chrome" />
        <packages>
            <package name="my.organization.tests" />
        </packages>
    </test>
</suite>

你能帮我解决这个问题吗?

谢谢

【问题讨论】:

  • 嗯...不能使用TestNG的@Test注解提供的内置机制吗?还是你已经在用了?
  • 我编辑了这个问题。我正在使用内置机制,但我必须从 TestNG XML 配置中获取一个值(如果我的 TheadPoolSize 没有大于 1,那么它就可以工作)
  • 您不能使用@BeforeClass 来设置参数,并在您的测试方法中使用它吗?
  • 我不太确定如何轻松做到这一点。我使用了 getXmlTest().getLocalParameters().get("browserName");避免自己写这个。用不上的话,我就换个方式获取这些参数
  • 好吧,老实说,我从不使用 XML 来配置我的测试,所以... :)

标签: java testng


【解决方案1】:

问题是 IInvokedMethod 不知道 testng.xml 代替 String browserName = method.getTestMethod().getXmlTest().getLocalParameters().get("browserName");String browserName = testResult.getTestContext().getCurrentXmlTest().getLocalParameters().get("browserName");

【讨论】:

  • 它实际上工作得很好。为什么 IInvokedMethod 在这种情况下不知道 XML,当我不尝试并行运行相同的方法时,它知道 XML?
  • 当您以编程方式创建 xml 套件并从代码中定义 XMLSuite 值时,这似乎是一个错误或使用了此功能。
  • 我已经为此案提出了issue
  • method.getTestMethod().getTestClass().getXmlTest() 也可以并行工作
  • 哦,这很有趣。我要测试一下
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-08
  • 2020-03-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-01
相关资源
最近更新 更多