Эта статья была первоначально опубликована на TestProject .
Если вы хотите написать функциональный тест на JavaScript, следующее руководство предоставляет инженерам по автоматизации пользовательского интерфейса идеальный структурный справочный материал для тестирования JavaScript с Selenium WebDriver 3 , Mocha и NodeJS.
В наши дни JavaScript является вездесущим веб-языком, который, похоже, преодолевает свое «пресловутое» прошлое и стал более прочной платформой не только для клиентской, но и для серверной области. Mocha.js, или просто Mocha, является многофункциональной тестовой средой JavaScript, работающей на Node.js, которая предоставляет платформу и API для создания автономных приложений на стороне сервера с использованием движка Google V8 JavaScript.
* Примечание: чтобы начать работу с этим учебником по JavaScript, вам необходимо ознакомиться с основами NodeJS и языком программирования JavaScript .
Обзор учебника:
1. Мокко Тест Конструкция
- Вступление
- Установка
- Установка модуля подтверждения Chai
- Тестовый набор и структура тестового набора
- Построение тестов с Мокко
- Запуск набора тестов Mocha и тестовых случаев
- Управление синхронизацией кода асинхронного тестирования
2. Использование Javascript Selenium 3 API, интегрированного с MochaJS
- Селен Введение
- Установка селена
- Конструкция WebDriver
- Интеграция MochaJS с Selenium WebDriver 3
Используемые версии:
- Используемая версия узла: 6.10.1 (LTS)
- Мокко: 2.5.3
- WebDriverJS: 3.3.0
1. Построение тестов с Мокко
Введение в мокко
Как уже упоминалось, Mocha — это тестовая среда JavaScript, которая запускает тесты на Node. Mocha поставляется в виде пакета Node через npm, что позволяет использовать любую библиотеку для утверждений в качестве замены стандартной функции Nosert «assert», такой как ChaiJS. Кроме того, Mocha имеет несколько компонентов, похожих на Jasmine , еще одну популярную инфраструктуру автоматизации тестирования, о которой мы упоминали в наших исследованиях, посвященных тенденциям автоматизации переднего плана и модульного тестирования .
Mocha предоставляет API, который определяет способ структурирования кода тестирования в наборы тестов и модули тестового набора для выполнения, а затем для создания отчета о тестировании. Mocha предоставляет два режима работы: либо из командной строки (CLI), либо программно (Mocha API).
Установить мокко
Если Mocha должен использоваться в CLI, он должен быть установлен глобально как Node.js.
npm install -g mocha
Установите модуль подтверждения Chai
npm install --save chai
Опция –save
используется для установки модуля в рамках проекта, а не в глобальном масштабе.
Набор тестов и структура тестового набора
В Mocha набор тестов определяется ключевым словом ‘description’, которое принимает функцию обратного вызова. Набор тестов может содержать дочерние / внутренние наборы тестов, которые могут содержать свои собственные дочерние наборы тестов и т. Д. Тестовый случай обозначается функцией ‘it’, которая принимает функцию обратного вызова и содержит код тестирования.
Mocha поддерживает настройку тестового набора и настройку тестового набора. Настройка набора тестов обозначается как before
то время как настройка beforeEach
применяется beforeEach
. beforeEach
фактически является общей настройкой для каждого случая в наборе и будет выполняться перед каждым случаем.
Как и в случае с установкой, Mocha поддерживает набор тестов и функции разбора тестовых примеров. Разрыв набора тестов обозначается after
, в то время как разделение тестового примера реализуется с afterEach
, функциями, которые выполняются после набора тестов и после каждого теста соответственно.
Создайте файл, в котором будет размещен набор тестов, например test_suite.js, и напишите в него следующее;
describe("Inner Suite 1", function(){ before(function(){ // do something before test suite execution // no matter if there are failed cases }); after(function(){ // do something after test suite execution is finished // no matter if there are failed cases }); beforeEach(function(){ // do something before test case execution // no matter if there are failed cases }); afterEach(function(){ // do something after test case execution is finished // no matter if there are failed cases }); it("Test-1", function(){ // test Code // assertions }); it("Test-2", function(){ // test Code // assertions }); it("Test-3", function(){ // test Code // assertions }); });
того, какdescribe("Inner Suite 1", function(){ before(function(){ // do something before test suite execution // no matter if there are failed cases }); after(function(){ // do something after test suite execution is finished // no matter if there are failed cases }); beforeEach(function(){ // do something before test case execution // no matter if there are failed cases }); afterEach(function(){ // do something after test case execution is finished // no matter if there are failed cases }); it("Test-1", function(){ // test Code // assertions }); it("Test-2", function(){ // test Code // assertions }); it("Test-3", function(){ // test Code // assertions }); });
Запуск Mocha Test Suite и тестовых случаев
Mocha поддерживает выполнение тестов тремя способами: весь файл Test Suite, тесты, отфильтрованные по шаблонам «grep» и тесты grep-фильтрации, просматривающие дерево каталогов (рекурсивная опция)
Запустите весь файл Test Suite:
mocha /path/to/test_suite.js
Запустите определенный набор или тест из определенного файла набора.
Если выбран набор, то будут выполнены все дочерние наборы и / или тесты.
mocha -g “Test-2” /path/to/test_suite.js
Запустите определенный набор или тестовый файл, выполнив рекурсивный поиск в дереве каталогов.
mocha --recursive -g “Test-2” /directory/
Для расширенных возможностей CLI:
mocha –-help
Управление синхронизацией кода асинхронного тестирования
Если асинхронные функции используются с Mocha и не обрабатываются должным образом, вы можете столкнуться с трудностями. Если в тестовом примере должен использоваться асинхронный код (например, запросы http, файлы, селен и т. Д.), Следуйте этим рекомендациям, чтобы преодолеть неожиданные результаты:
1. done
функция
В вашей тестовой функции ( it
) вам нужно передать функцию done
по цепочке обратных вызовов — это гарантирует, что она будет выполнена после вашего последнего шага.
Пример ниже подчеркивает готовую функциональность. В этом случае три секунды тайм-аута произойдет в конце тестовой функции.
it('Test-1', function(done){ setTimeout(function(){ console.log(“timeout!”); // mocha will wait for done to be called before exiting function. done(); }, 3000); });
-it('Test-1', function(done){ setTimeout(function(){ console.log(“timeout!”); // mocha will wait for done to be called before exiting function. done(); }, 3000); });
2. Вернуть обещание
Возврат обещания — это еще один способ убедиться, что Mocha выполнил все строки кода, когда используются асинхронные функции (в этом случае функция ‘done’ не нужна).
it('Test-1', function(done){ var promise; promise = new Promise(function(resolve, reject){ setTimeout(function(){ console.log("Timeout"); resolve(); }, 3000); }); // mocha will wait for the promise to be resolved before exiting return promise; });
-it('Test-1', function(done){ var promise; promise = new Promise(function(resolve, reject){ setTimeout(function(){ console.log("Timeout"); resolve(); }, 3000); }); // mocha will wait for the promise to be resolved before exiting return promise; });
2. Javascript Selenium 3 Интеграция с MochaJS
Селен Введение
Selenium — это библиотека, которая управляет веб-браузером и эмулирует поведение пользователя. В частности, Selenium предлагает специальные API-интерфейсы языковых библиотек, называемые «привязками» для пользователя. Эти «привязки» действуют как клиент для выполнения запросов к промежуточным компонентам и действуют как серверы для окончательного управления браузером.
Selenium API, или привязки, теперь существуют на всех популярных языках разработки . Все языковые реализации теперь согласились поддерживать согласованность с соглашениями об именах функций API.
Промежуточными компонентами могут быть реальный веб-драйвер, встроенный в каждый пакет Selenium, автономный сервер selenium, а также встроенные драйверы управления браузером, такие как Geckodriver для Mozilla, chromedriver для Chrome и т. Д. Кроме того, веб-драйвер Selenium взаимодействует с драйверы браузера через «протокол JsonWired» и становятся веб-стандартом W3C.
Установка селена
Прежде чем углубляться в интеграцию Selenium с MochaJS, мы кратко рассмотрим реализацию Selenium с NodeJS.
Чтобы использовать Selenium API для JavaScript (или привязки Selenium JavaScript), мы должны установить соответствующий модуль:
npm install selenium-webdriver
На этом этапе следует уточнить, что Javascript Selenium WebDriver также может называться Webdriverjs (хотя и не в npm). Webdrivejs отличается от других библиотек / библиотек, таких как WebdriverIO , Protractor и т. Д. Selenium-webdriver является официальной библиотекой JavaScript Selenium с открытым исходным кодом, в то время как другие являются библиотеками-оболочками-оболочками, которые построены поверх API webdriverjs и претендуют на улучшение удобство использования и обслуживания.
В коде NodeJS модуль используется:
require('selenium-webdriver')
Конструкция WebDriver
Чтобы использовать Selenium, мы должны создать соответствующий объект «webdriver», который затем будет управлять нашим браузером. Ниже мы можем увидеть, как мы используем шаблон «Построитель» для создания объекта веб-драйвера путем объединения нескольких функций.
Строитель с опциями
var webdriver = require('selenium-webdriver') var chrome = require('selenium-webdriver/chrome'), var firefox = require('selenium-webdriver/firefox'); var driver = new webdriver.Builder() .forBrowser('firefox') .setFirefoxOptions( /* … */) .setChromeOptions( /* … */) .build();
В приведенном выше коде нам удалось создать объект WebDriver, который объединяет конфигурацию для более чем одного браузера (обратите внимание на методы ‘options’), несмотря на тот факт, что метод forBrowser()
явно устанавливает firefox
.
Пользователь может установить переменную среды SELENIUM_BROWSER во время выполнения, чтобы установить нужный браузер. Он переопределит любую опцию, установленную forBrowser
, так как мы уже настроили несколько возможностей браузера с помощью set<browser_name>Options
.
Свойства браузера могут иметь несколько типов информации в зависимости от тестируемого браузера. Например, в свойствах Mozilla мы можем установить желаемую конфигурацию «профиля» следующим образом:
var profile = new firefox.Profile( /* … path to firefox local profile … */); var firefoxOptions = new firefox Options().setProfile(profile);
Затем в приведенном выше фрагменте Builder мы можем добавить:
'setFirefoxOptions( firefoxOptions )'
Строитель с возможностями
JavaScript API Selenium WebDriver описывает несколько способов создания веб-драйвера. Еще один возможный способ заключается в настройке всех необходимых конфигураций драйверов в возможностях:
var driver = new webdriver.Builder(). .withCapabilities( { 'browserName' : 'firefox' } ) .build();
Обратите внимание, что если setOptions установлены после withCapabilities
, конфигурации будут переопределены (например, конфигурации прокси).
Selenium WebDriver Control Flow and Promise Management
Поскольку JavaScript и NodeJS основаны на асинхронных принципах, Selenium WebDriver ведет себя аналогичным образом. Чтобы избежать пирамид обратного вызова и помочь инженеру по тестированию в создании сценариев, а также в удобочитаемости и удобстве сопровождения кода, объекты Selenium WebDriver включают в себя менеджер обещаний, который использует ControlFlow. ‘ControlFlow’ — это класс, отвечающий за последовательное выполнение асинхронных команд веб-драйвера.
Практически каждая команда выполняется на объекте driver
и возвращается обещание. Следующие команды не нужно вкладывать в ‘thens’, если нет необходимости обрабатывать разрешенное значение обещания следующим образом:
driver.get("http://www.google.com"); driver.getTitle().then(function( title ) { // google page title should be printed console.log(title) }); driver.quit();
Указатели для тестирования JavaScript с Selenium WebDriver и Mocha
-
driver
— это объект веб-драйвера, а не объект обещания -
driver.getTitle()
илиdriver.get(url)
или любая другая команда Selenium возвращает объект обещания!
Это означает, что мы можем выполнить следующее:
var titlePromise = driver.getTitle(); titlePromise.then(function(title){ console.log(title); });
- Кроме того, поскольку
driver
асинхронен в своей базе, следующее не будет работать:
var title = driver.getTitle(); expect (title).equals("Google");
Примечание. title
— это объект обещания, а не фактическое разрешенное значение.
MochaJS + Selenium WebDriver
Вообще говоря, Selenium WebDriver можно интегрировать с MochaJS, поскольку он используется в любом простом скрипте NodeJS. Однако, поскольку Mocha не знает, когда асинхронная функция завершилась до done()
будет вызвана функция done()
или возвращено обещание, мы должны быть очень осторожны с обработкой.
На основе обещаний
Команды Selenium регистрируются автоматически, чтобы гарантировать, что команды веб-драйвера выполняются в правильном последовательном порядке, обещание должно быть возвращено.
Код ниже показывает Mocha (before, beforeEach, after, afterEach) или тело тестового примера, которое он перехватывает.
describe( 'Test Suite' , function(){ before(function(){ driver.get( my_service ); driver.findElement(webdriver.By.id(username)).sendKeys(my_username); // a promise is returned while 'click' action // is registered in 'driver' object return driver.findElement(webdriver.By.id(submit)).click(); }); after(function(){ return driver.quit(); }); it( 'Test Case', function(){ driver.getTitle().then(function(title){ expect(title).equals(my_title); })
того, какdescribe( 'Test Suite' , function(){ before(function(){ driver.get( my_service ); driver.findElement(webdriver.By.id(username)).sendKeys(my_username); // a promise is returned while 'click' action // is registered in 'driver' object return driver.findElement(webdriver.By.id(submit)).click(); }); after(function(){ return driver.quit(); }); it( 'Test Case', function(){ driver.getTitle().then(function(title){ expect(title).equals(my_title); })
Будут выполнены следующие действия:
- Страница браузера my_service загружена
- Текстовое поле с идентификатором ‘username’ находится
- Текстовое поле с идентификатором ‘username’ заполнено ‘my_username’
- Заголовок страницы извлекается и проверяется на равенство с my_title
- WebDriver закрывается и окно браузера закрывается. Процесс браузера завершен.
Selenium Webdriver Поддержка MochaJS
Для простого тестирования JavaScript с помощью Selenium WebDriver и Mocha WebDriver облегчает использование с MochaJS, оборачивая тестовые функции MochaJS (before, beforeEach, it и т. Д.) Тестовым объектом. Это создает область, которая обеспечивает понимание того, что WebDriver используется. Таким образом, нет необходимости в обещании возврата.
Сначала должен быть загружен соответствующий модуль:
var test = require('selenium-webdriver/testing');
Всем функциям мокко предшествует «тест». следующее:
test.before() test.describe()
И так далее. Затем приведенный выше код полностью переписывается как:
test.describe( 'Test Suite' , function(){ test.before(function(){ driver.get( my_service ); driver.findElement(webdriver.By.id(username)).sendKeys(my_username); driver.findElement(webdriver.By.id(submit)).click(); }); test.after(function(){ driver.quit(); }); test.it( 'Test Case' , function(){ driver.getTitle().then(function(title){ expect(title).equals(my_title); }) driver.sleep(); }); });
Вывод
В этом уроке мы получили возможность испытать JavaScript с Selenium WebDriver и MochaJS. Мы должны иметь в виду основное различие при сравнении с другими привязками языков программирования из-за асинхронной природы NodeJS, MochaJS и Selenium WebDriver.
До тех пор, пока мы продолжаем возвращать обещания в любой функции, которая создает обещание (либо пользовательская функция lib тестирования, либо ловушка / тестовый случай MochaJS), Mocha будет выполнять их в правильном порядке.
Другие инфраструктуры, такие как WebdriverIO, Protractor и CodeseptJS, предоставляют решения-оболочки, которые скрывают некоторые конфигурации от пользователя, и обеспечивают некоторую улучшенную обработку обещаний для лучшего сценариев, которые могут оказаться полезными для многих экспертов по автоматизации тестирования.