Рубрики
Без рубрики

Начало работы с носом2 в Python [Учебник]

Нос2 – популярный тестовый бегун в Python, который может обнаружить тесты модуля в вашем проекте и выполнять … Помечено с Python, Selenium, учебником, тестированием.

Нос2 – популярный тестовый бегун в Python, который может обнаружить тесты модуля в вашем проекте и выполнять их. Если вы знакомы с Unittest – стандартной библиотекой Python и предпочитаете то же самое по сравнению с другими каркасами автоматизации тестирования в Python, то у вас должен быть краткий взгляд на нос2 Python.

Нозем2 Python основан на Unittest и добавляет больше ценности в рамках через его богатую экосистему плагинов. В простых терминах NOST2 – это расширение Unittest Module. Наш более ранний блог на Учебник для носа Selenium Python глубоко погрузился на более старую версию носа (1.3.7). Он все еще используется определенным процентом развития и тестируемого братства.

В этом блоге мы смотрим в рамку носа2, которая является преемником носа. К концу этого учебного пособия по носу Python вы были бы в удобном положении, чтобы использовать плагины в носу2, чтобы улучшить опыт тестирования Selenium Python для автоматизации тестирования Selenium.

Введение в носовую структуру

Нос2 – это преемник носа и был разработан для расширения междушек для облегчения процесса тестирования. Нос2 основан на ветви плагинов Unittest2.

По сравнению с носом и Unittest Nose2 обеспечивает лучший плагин API и упрощает внутренние интерфейсы и процессы. Есть много плагинов, которые встроенные в встроенные модуль носа2, и эти плагины загружены по умолчанию. Некоторые из Основные плагины, которые загружаются по умолчанию Помощь в параметризации тестов, организовав тестовые приспособления в слои, захватывающие сообщения журнала, предоставляя отчет о проведении охвата теста и многое другое.

По умолчанию NOSE2 не поддерживает параллельное исполнение теста, функция, которая широко используется в Тестирование автоматизации селена Отказ Тем не менее, плагины по загрузке не сложно в носу2, поскольку имена модулей плагина могут быть легко добавлены в список плагинов в разделе Config файла [Unittest]. Существует также возможность пройти модуль плагина с аргументом -Plugin в командной строке.

Следовательно, запущенные тесты параллельно с несколькими процессами с носом2 только в том, что включите плагин через любой из параметров, упомянутых ранее! Нос2 доступен на Github Отказ Вот еще подробнее о проекте на Github:

|. Форкс – 130 | Используется – 3.4K ||. Снялся – 674 | Участники – 61 ||. Релизы – 28 | Коммиты – 990 |

Как установить носовую структуру

Прежде чем мы начнем с этим учебником для носа Python, вам нужно установить рамки для носа2 в своих системах (если у вас его уже нет). Нос2 может быть установлен путем выполнения следующей команды на терминале.

Пип устанавливает нос2

Как видно на монтажном монтаже ниже, устанавливается версия носа 0,9.2.

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

from nose2. import 

Как выполнить нос2 Python Tests

Как нос2 отличается от носа, команда для запуска тестов в носу2 также отличается. Вот команда для выполнения тестов в носу2-

nose2 --verbose 

Например, если имя файла, которое содержит тесты носа2, является Test_noSe2_example.py, команда, используемая для выполнения тестов внутри, должна быть:

nose2 --verbose Test_Nose2_example

Тестовый бегун NOSE2 предлагает многочисленные варианты захвата журналов, отчетности и т. Д., которые могут использоваться, проходя то же самое на консоли при выполнении тестов:

Испытание открытия в носу2

Номенклатуру последовало для модулей (или файлов), и тестовые случаи, начиная с Test_, применим в носу2. Классы испытаний, которые охватывают методы испытаний, должны начинаться с теста.

Нос2 обеспечивает плагин, который реализует автоматическое обнаружение модуля тестирования. Плагин ищет модули (или тестовые файлы) в пакетах и каталогах, имена которых начинаются с теста. Затем он загорит зацеплением LoadTestSFROMOMEL () для всех открытий, позволяющих другим плагинам загружать фактические тесты. Вы можете найти более подробную информацию о Испытатель на основе открытия в носу2 доступен.

Пример использования носовой структуры

Чтобы продемонстрировать использование рамки NOSE2 в этом учебном пособии в носу Python, мы используем тот же пример, который был ранее использован в демонстрации носа, то есть поиск Google для Lambdatest и выполнение клика на первый результат теста.

import unittest
from selenium import webdriver
import time
from time import sleep
from selenium.webdriver.common.by import By

class ChromeSearch(unittest.TestCase):
    def test_search_lambdatest_chrome(self):
        self.driver = webdriver.Chrome()
        self.driver.get('https://www.google.com')
        self.driver.maximize_window()
        title = "Google"
        assert title == self.driver.title

        search_text = "LambdaTest"
        search_box = driver.find_element(By.XPATH, "//input[@name='q']")
        search_box.send_keys(search_text)

        # Using Sleep is not a good programming practice
        # Only used here for demonstration purpose
        time.sleep(5)
        search_box.submit()

        time.sleep(5)

        # Click on the LambdaTest HomePage Link
        title = "Most Powerful Cross Browser Testing Tool Online | LambdaTest"
        lt_link = driver.find_element(By.XPATH, "//h3[.='LambdaTest: Most Powerful Cross Browser Testing Tool Online']")
        lt_link.click()

        time.sleep(10)
        assert title == driver.title   
        time.sleep(2)

        # Release the resources in the teardown function
        print("TearDown initiated")
        driver.quit()

