当前位置: 首页 > 知识库问答 >
问题:

TestNG-并行测试执行,WebDriver nullpointer

景俊良
2023-03-14
import config.DriverFactory;
import org.junit.Assert;
import org.testng.annotations.Test;
import org.openqa.selenium.WebDriver;

public class SecondTestClass {

    WebDriver driver;

    public SecondTestClass()throws Exception{
        DriverFactory.getInstance().setDriver();
        driver = DriverFactory.getInstance().getDriver();;
    }

    @Test
    public void testInSecondClass() {
        System.out.println("\n THREAD ID: " + Thread.currentThread().getId() + " " + "\n Name: " + Thread.currentThread().getName());
        driver.get("https://www.allsaints.com");
        System.out.println("CURRENT URL IS :" + driver.getCurrentUrl());

        Assert.assertTrue(false);

    }
}
package testParallel;

import config.DriverFactory;
import org.openqa.selenium.WebDriver;
import org.testng.annotations.Test;
public class FirstTestClass {

    WebDriver driver;

    public FirstTestClass()throws Exception{
        DriverFactory.getInstance().setDriver();
        driver = DriverFactory.getInstance().getDriver();;
    }

    @Test
    public void testInFirstClass() throws Exception{
        System.out.println("\n THREAD ID: " + Thread.currentThread().getId() + " " + "\n Name: " + Thread.currentThread().getName());
        DriverFactory.getInstance().setDriver();
        driver = DriverFactory.getInstance().getDriver();;
        driver.get("https://pl.wikipedia.org");
        System.out.println("CURRENT URL IS :" + driver.getCurrentUrl());
    }
}
package config;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

public class DriverFactory {

    private static DriverFactory instance = null;

    public ThreadLocal<WebDriver> webDriver = new ThreadLocal<WebDriver>();

    private DriverFactory() {}

    @SuppressWarnings("varargs")
    public static DriverFactory getInstance() {
        if (instance == null) {
            instance = new DriverFactory();
        }
        return instance;
    }

    public final void setDriver() throws Exception {
        System.setProperty("webdriver.gecko.driver", "E:\\Projects\\allsaints\\tess\\drivers\\geckodriver.exe");
        webDriver.set(new FirefoxDriver());
    }

    public WebDriver getDriver() throws Exception {
        return webDriver.get();
    }
}
import config.DriverFactory;
import org.openqa.selenium.WebDriver;
import org.testng.ITestResult;
import org.testng.TestListenerAdapter;

public class testSetup extends TestListenerAdapter {

    @Override
    public void onTestFailure(ITestResult tr) {
        System.out.println(
                "\n THREAD ID: " + Thread.currentThread().getId() + " " +
                        "\n Name: " + Thread.currentThread().getName()

        );
        WebDriver driver;
        try {
             driver = DriverFactory.getInstance().getDriver();
            System.out.println("CURRENT URL IS :" + driver.getCurrentUrl());

        } catch (Exception e) {
            e.printStackTrace();
        }
        super.onTestFailure(tr);
    }
}
<?xml version="1.0"?>
<suite name="All Test Suite" parallel="tests" thread-count="5">
    <listeners>
        <listener class-name="testParallel.testSetup"/>
    </listeners>
    <test verbose="3" preserve-order="true" name="test1">
        <classes>
            <class name="testParallel.FirstTestClass"/>
        </classes>
    </test>
    <test name="test2">
        <classes>
            <class name="testParallel.SecondTestClass"/>
        </classes>
    </test>
</suite>

类TestParallel.FirstTestClass线程ID:22名称:TestNG

类TestParallel.SecondTestClass线程ID:23名称:TestNG

