Mobile Automation - Тестирование нестатического драйвера. Метод TakeScreenshot выдает ошибку NPE с параллельными потоками. - PullRequest
0 голосов
/ 15 апреля 2019

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

У меня есть 2 класса тестирования Android и 2 класса тестирования iOS. И Android, и iOS имеют собственную базовую программу для инициализации драйвера Android / iOS (объявлена ​​как нестатическая). Тестовые классы вызывают базовую программу для инициализации драйвера (как this.driver = .initiaze ()) для параллельного запуска всех 4 тестовых классов.

У меня есть 2 отдельных слушателя (чтобы сделать скриншот при сбое), один для Android и один для iOS. Когда какой-либо тест завершается неудачей, программа-слушатель вызывает (android listener вызывает android base, а ios вызывает ios base), метод базовых программ получает метод снимка экрана, который затем завершается с ошибкой NPE.

Ниже приведен пример кода для ссылки.

(Примечание: если я определяю драйвер как открытый статический в базовой программе, то ошибка NPE исчезает, но параллельный запуск завершается ошибкой со случайной ошибкой, поскольку драйвер одного класса используется другим классом)

База Android: (аналог кода для iOS Base с типом возврата как IOSDriver)

g_MobileBase.java:

public class g_MobileBase {

    @SuppressWarnings("rawtypes")

    public  AndroidDriver driver=null;

    public DesiredCapabilities cap;

    @SuppressWarnings("rawtypes")
    public AndroidDriver InitializeDriver() throws IOException
    {//initialization code; return driver;
        }
        public void getScreenshot(String classname, String testname) throws IOException
    {
        File src = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
        FileUtils.copyFile(src,new File(System.getProperty("user.dir")+"\\ErrorSnapshots\\"+classname+"_"+testname+"_"+new SimpleDateFormat("yyyy-MM-dd hh-mm-ss").format(new Date())+".png"));
    }
}

Тестовый класс Android № 1:

public class G_SearchStore_LocOff extends g_MobileBase{


    @BeforeTest (description="Initialize driver and install application")

    public void Initialize() throws IOException
    {

        this.driver = InitializeDriver();
//remaining code

}

@AfterTest (description="Close application and Quit driver")
    public void finish()
    {

        driver.closeApp();

        driver.quit();
}

@Test
.................some methods
.................some methods

}

Прослушиватель Android: (аналогичен для прослушивателя iOS только для создания объекта базовой программы ios)

public class g_testListener implements ITestListener{

g_MobileBase b = new g_MobileBase();

@Override
    public void onTestFailure(ITestResult result) {
        // TODO Auto-generated method stub

        String[] temp = result.getInstanceName().toString().split("\\.");
        String classname = temp[1];

        try {

            b.getScreenshot(classname,result.getName());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();

}

1 Ответ

0 голосов
/ 17 апреля 2019

Проблема заключается в вашем тестовом коде.

TestNG по функциональности вызывает @BeforeTest только один раз для <test> тега. Таким образом, если в вашем теге <test> имеется более одного тестового класса, который пытается использовать экземпляр веб-драйвера, и если этот экземпляр веб-драйвера инициализируется с помощью метода @BeforeTest, то для второго экземпляра экземпляр веб-драйвера будет нулевым.

Чтобы обойти эту проблему, замените аннотацию @BeforeTest на аннотацию @BeforeClass.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...