if __name__ == '__main__':
    import nose2
    nose2.main()

Реализация почти такая же, как тот, который мы могли бы использовать при использовании Unittest Module. Основная (еще необязательная) включение в том, что нос2.Main (). Он используется таким же образом, как Unittest.Main (), и цель – запускать тесты в одном модуле.

if __name__ == '__main__':
    import nose2
    nose2.main()

Параметризованные тесты в носу2 Python

В отличие от носа, которые требуют установки отдельного пакета (то есть для параметризованного носа) для тестовой параметризации, NOST2 Python поддерживает более виды параметризованных и генераторных испытаний, чем нос. Он поддерживает тестовые генераторы в тестовых классах, тестовых функциях и в подклассах Unittest Testcase.

Этот плагин реализует следующие функции для поддержки нагрузочных испытаний из параметризованных тестовых функций и методов:

Для параметризации функции или метода тестового корпуса NOSE2.tools.params () используется. Мы будем использовать то же самое в этом учебном пособии на носу Python.

nose2.tools.params(*paramList)

Параметры в списке могут быть простые значения или кортежи. Например, при выполнении тестирования Selenium Python (используя параметризацию) на локальной сетке SELENIUM, мы используем простые значения. С другой стороны, при выполнении автоматизации тестирования Selenium на области селена на основе облачного селена (например, лямбдатест), мы бы использовали кортежи (то есть комбинация браузера, браузер-версию и операционной системы) для параметризации тестирования.

Доступны дополнительные подробности о плагине для носа2 Python для параметризованных испытаний здесь Отказ

Мы портируем пример, используемый в Учебник для носа Selenium Python Если приложение Lambdatest Todo было протестировано на трех разных браузерах – Firefox, Microsoft Edge и Chrome.

  1. Перейдите к URL https://lambdatest.github.io/sample-todo-app/
  2. Выберите первые два флажка
  3. Отправить «счастливое тестирование на лямбдатест» на текстовое поле с
  4. Нажмите кнопку «Добавить» и убедитесь, был ли текст был добавлен или нет

Реализация

import unittest
from selenium import webdriver
import time
from time import sleep
from selenium.webdriver.common.by import By
# module for importing params functionality
from nose2.tools import params

class LT_Parameterized_local_test(unittest.TestCase):
    @params("Firefox", "Chrome", "MicrosoftEdge")
    def test_to_do_app(self, browserName):
        if (browserName == "Chrome"):
            print("Test on Chrome Browser initiated")
            self.driver = webdriver.Chrome()
        elif (browserName == "MicrosoftEdge"):
            print("Test on Edge Browser initiated")
            # Set the Path accordingly
            self.driver = webdriver.Edge("C:\\EdgeDriver\\MicrosoftWebDriver.exe")
        elif (browserName == "Firefox"):
            print("Test on Firefox initiated")
            self.driver = webdriver.Firefox()

        self.driver.get('https://lambdatest.github.io/sample-todo-app/')
        self.driver.maximize_window()
        self.driver.find_element(By.NAME, "li1").click()
        self.driver.find_element(By.NAME, "li2").click()

        title = "Sample page - lambdatest.com"
        assert title ==  self.driver.title

        sample_text = "Happy Testing at LambdaTest"
        email_text_field =  self.driver.find_element(By.ID, "sampletodotext")
        email_text_field.send_keys(sample_text)
        time.sleep(5)

        self.driver.find_element(By.ID, "addbutton").click()
        time.sleep(5)

        assert self.driver.find_element(By.XPATH, "//span[.='Happy Testing at LambdaTest']").text == sample_text

    def tearDown(self):
        # Close the browser. 
        self.driver.quit()

if __name__ == '__main__':
    import nose2
    nose2.main()

Код прохождения

Поскольку метод теста должен быть параметризован, мы импортируем функцию параметров из пакета NOSE2.tools в текущий файл.

from nose2.tools import params

Браузеры, на которые необходимо протестировать приложение TODO, передается в виде параметров под декоратором @params. Имена браузеров передаются в качестве значений, поскольку тест выполняется на локальной селениуме.

class LT_Parameterized_local_test(unittest.TestCase):
    @params("Firefox", "Chrome", "MicrosoftEdge")
    def test_to_do_app(self, browserName):

Метод испытаний (I.E. TEST_TO_DO_APP) принимает браурализаторов в качестве входного параметра и то же самое используется для автоматизации тестирования Selenium во всем примере для этого учебного пособия по носу Python.