类TestParallel.TestSetup线程ID:23名称:TestNG java.lang.NullPoInterException位于TestParallel.TestSetup.OnTestFailure(TestSetup.java:21)位于Org.TestNG.Internal.Invoker.RunTestListeners(Invoker.java:1895)位于Org.TestNG.Internal.Invoker.RunTestListeners(Invoker.java:1879)位于Org.TestNG.Internal.Invoker.InvokeMethod(Invoker.java:778)位于Org.TestNG.Internal.Invoker.InvokeMethod(Invoker.java:901)位于Org.TestNG.Internal.Invoker.InvokeMethod(Invoker.java InvokeTestMethods(invoker.java:1231)在org.TestNG.internal.testMethodworker.invokeTestMethods(testMethodworker.java:127)在org.TestNG.internal.testMethodworker.run(testMethodworker.java:111)在org.TestNG.testRunner.privaterun(testRunner.java:767)在org.TestNG.testRunner.run(testRunner.java:617)在org.TestNG.suiterunner.runtest(testRunner.java:334)在org.TestNG.suiterunner.access$000(suiterunner$suiteworker.run(suiterunner.java:368)在org.TestNG.internal.THREAD.threadutil$2。call(threadutil.java:64)在java.util.conCurrent.FutureTask.Run(FutureTask.java:266)在java.util.concurrent.ThreadPoolExecutor.RunWorker(ThreadPoolExecutor.java:1142)在java.util.concurrent.ThreadPoolExecutor$Worker.Run(ThreadPoolExecutor.617)在java.lang.Thread.Run(Thread.java:745)当前URL为:https://pl.wikipedia.org/wiki/wikipedia:strona_g%c5%82%c3%b3WNA

共有1个答案

杨和蔼
2023-03-14

在侦听器中,我们不能直接访问其他类实例。因为,它会在执行开始时启动listen。如果我们需要获得某个特定的类实例,那么我们可以通过TestNG监听器(itestresult)访问,如下所示,并且您的所有测试类都应该继承DriverFactory类。

侦听器类代码:

public class testSetup extends TestListenerAdapter {

    @Override
    public void onTestFailure(ITestResult tr) {
        System.out.println(
                "\n THREAD ID: " + Thread.currentThread().getId() + " " +
                        "\n Name: " + Thread.currentThread().getName()

        );

        Object currentClass=tr.getInstance();

        WebDriver driver;
        try {
             driver =((DriverFactory) currentClass).getDriver();
            System.out.println("CURRENT URL IS :" + driver.getCurrentUrl());

        } catch (Exception e) {
            e.printStackTrace();
        }
        super.onTestFailure(tr);
    }

}

测试类1:

public class FirstTestClass extends DriverFactory {

    WebDriver driver;
public class SecondTestClass extends DriverFactory {

    WebDriver driver;
 类似资料:
  • 我一个类有5到6个方法,想在不同的节点上并行运行方法,我有网格2设置,里面有4个节点。 下面是我的测试。xml 我有一个测试工具,它初始化了login、common和utils类 在我的测试类中,我扩展了测试工具,在@Beforemethod中,我调用了inilze方法 如果我运行测试,我会看到以下问题 两个浏览器在每个节点中打开一个,但只有一个浏览器启动应用程序,另一个不启动。 如果我遗漏了什么

  • 我试图用TestNG并行运行一个示例测试项目。但它是在一个线程中顺序执行的。我漏掉什么了吗? 谢了。

  • 我有4个@Test方法,希望每个方法都运行3次。我想在12个线程中同时执行所有这些。 我创建了一个testng。像这样的xml文件 如果我设置并行="方法",TestNG在Test1的4个线程中执行4个测试方法,之后对Test2执行相同的操作,然后对Test3执行相同的操作。但是我不想在运行Test2之前等待Test1完成。TestNG能够运行Test1、Test2 有没有办法告诉TestNG不要

  • 我试图在Eclipse中使用Selenium运行TestNG。 当类文件作为TestNG测试运行时,我得到的测试Run=0。 问题会是什么? 我有testNg插件 testng。xml文件: 类: WebDriverTest类: BrowserInstance类: 注: 当我将testing.xml文件作为TestNG Suite运行时,结果是: 当我运行. java文件作为TestNG测试时,结

  • 我有一个应用程序(使用注释的Spring 4 MVC Hibernate 4 MySQL Maven集成示例),使用基于注释的配置将Spring与Hibernate集成,但运行测试时出错! 上课时间到了 下面是即将到来的考验: 这是pom。xml文件: