TestNG - параллельное выполнение теста, нулевой указатель WebDriver - PullRequest
0 голосов
/ 29 июня 2018

Я уверен, что это должно быть легко решить, но в данный момент мне ничего не приходит в голову, вот ситуация.

У меня есть один класс Singleton (DriverFactory.class) для установки и извлечения объекта ThreadLocal. Два тестовых класса, работающих параллельно (FirstTestClass), (SecondTestClass) и третий класс TestListenerAdapter с методом, в котором я хочу использовать действующий экземпляр WebDriver (он должен быть привязан к потоку), но здесь я получаю исключение нулевого указателя, даже если здесь указан код

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>

Консольный вывод

class testParallel.FirstTestClass THREAD ID: 22 Имя: TestNG

class testParallel.SecondTestClass Идентификатор резьбы: 23 Имя: TestNG

class testParallel.testSetup THREAD 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.invokeTestMethod (Invoker.java:901) в org.testng.internal.Invoker.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 (SuiteRunner.java:334) в org.testng.SuiteRunner.access $ 000 (SuiteRunner.java:37) в org.testng.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.java:617) at java.lang.Thread.run (Thread.java:745) ТЕКУЩИЙ URL : https://pl.wikipedia.org/wiki/Wikipedia:Strona_g%C5%82%C3%B3wna

1 Ответ

0 голосов
/ 30 июня 2018

В Listeners мы не можем напрямую получить доступ к другому экземпляру класса. Так как он начнет слушать, когда начинается выполнение. Если нам нужно получить какой-то конкретный экземпляр класса, то мы можем получить доступ через TestNG Listeners (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;

Класс испытаний 2:

public class SecondTestClass extends DriverFactory {

    WebDriver driver;
...