def test_to_do_app(self, browserName):
        if (browserName == "Chrome"):
            print("Test on Chrome Browser initiated")
            self.driver = webdriver.Chrome()
        elif (browserName == "MicrosoftEdge"):
            print("Test on Edge Browser initiated")
            # Set the Path accordingly
            self.driver = webdriver.Edge("C:\\EdgeDriver\\MicrosoftWebDriver.exe")
        elif (browserName == "Firefox"):
            print("Test on Firefox initiated")
            self.driver = webdriver.Firefox()

        self.driver.get('https://lambdatest.github.io/sample-todo-app/')
      ...............................................
        ...............................................

Оставшаяся реализация содержит фактическую логику тестового корпуса и использует API-интерфейс селена для поиска необходимых веб-элементов и выполнения действий на этих элементах. Поскольку эта часть реализации не зависит от тестовой структуры, мы не будем охватывать эти аспекты в этом учебном пособии по носу Python. Вы можете обратиться к нашим более ранним блогам на Селен Webdriver где мы охватываем эти районы более подробно.

Исполнение

Следующая команда используется для запуска выполнения теста:

nose2 --verbose Nose_LT_Parameterized_local_Test_2

NOSE_LT_PARAMETERIZE_LOCAL_TEST_2 – это тестовое имя, то есть имя файла, где расположены тестовые случаи, это нос_lt_parameterized_local_test_2.py. Вот выходной снимок

Светильники в носу2

Нос2 имеет поддержку для приспособлений на уровне класса, модуля и тестирования (или метода), что также имеет место с другими популярными каркасами, такими как Pтойцы. Чтобы продемонстрировать использование приспособлений в носу2, мы добавляем настройку () и разрыва () светильников в примере, показанном ранее.

import unittest
from selenium import webdriver
import time
from time import sleep
from selenium.webdriver.common.by import By
from nose2.tools import params

class ChromeSearch(unittest.TestCase):
    def setUp(self):
        print("setUp initiated")
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()

def test_search_lambdatest_chrome(self):
        self.driver.get('https://www.google.com')
        title = "Google"
        assert title == self.driver.title

        search_text = "LambdaTest"
        # search_box = driver.find_element_by_xpath("//input[@name='q']")
        search_box = self.driver.find_element(By.XPATH, "//input[@name='q']")
        search_box.send_keys(search_text)

        # Using Sleep is not a good programming practice
        # Only used here for demonstration purpose
        time.sleep(5)
        search_box.submit()

        time.sleep(5)

        # Click on the LambdaTest HomePage Link
        title = "Most Powerful Cross Browser Testing Tool Online | LambdaTest"
        lt_link = self.driver.find_element(By.XPATH, "//h3[.='LambdaTest: Most Powerful Cross Browser Testing Tool Online']")
        lt_link.click()

        time.sleep(10)
        assert title == self.driver.title   
        time.sleep(2)

    def test_to_do_app(self):
        self.driver.get('https://lambdatest.github.io/sample-todo-app/')
        self.driver.maximize_window()
        self.driver.find_element(By.NAME, "li1").click()
        self.driver.find_element(By.NAME, "li2").click()

        title = "Sample page - lambdatest.com"
        assert title ==  self.driver.title

        sample_text = "Happy Testing at LambdaTest"
        email_text_field =  self.driver.find_element(By.ID, "sampletodotext")
        email_text_field.send_keys(sample_text)
        time.sleep(5)

        self.driver.find_element(By.ID, "addbutton").click()
        time.sleep(5)

        assert self.driver.find_element(By.XPATH, "//span[.='Happy Testing at LambdaTest']").text == sample_text

    def tearDown(self):
        # Close the browser
        print("TearDown initiated")
        self.driver.quit()

if __name__ == '__main__':
    import nose2
    nose2.main()

Приспособление для настройки [I.E. Настройка ()] вызывается перед любым методом испытаний в классе (который содержит прибор). С другой стороны, крепеж для разрыва [I.E. Shardown ()] называется после выполнения каждого метода теста (который реализуется под классом).

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

Организация тестовых приспособлений в слои

В этом разделе учебного пособия по носу Python мы смотрим на слои, вновь введенную концепцию в носу2 (версия 0,4). Основным преимуществом использования слоев по традиционным приспособлениям является гибкость в организации приборов. Цель состоит в том, чтобы иметь совместимость со слоями, используемыми Zope’s Testrunner.

Вот некоторые из вещей, которые могут быть достигнуты с помощью слоев:

  • Реализация Светильники на уровне пакета Разделив слой среди всех испытаний в пакете.
  • Создание много более глубокого светильника дерева чем доступные уровни (тест, класс и модуль).
  • Распределение приспособлений по тестам в разных модулях без них не работает несколько раз.

Вот простая демонстрация класса, который реализует хотя бы метод настройки-

class Layer(object):
    @classmethod
    def setUp(cls):
    # .........................

Методы Spealdown, TestSetup и Testteardowndowndowndounds могут также быть реализованы в виде классных средств. Вот краткое короткое о методах, доступных с слоями:

  • Настройка (CLS) – вызывается перед любым из тестов, принадлежащих этому конкретному слою.
  • TestSetup (CLS [, тест]) – вызывается перед выполнением каждого теста, который принадлежит слою (и его подкладах). Метод может принять аргумент, в котором пропускается экземпляр тестового случая.
  • Разрыв (CLS) – вызывается после какого-либо теста, принадлежащего слою. Он не будет вызван, если у слоя не было связанного метода установки или установка не может работать из-за некоторого исключения.
  • TestTeardown (CLS [, тест]) – Вызывается после каждого теста, принадлежащего слою (и его подкладах). Он будет вызываться только в том случае, если слой определяет метод теста на настройку (или теста), и этот метод работает без каких-либо проблем.

