2015-07-21 3 views
0

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

+0

Непонятный. Вы хотите иметь один экземпляр браузера или нет? если тогда что вы хотите сделать в сетке? Вы используете сетку для запуска нескольких isntances на нескольких узлах. – Shamik

+0

Вы не используете TestNg правильно. Просто используйте testng.xml для параллельного запуска тестов, и нет необходимости делиться одним и тем же объектом или, в этом случае, наследовать классы. – Manu

ответ

2

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

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

+0

Спасибо Vishal, но это не решение. Я знаю, что код должен быть написан таким образом, чтобы он не делил ресурс (т. Е. Статическая переменная). Мне нужен способ технической реализации. Я реализовал параметры, проходящие через один класс к другому, но таким образом я должен передать объект через java-код, я не могу это сделать только с помощью testng. Если вы знаете способ, попросите вас поделиться этим. –

1

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

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

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

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> 

Это отлично работает для меня селеном сетки параллельно и в обычном режиме.

0

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

0

У меня возникла аналогичная проблема. Вот что я сделал.

Предположения: Скажем, тесты класса 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"); 
} 

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

Смежные вопросы