TestNG, Selenium Как разделить объект между несколькими классами

Я выполняю свои тестовые примеры с помощью Selenium + TestNG. Мои тестовые примеры распределены по нескольким классам. Я хочу использовать одну и ту же копию webDriver с каждым классом. (Я не хочу каждый раз входить в систему, а затем выполнять другие операции, поэтому возможность вызова отдельного браузера для каждого класса пропала). Чтобы решить эту проблему, сейчас я использую наследование со статическим объектом webdriver. Но при использовании сетки селена в параллельном режиме она не работает, поскольку использует тот же объект. Не могли бы вы показать мне способ, которым я могу поделиться объектом с несколькими классами ИЛИ Для создания разных экземпляров static для каждого «теста» (это похоже на то, что я запускаю отдельную программу Java для каждого теста).


person Vinaykumar Patel    schedule 21.07.2015    source источник
comment
Не понятно. Вы хотите иметь один экземпляр браузера или нет? если тогда что вы хотите делать в сетке? Вы используете сетку для запуска нескольких isntance на нескольких узлах   -  person Shamik    schedule 21.07.2015
comment
Значит, вы неправильно используете TestNg. Просто используйте testng.xml для параллельного запуска тестов, и нет необходимости совместно использовать один и тот же объект или наследовать классы.   -  person Manu    schedule 22.07.2015


Ответы (4)


В настоящее время вы используете статическую ссылку на объект webdriver в различных классах / тестах. Итак, существует единственный экземпляр драйвера, который изменяет статические ресурсы в вашем коде. Но когда вы переходите к сетке, вы создаете разные экземпляры драйвера для каждого узла. Эти драйверы будут работать параллельно и будут обращаться к общим ресурсам (статическим переменным и т. Д.), Одновременно изменяя и отменяя изменения, сделанные другими экземплярами драйвера, что вызовет проблемы.

Напишите свой код так, чтобы ресурсы не использовались совместно (минимум статических). Попробуйте передать экземпляр драйвера в методы, чтобы убедиться, что требуемый драйвер выполняет только этот фрагмент кода.

person Vishal Jagtap    schedule 21.07.2015
comment
Спасибо, Вишал, но это не решение. Я знаю, что код должен быть написан таким образом, чтобы он не разделял ресурс (то есть статическую переменную). Мне нужен был способ технической реализации. Я реализовал передачу параметров через один класс в другой, но таким образом я должен передать объект через java-код, я не могу сделать это только через testng. Если вы знаете способ, прошу вас поделиться этим. - person Vinaykumar Patel; 21.07.2015

Вот как я реализовал решение.

У меня есть объект myObj, внутри которого есть объект webDriver и еще несколько вещей. Я создал статический массив статического объекта myObj. Это вот так

// некоторая часть класса, в которой реализован WebDriver. WebDriver, кстати, не статичен.

private static MyClass[] ObjectArr = new MyClass[100];

public static MyClass getInstance(Integer id){
    id = (id==null)? 0 : id;
    if(ObjectArr[id] == null){
        ObjectArr[id] = new MyClass();
    }  
    return ObjectArr[id];
}

Теперь, когда я хочу использовать это в своем классе testng, я делаю это так.

public class x{
MyClass i;

@BeforeClass
@Parameters("instanceId")
public void getInstance(@Optional String instanceId){
    i = MyClass.getInstance(Integer.parseInt(instanceId));
}
}

и вот как выглядит мой testng.xml.

<test name="FireFox" preserve-order="true">
    <parameter name="instanceId" value="1" />
    <parameter name="browser" value="firefox" />
    <classes>
        <class name="com.app.Login"/>
    </classes>
</test> 

<test name="Chrome" preserve-order="true">
    <parameter name="instanceId" value="2" />
    <parameter name="browser" value="chrome" />
    <classes>
        <class name="com.app.Login"/>
    </classes>
</test> 

This works perfectly for me for selenium grid in parallel and in normal way.

person Vinaykumar Patel    schedule 22.07.2015

Я столкнулся с подобной проблемой. Вот что я сделал.

Предположение: скажем, тесты класса B зависят от экземпляра класса A.

@AfterClass(alwaysRun = true)
public void insertValueIntoAttribute(ITestContext ctx) {
    ctx.setAttribute("INSTANCE_OF_A", this); // from inside class A tests
}

А затем в классе B я извлекаю этот экземпляр A и использую его.

@BeforeClass(alwaysRun=true)
@SuppressWarnings("unchecked")
public void fetchData(ITestContext ctx) {
    A a = (A) ctx.getAttribute("INSTANCE_OF_A");
}

Надеюсь, это кому-то поможет.

person Tyagi Akhilesh    schedule 13.12.2016

Мы боролись с подобной ситуацией при тестировании. Мы также хотели использовать распараллеливание TestNG вместе с веб-драйвером Selenium. К сожалению, управление жизненным циклом веб-драйвера в каждом тестовом классе или попытка использовать статический класс, содержащий веб-драйвер, неэффективны при включении любого из параллельных режимов TestNG. т.е. parallel="tests|classes|methods". Сопоставление тестируемых классов и методов с активным потоком TestNG и созданным экземпляром веб-драйвера было громоздким, когда он вообще работал. Мы тратили больше времени на выяснение жизненных циклов веб-драйверов, чем на тестирование реальных веб-приложений. Мы нашли способ получше. У нас есть проект с открытым исходным кодом, который абстрагируется от управления жизненным циклом веб-драйверов для тестирования TestNG / Selenium. Он должным образом поддерживает каждый из параллельных режимов TestNG, обеспечивая правильный и активный веб-драйвер для каждого тестируемого метода тестового класса. Это очень помогло нам в наших усилиях по тестированию. Возможно, это пригодится и вам. Или, если ничто другое не дает вам представления о том, как вы можете решить эту проблему по-другому. Проект завершен на GitHub как Concurrent Selenium TestNG (COSENG). С уважением.

person James Crocker    schedule 20.10.2016