Для назначения слоя в тестовое дело необходимо установить свойство слоя теста, как показано ниже-

class Test(unittest.TestCase):
    layer = Layer

Перед использованием слоев в реализации вы должны загрузить плагин нос2.Plugins.layers в носу2.cfg (или unittest.cfg) присутствует в месте, откуда выполняется тестирование автоматизации селена.

Unittest.CFG (или нос .CFG)

[unittest]
plugins = nose2.plugins.layers

[test-result]
always-on = True
descriptions = True

[layer-reporter]
always-on = True
colors = True

Демонстрация светильников (со слоями) в носу2

Для демонстрации светильников в этом уроке носа Python мы используем облачную селеную сетку, поскольку это более масштабируемый вариант по сравнению с локальной селеной сеткой. Лямбдатест является одним из таких облачных селена селена, которая обеспечивает возможность запустить испытания автоматизации селена на 2000 разных комбинациях браузеров, эмуляторов устройств и операционных систем.

В разделе «Крита обучения» не участвует в портировании существующей реализации, которая работает на локальной селениуме с селеной сеткой на основе облачных селенов, таких как лямбдатест. Тестирование Selenium Python с носом2 Python на облачной селеневой решетке является лучшим вариантом от инвестиционной и масштабируемости.

После создания учетной записи на лямбдатесте вы должны отметить имя пользователя и ключ доступа из Раздел профиля Для доступа к селеневой сетке на лямбдатесте. Вы можете посетить Приборная панель Раздел Чтобы получить подробную информацию о существующих тестах и более ранних испытаниях, которые были выполнены на платформе.

Приложение TODO на Lambdatest, которое было продемонстрировано ранее, выполнено три различных комбинации браузера и ОС:

  • Chrome 71.0 на Windows 10
  • Firefox 64.0 на Windows 10
  • Safari 12.0 на Macos Mojave

Генератор возможностей на лямбдатесте используется для генерации желаемых возможностей браузера и платформы. Ниже приведено снимок возможностей браузера, создаваемых для комбинации Chrome 71.0 & Windows 10.

Реализация

import unittest
from selenium import webdriver
import time
from time import sleep
import urllib3
import warnings
from selenium.webdriver.common.by import By
# module for importing params functionality
from nose2.tools import params

user_name = "registered_email_address"
app_key = "pass_key"

#Set capabilities for testing on Chrome
ch_caps = {
    "build" : "Nose2 Fixture Testing using Chrome on Windows Environment",
    "name" : "Nose2 Fixture Testing on Chrome using Selenium Grid Environment",
    "platform" : "Windows 10",
    "browserName" : "Chrome",
    "version" : "71.0",
    "selenium_version" : "3.13.0",
    "chrome.driver" : 2.42
}

#Set capabilities for testing on Firefox
ff_caps = {
    "build" : "Nose2 Fixture using Firefox on Windows Environment",
    "name" : "Nose2 Fixture on Firefox using Selenium Grid Environment",
    "platform" : "Windows 10",
    "browserName" : "Firefox",
    "version" : "64.0",
}

#Set capabilities for testing on Safari
saf_caps = {
    "build" : "Nose2 Fixture using Safari on macOS Mojave Environment",
    "name" : "Nose2 Fixture on Safari using Selenium Grid Environment",
    "platform" : "macOS Mojave",
    "browserName" : "Safari",
    "version" : "12.0",
}

class Layer(object):
    @classmethod
    def setUp(cls):
        urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
        print("Inside setUp")
    @classmethod 
    def testTearDown(cls):
        global driver
        print("Inside tearDown")
        # Close the browser. 
        driver.quit()

class LT_Fixture_Test(unittest.TestCase):
    layer = Layer
#    def setUp(self):
#        urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

    @params((ch_caps), (ff_caps), (saf_caps))
    def test_lambdatest_todo_app(self, caps):
        global driver
        # Details can be sourced from https://automation.lambdatest.com/
        remote_url = "https://" + user_name + ":" + app_key + "@hub.lambdatest.com/wd/hub"
        self.driver = webdriver.Remote(command_executor = remote_url, desired_capabilities = caps)
        driver = self.driver
        self.driver.get('https://lambdatest.github.io/sample-todo-app/')
        self.driver.maximize_window()

        self.driver.get('https://lambdatest.github.io/sample-todo-app/')
        self.driver.maximize_window()
        self.driver.find_element(By.NAME, "li1").click()
        self.driver.find_element(By.NAME, "li2").click()

        title = "Sample page - lambdatest.com"
        assert title ==  self.driver.title

        sample_text = "Happy Testing at LambdaTest"
        email_text_field =  self.driver.find_element(By.ID, "sampletodotext")
        email_text_field.send_keys(sample_text)
        time.sleep(5)

        self.driver.find_element(By.ID, "addbutton").click()
        time.sleep(5)

        assert self.driver.find_element(By.XPATH, "//span[.='Happy Testing at LambdaTest']").text == sample_text

