2017-01-09 4 views
0

Я запускаю свою тестовую среду selenium с помощью файла testng.xml. Когда я запускаю тесты в testng.xml параллельно (разные браузеры), процент пропусков очень меньше, т. Е. 80%, но когда я запускаю testng.xml, процент прохода превышает 95. Может кто-нибудь сказать мне, почему он мог так ли?TestNg Результат параллельного выполнения показывает меньший процент пропуска в сравнении с обычным выполнением

+3

Возможно, из-за [Условия гонки] (https://en.wikipedia.org/wiki/Race_condition) - Я голосую, чтобы закрыть этот вопрос, поскольку он слишком широк. – Augusto

+0

@ Jim - информация, которую вы предоставили, очень мало. Его недостаточно для отладки, чтобы понять, в чем проблема. Итак, вот некоторые вопросы, на которые вы могли бы добавить ответы (отредактировав свой вопрос). 1. Всегда ли те же тесты, которые не выполняются? 2. Какова природа сбоев? Являются ли они подлинными неудачами приложений (или), они связаны с не найденным элементом и т. Д., Которые вы считаете ложными тревогами. 3. Как выглядит ваш экземпляр браузера? Можете ли вы показать код? –

+0

Отвечая на ваши вопросы 1. Всегда ли те же тесты, которые не выполняются? - нет, это не то же самое испытание, которое терпит неудачу. 2. Какова природа сбоев? - Являются ли они подлинными неудачами приложения (или), они связаны с не найденным элементом и т. Д., Которые вы считаете ложными тревогами. - Все связаны с элементом, не найденным исключением, при работе в обычном режиме ошибок не возникает. 3. Как выглядит ваш экземпляр браузера? Можете ли вы показать код? - Я использую до метода для создания экземпляра моего драйвера. В настоящее время используют Firefox и Chrome.Я вызываю браузерную информацию из Testng xml в качестве параметра на @ beforemethod – Dani

ответ

1

Просьба внести следующие изменения в свой код, после чего ваши проблемы, связанные с параллелизмом, должны исчезнуть.

В вашей BrowserHandler:

  • В getDriver(String browsername) добавить WebDriver driver = null в первой строке (Мы объявляем WebDriver быть локальной переменной в настоящее время)
  • Удалить элемент protected WebDriver driver=null; данных и вместо того, чтобы включать в себя локальный вариант резьбы: private static ThreadLocal<WebDriver> driver = new ThreadLocal<>();
  • Добавить новый метод, как показано ниже:

public static WebDriver getDriver() { return driver.get(); }

public static void setDriver(WebDriver localDriver) { driver.set(localDriver); }

В вашей BaseClass:

  • В методе launch_App() изменения getDriver(browsername); к setDriver(getDriver(browsername));
  • В способе afterMethod(ITestResult result) изменить driver.quit(); на getDriver().quit().
  • В методе afterMethod(ITestResult result) добавить дополнительную строку setDriver(null); после заявления getDriver().quit();

Теперь через вне вашего тестового кода, всякий раз, когда вам нужно получить доступ к WebDriver вы должны использовать getDriver() [Я предполагаю, что все ваши классы тестов будут распространяться на BaseClass (который снова распространяется на BrowserHandler)]

Чтобы узнать больше о ThreadLocal, пожалуйста, обратитесь к here.

+0

Я также использую фабрику страниц. как передать ссылку на драйвер в классе фабрики страниц, т. е. в конструкторе, созданном в классе фабрики страниц. – Dani

+0

Пока вы вызываете PageFactory.initElements() из метода @Test, вы все равно можете вызвать getDriver(), чтобы получить к нему доступ. –

+0

Как я уже сказал, вам нужно убедиться, что все вызовы происходят в методе Test, потому что BeforeMethod> Test> AfterMethod будет выполняться в одном потоке, и именно так вы сможете получить доступ к webdriver, установленному в текущем контекст потока. Также, если мой ответ вам поможет, пожалуйста, примите его. –

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

  • Нет связанных вопросов^_^