#    def tearDown(self):
#        # Close the browser.
#        print("Inside tearDown")
#        self.driver.quit()

if __name__ == '__main__':
    import nose2
    nose2.main()

Код прохождения

  1. Необходимый носовые пакеты Python E.g. NOSE2.tools импортируется в начале реализации.
from nose2.tools import params
  1. Комбинация пользовательского имени и ключа Pass, который доступен в разделе профиля Lambdatest, используется для доступа к URL-адреса лямбдатеста.
remote_url = "https://" + user_name + ":" + app_key + "@hub.lambdatest.com/wd/hub"
  1. API SELENIUM WEBDRIVER использует возможности URL и браузера и платформы, которые были созданы с использованием онлайн-генератора.
driver = webdriver.Remote(command_executor = remote_url, desired_capabilities = capabilities)
  1. Наиболее важной частью является реализация класса слоя, при котором Настройка/TestTeardown Методы реализованы.
class Layer(object):
    @classmethod
    def setUp(cls):
        urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
        print("Inside setUp")
    @classmethod 
    def testTearDown(cls):
        global driver
        print("Inside tearDown")
        # Close the browser. 
        driver.quit()

Настройка метода () будет вызываться в начале класса методов испытаний. С другой стороны, TestTeardown () будет вызван в конце каждого метода теста, который является частью класса. Мероприятия по очистке (связанные с тестом в браузере) выполняются в этом методе и должны выполняться после каждого метода теста.

Вместо того, чтобы Testteardowndown, если мы использовали метод Spordown, он будет называться только один раз (то есть в конце класса методов испытаний). Мы использовали TestTeardown, поскольку ресурсы браузера должны быть освобождены после каждого тестового корпуса. Методы настройки/Testteardowndowndows включены в декоратор @Classmethod; Иначе они не будут вызваны во время выполнения тестирования.

  1. Слой должен быть назначен на тестовый случай. Следовательно, свойство слоя тестового дела установлено с использованием реализации, показанной ниже-
class LT_Fixture_Test(unittest.TestCase):
    layer = Layer
  1. Возможности браузера и ОС передаются к декоратору @params, поскольку тестирование Selenium Python выполняется против каждой комбинации желаемых возможностей.
ch_caps = {
    "build" : "Nose2 Fixture Testing using Chrome on Windows Environment",
    "name" : "Nose2 Fixture Testing on Chrome using Selenium Grid Environment",
    "platform" : "Windows 10",
    "browserName" : "Chrome",
    "version" : "71.0",
    "selenium_version" : "3.13.0",
    "chrome.driver" : 2.42
}

.........................................
.........................................

class LT_Fixture_Test(unittest.TestCase):
    layer = Layer
    .........................................
    .........................................
    @params((ch_caps), (ff_caps), (saf_caps))
    def test_lambdatest_todo_app(self, caps):
        global driver
        # Details can be sourced from https://automation.lambdatest.com/
        remote_url = "https://" + user_name + ":" + app_key + "@hub.lambdatest.com/wd/hub"
        self.driver = webdriver.Remote(command_executor = remote_url, desired_capabilities = caps)

Остальная часть реализации не зависит от тестового бегуна, поскольку они используют API в Webdriver SELENIUM для поиска и выполнения таких действий, как щелчок и т. Д., На этих веб-элементах.

Исполнение

Следующая команда используется для выполнения

nose2 --verbose Nose_LT_Fixtures_Test_4

Здесь NOSE_LT_FIXTURES_TEST_4.PY – это файл, который содержит тестовую реализацию. Ниже показано, что скриншот с вкладки автоматизации на платформе лямбдатестра.

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

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

Параллельное тестирование в носу2

Параллельное тестирование в селене Позволяет работать одновременно одновременно в разных испытательных средах. В этом разделе Учебное пособие на нос Python мы посмотрим, как реализовать параллельные тестирования в носу2 Python.

Плагин MP был введен в носу2 версии 0.3 для предоставления распределения тестов в нескольких процессах. Хотя параллельное исполнение тестирования приводит к улучшению скорости выполнения (в качестве тестов запускается параллельно), улучшение более очевидно в IO, связанных с тестами, чем тесты, связанные с CPU. Вам также необходимо проверить, не является ли использование плагина MP не конфликтуют с другими плагинами, которые не предназначены для работы в сочетании с ним.

Вот некоторые из способов, которыми параллелизм может быть достигнут в нозе2 Python:

  • Активация плагина MP, включая то же самое в разделе [Unitest] в файле конфигурации ИЛИ
[unittest]
plugins = nose2.plugins.mp
  • Передача модуль с вариантом командной строки -Plugin
[unittest]
plugins = nose2.plugins.mp

После активации плагина MP вы должны настроить количество процессов, которые могут быть запущены параллельно. Это может быть достигнуто с помощью опции -N или

nose2 -N 

Установив количество процессов в [Multipress] раздел конфигурации файла

[multiprocess]
processes = 

Важно отметить, что тесты не работают в том же порядке, когда параллелизм включен. Если тестовые апартаменты имеют взаимозависимости (которые сам по себе не являются хорошей практикой программирования), то тесты могут случайным образом выйти из строя, если включен плагин MP. Существуют и другие основные рекомендации для тестовых авторов, которые вы можете найти в официальной документации под названием Запуск тестов параллельно с носом2 Отказ

Для демонстрации параллельного тестирования выполнения в NOSE2 Python мы выполняем два сценария испытаний через шесть различных комбинаций браузера и ОС в этом учебном пособии Python.

Тестовый случай – 1

  1. Перейдите к URL https://lambdatest.github.io/sample-todo-app/
  2. Выберите первые два флажка
  3. Отправить «счастливое тестирование на лямбдатест» на текстовое поле с
  4. Нажмите кнопку «Добавить» и убедитесь, был ли текст был добавлен или нет

Тестовый случай – 2

  1. Перейдите к URL https://www.google.com.
  2. Поиск “лямбдатест”
  3. Найдите первый результат поиска и нажмите на такой же
  4. Assert, если название открытого окна не совпадает с ожидаемым заголовком

Оба тестовых сценария выполняются против следующего браузера, комбинаций ОС:

  • Chrome (71.0), Windows 10
  • Firefox (64.0), Windows 10
  • Safari (12.0), Macos Mojave

Для параллельного тестирования Python Selenium мы будем использовать приборы старого стиля вместо слоев, так как тестовые люксы с использованием слоев не совместимы с многопроцессорным плагином (или MP) в этом учебном пособии Python. Не попробуйте сочетание слоев и многопроссушки, так как она не будет работать.

Реализация (тестовый случай 1)

# Layer and Multiprocessor plugins are not compatible hence, the old-style fixtures are used
# https://docs.nose2.io/en/latest/plugins/layers.html#mixing-layers-and-multiprocess-testing
import unittest
from selenium import webdriver
import time
from time import sleep
import urllib3
import warnings
from selenium.webdriver.common.by import By
# module for importing params functionality
from nose2.tools import params

user_name = "user-name"
app_key = "access-key"

#Set capabilities for testing on Chrome
ch_caps = {
    "build" : "Nose Testing using Chrome on Windows Environment(1)",
    "name" : "Nose Testing on Chrome using Selenium Grid Environment(1)",
    "platform" : "Windows 10",
    "browserName" : "Chrome",
    "version" : "71.0",
    "selenium_version" : "3.13.0",
    "chrome.driver" : 2.42
}

#Set capabilities for testing on Firefox
ff_caps = {
    "build" : "Nose Testing using Firefox on Windows Environment(2)",
    "name" : "Nose Testing on Firefox using Selenium Grid Environment(2)",
    "platform" : "Windows 10",
    "browserName" : "Firefox",
    "version" : "64.0",
}

#Set capabilities for testing on Safari
saf_caps = {
    "build" : "Nose Testing using Safari on macOS Mojave Environment(3)",
    "name" : "Nose Testing on Safari using Selenium Grid Environment(3)",
    "platform" : "macOS Mojave",
    "browserName" : "Safari",
    "version" : "12.0",
}

# class Layer(object):
#    @classmethod
#    def setUp(cls):
#        urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
#        print("Test Mod 1 - Inside setUp")
#    @classmethod
#    def testTearDown(cls):
#        global driver
#        # Close the browser. 
#        driver.quit()

class Test_Parallel_test_1(unittest.TestCase):
#   layer = Layer
    def setUp(self):
        urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
        print("Test Mod 1 - setUp initiated")

    @params((ch_caps), (ff_caps), (saf_caps))
    def test_lambdatest_todo_app(self, caps):
        # Details can be sourced from https://automation.lambdatest.com/
        remote_url = "https://" + user_name + ":" + app_key + "@hub.lambdatest.com/wd/hub"
        self.driver = webdriver.Remote(command_executor = remote_url, desired_capabilities = caps)
        self.driver.get('https://lambdatest.github.io/sample-todo-app/')
        self.driver.maximize_window()

        self.driver.find_element(By.NAME, "li1").click()
        self.driver.find_element(By.NAME, "li2").click()

        title = "Sample page - lambdatest.com"
        assert title ==  self.driver.title

        sample_text = "Happy Testing at LambdaTest"
        email_text_field =  self.driver.find_element(By.ID, "sampletodotext")
        email_text_field.send_keys(sample_text)
        time.sleep(5)

        self.driver.find_element(By.ID, "addbutton").click()
        time.sleep(5)

        assert self.driver.find_element(By.XPATH, "//span[.='Happy Testing at LambdaTest']").text == sample_text

    def tearDown(self):
        # Close the browser
        print("Test Mod 1 - TearDown initiated")
        self.driver.quit()

if __name__ == '__main__':
    import nose2
    nose2.main()

Реализация (тестовый случай 2)

# Layer and Multiprocessor plugins are not compatible hence, the old-style fixtures are used
# https://docs.nose2.io/en/latest/plugins/layers.html#mixing-layers-and-multiprocess-testing
import unittest
from selenium import webdriver
import time
from time import sleep
import urllib3
import warnings
from selenium.webdriver.common.by import By
# module for importing params functionality
from nose2.tools import params

user_name = "user-name"
app_key = "access-key"

#Set capabilities for testing on Chrome
ch_caps = {
    "build" : "Nose2 Testing using Chrome on Windows Environment(4)",
    "name" : "Nose2 Testing on Chrome using Selenium Grid Environment(4)",
    "platform" : "Windows 10",
    "browserName" : "Chrome",
    "version" : "71.0",
    "selenium_version" : "3.13.0",
    "chrome.driver" : 2.42
}

#Set capabilities for testing on Firefox
ff_caps = {
    "build" : "Nose2 Testing using Firefox on Windows Environment(5)",
    "name" : "Nose2 Testing on Firefox using Selenium Grid Environment(5)",
    "platform" : "Windows 10",
    "browserName" : "Firefox",
    "version" : "64.0",
}

#Set capabilities for testing on Safari
saf_caps = {
    "build" : "Nose2 Testing using Safari on macOS Mojave Environment(6)",
    "name" : "Nose2 Testing on Safari using Selenium Grid Environment(6)",
    "platform" : "macOS Mojave",
    "browserName" : "Safari",
    "version" : "12.0",
}

# class Layer(object):
#    @classmethod
#    def setUp(cls):
#        urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
#        print("Test Mod 2 - Inside setUp")
#    @classmethod 
#    def testTearDown(cls):
#        global driver
#        print("Test Mod 2 - Inside tearDown")
#        driver.quit()

class Test_Parallel_test_2(unittest.TestCase):
#    layer = Layer
    def setUp(self):
        urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
        print("Test Mod 2 - setUp initiated")

    @params((ch_caps), (ff_caps), (saf_caps))
    def test_lambdatest_google_search(self, caps):
        # Details can be sourced from https://automation.lambdatest.com/
        remote_url = "https://" + user_name + ":" + app_key + "@hub.lambdatest.com/wd/hub"
        self.driver = webdriver.Remote(command_executor = remote_url, desired_capabilities = caps)
        self.driver.get('https://www.google.com')
        self.driver.maximize_window()
        title = "Google"
        assert title == self.driver.title

        search_text = "LambdaTest"
        search_box = self.driver.find_element(By.XPATH, "//input[@name='q']")
        search_box.send_keys(search_text)

        # Using Sleep is not a good programming practice
        # Only used here for demonstration purpose
        time.sleep(5)
        search_box.submit()

        time.sleep(5)

        # Click on the LambdaTest HomePage Link
        title = "Most Powerful Cross Browser Testing Tool Online | LambdaTest"
        lt_link = self.driver.find_element(By.XPATH, "//h3[.='LambdaTest: Most Powerful Cross Browser Testing Tool Online']")
        lt_link.click()

        time.sleep(10)
        assert title == self.driver.title   
        time.sleep(2)

    def tearDown(self):
        # Close the browser
        print("Test Mod 2 - TearDown initiated")
        self.driver.quit()        

if __name__ == '__main__':
    import nose2
    nose2.main()

Код прохождения

Как в тестовых случаях, стандарт Настройка/разрыв Приспособления используются. Ресурсы браузера освобождаются в методе разрыва.

def setUp(self):
   urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
   print("Test Mod 2 - setUp initiated")

............................
............................
def tearDown(self):
        # Close the browser
        print("Test Mod 2 - TearDown initiated")
        self.driver.quit()        

if __name__ == '__main__':
    import nose2
    nose2.main()

Возможности браузера и ОС генерируются с использованием генератора возможностей Lambdatest, образец которого показано ниже:

#Set capabilities for testing on Safari
saf_caps = {
    "build" : "Nose2 Testing using Safari on macOS Mojave Environment(6)",
    "name" : "Nose2 Testing on Safari using Selenium Grid Environment(6)",
    "platform" : "macOS Mojave",
    "browserName" : "Safari",
    "version" : "12.0",
}

Возможности передаются в параметризованной форме с помощью декоратора @params.

   @params((ch_caps), (ff_caps), (saf_caps))
    def test_lambdatest_google_search(self, caps):
        # Details can be sourced from https://automation.lambdatest.com/
        remote_url = "https://" + user_name + ":" + app_key + "@hub.lambdatest.com/wd/hub"
        self.driver = webdriver.Remote(command_executor = remote_url, desired_capabilities = caps)

Оставшаяся часть реализации является самосвязкой, поскольку API селена Webdriver используются для достижения конечного результата.

Исполнение

Следующая команда использовалась для запуска параллельного тестирования

nose2 --verbose Nose_LT_Parallel_Test_3 Nose_LT_Parallel_Test_3_1 --plugin=nose2.plugins.mp -N 4

Многопрокатной плагин (NOSE.PLUGINS.MP) включен с помощью опции -Plugin. Количество процессов, которые будут выполнены параллельно, являются 4. Мой план на лямбдатесте поддерживает параллелизм до пяти процессов, следовательно,; Мы выбрали четыре для демонстрации.

Вот скриншот из вкладки Automation в Lambdatest, что указывает на то, что четыре теста исполнялись параллельно-

Вот скриншот завершения тестирования из лямбдатеста и терминала, где было запущено тестовое исполнение

Общее время выполнения для шести кредиторов тестов браузера составляло 63,52 секунды. С помощью этого раздела учебника по носу Python мы охватываем основные аспекты тестирования Selenium Python с носом2.

Регистрация и отчетность в носу2

Расширенные отчеты об ошибках в Selenium Помогите соединить разрыв между тестерами и разработчиками. Они также помогают при закреплении проблем на более быстрых темпах, тем самым улучшая общее качество веб-продукта. В этом разделе Python Touse Totorial мы смотрим, как создавать отчеты в носу2 Python.

Нос2 имеет встроенные плагины, которые позволяют вам захватывать журналы во время тестирования. Журналы добавляются к отчету о тестировании носа Python о неудачных тестах. Функциональность ведения журнала в NOSE2 Python может быть установлена либо из терминала (при запуске команды исполнения) или путем добавления конфигурации в файле unittest.cfg (или noS2.cfg).

[log-capture]
always-on = False
clear-handlers = False
filter = -nose
format = %(name)s: %(levelname)s: %(message)s
log-level = NOTSET

Я предпочитаю опцию командной строки -LOG-Capture, чтобы включить вход в носу2. Вот команда, чтобы включить ведение журнала

nose2 --verbose --log-capture Nose_LT_Basic_Test_1

Вот вывод журнала первого теста, который был продемонстрирован ранее в этом учебном пособии на носу Python.

Нозем2-HTML-отчет Плагин – это внешний плагин, который используется для генерации отчета о тестовом отчете Python носа на основе HTML. Последняя версия носа2-HTML-отчета составляет 0,6,0. Следующая команда используется для установки плагина:

pip install nose2-html-report

Использование плагина, отчеты могут быть созданы в формате HTML или XML. Нос2 может распознать плагин, если в клавише [Plugin] добавляется запись в клавишу [Plugin] [Unittest] of Nose2.cfg (или Unittest.cfg). Вот конфигурация образца для создания отчетов HTML для ваших устройств

[unittest]
plugins = nose2_html_report.html_report

[test-result]
always-on = True
descriptions = True

[html-report]
always-on = True
path = Path_to_report_file\report.html

Для генерации отчета о тестировании носа HTML Python для того же тестового случая мы выполняем следующую команду на терминале

nose2 --verbose --log-capture --plugin=nose2_html_report.html_report Nose_LT_Basic_Test_1

Вот скриншот исполнения и сгенерированный отчет о тестировании носа Python HTML Python

Различия между носом2, носом и Unittest2

Теперь, когда мы охватывали все аспекты, связанные с носом2 Python, давайте посмотрим, как нос2 отличается от носа (и других структур автоматизации в Python). Вот некоторые критические различия между носом2 и его предшественником:

  • Нос2 доступен для версий Python, которые в настоящее время поддерживаются командой Python, тогда как нос поддерживается только для версий Python 2.4 (и выше).
  • Как Unittest2, только в носу2 приспособлены только уровень модуля и уровней класса.
  • В отличие от носа, который следует ленивому нагрузке, нос2 не нужен пользовательский импортер, поскольку он импортирует тестовые модули с __import __ ().
  • Поддержка параметризованных тестов и генераторных испытаний более обширна, чем нос. Нозем2 поддерживает тестовые генераторы в тестовых классах, тестовых функциях и в подклассах Unittest Testcase.
  • Что касается загрузки плагинов, нос использует точки входа STYPUPTOOLS для поиска и загрузки плагинов. С другой стороны, не загружается плагин в тестовую систему и манит, что плагины должны быть перечислены в файлах конфигурации.
  • В носу2 все конфигурации должны быть выполнены через файлы конфигурации. С другой стороны, нос ожидает, что параметры конфигурации будут доступны в качестве вариантов командной строки. Следовательно, NOSE2 является предпочтительным, если вы хотите выполнить повторные тесты, так как конфигурация хранится в более читаемых файлах конфигурации (.CFG).

И это обертка для второй части нашего урока по носу Python!

Заключение

Во второй части серии Учебника для носа Python мы глубоко поднимаем в носу2 Python и использовали его для автоматизации тестирования Selenium. Если вы используете Unittest Framework для тестирования Selenium Python, вы должны проверить нос2, поскольку он добавляет больше ценности в Unittest Framework через его обширный экосистема плагина.

Нос2 также подходит для тестирования перекрестных браузеров, поскольку оно поддерживает параллельное тестовое исполнение через многопроцентный (MP) плагин и позволяет загружать отчеты о тестовых тестах Python. Существующая реализация, которая работает на местных Селенская сетка Может быть беспрепятственно портирован на работу с облачной селеной селеной (такой как лямбдатест). Это помогает использовать выигрышные особенности носа2 для ускорения процесса теста.

Счастливое тестирование!

Оригинал: “https://dev.to/himanshusheth004/getting-started-with-nose2-in-python-tutorial-5akg”