Учебники

Транспортир — Объекты

В этой главе подробно обсуждаются объекты в транспортире.

Что такое объекты страницы?

Объект страницы — это шаблон проектирования, который стал популярным для написания тестов e2e с целью улучшения обслуживания теста и уменьшения дублирования кода. Он может быть определен как объектно-ориентированный класс, служащий интерфейсом для страницы вашего AUT (тестируемого приложения). Но прежде чем углубляться в объекты страницы, мы должны понять проблемы с автоматическим тестированием пользовательского интерфейса и способы их решения.

Проблемы с автоматическим тестированием пользовательского интерфейса

Ниже приводятся некоторые общие проблемы с автоматизированным тестированием пользовательского интерфейса.

Изменения интерфейса

Наиболее распространенные проблемы при работе с тестированием пользовательского интерфейса — изменения, происходящие в пользовательском интерфейсе. Например, в большинстве случаев кнопки или текстовые поля и т. Д. Обычно подвергаются изменениям, что создает проблемы для тестирования пользовательского интерфейса.

Отсутствие поддержки DSL (Domain Specific Language)

Еще одна проблема с тестированием пользовательского интерфейса — отсутствие поддержки DSL. С этой проблемой становится очень трудно понять, что тестируется.

Много повторений / дублирование кода

Следующая распространенная проблема в тестировании пользовательского интерфейса — это много повторений или дублирования кода. Это можно понять с помощью следующих строк кода —

element(by.model(‘event.name’)).sendKeys(‘An Event’);
element(by.model(‘event.name’)).sendKeys(‘Module 3’);
element(by.model(‘event.name’));

Жесткое обслуживание

Из-за вышеупомянутых проблем это становится головной болью для обслуживания. Это потому, что мы должны найти все экземпляры, заменить их новым именем, селектором и другим кодом. Нам также нужно потратить много времени, чтобы привести тесты в соответствие с рефакторингом.

Сломанные тесты

Еще одной проблемой в тестировании пользовательского интерфейса является множество сбоев в тестах.

Способы справиться с вызовами

Мы видели некоторые общие проблемы тестирования пользовательского интерфейса. Вот некоторые из способов справиться с такими проблемами:

Обновление ссылок вручную

Самый первый вариант для решения вышеуказанных проблем — обновить ссылки вручную. Проблема с этой опцией заключается в том, что мы должны выполнить ручное изменение кода, а также наши тесты. Это можно сделать, когда у вас есть один или два тестовых файла, но что, если у вас есть сотни тестовых файлов в проекте?

Использование объектов страницы

Другим вариантом решения вышеуказанных проблем является использование объектов страницы. Объект страницы — это простой JavaScript, который инкапсулирует свойства шаблона Angular. Например, следующий файл спецификации написан без и с объектами страницы, чтобы понять разницу —

Без объектов страницы

describe('angularjs homepage', function() {
   it('should greet the named user', function() {
      browser.get('http://www.angularjs.org');
      element(by.model('yourName')).sendKeys('Julie');
      var greeting = element(by.binding('yourName'));
      expect(greeting.getText()).toEqual('Hello Julie!');
   });
});

С объектами страницы

Для написания кода с объектами страницы, первое, что нам нужно сделать, это создать объект страницы. Следовательно, объект Page для приведенного выше примера может выглядеть так:

var AngularHomepage = function() {
   var nameInput = element(by.model('yourName'));
   var greeting = element(by.binding('yourName'));

   this.get = function() {
      browser.get('http://www.angularjs.org');
   };

   this.setName = function(name) {
      nameInput.sendKeys(name);
   };
   
   this.getGreetingText = function() {
      return greeting.getText();
   };
};
module.exports = new AngularHomepage();

Использование объектов страницы для организации тестов

Мы видели использование объектов страницы в приведенном выше примере для решения задач тестирования пользовательского интерфейса. Далее мы обсудим, как мы можем использовать их для организации тестов. Для этого нам нужно изменить тестовый скрипт без изменения функциональности тестового скрипта.

пример

Чтобы понять эту концепцию, мы берем вышеуказанный файл конфигурации с объектами страницы. Нам нужно изменить тестовый скрипт следующим образом:

var angularHomepage = require('./AngularHomepage');
describe('angularjs homepage', function() {
   it('should greet the named user', function() {
      angularHomepage.get();

      angularHomepage.setName('Julie');
   
      expect(angularHomepage.getGreetingText()).toEqual
      ('Hello Julie!');
   });
});

Здесь обратите внимание, что путь к объекту страницы будет соответствовать вашей спецификации.

На том же примечании мы также можем разделить наш набор тестов на различные наборы тестов. Конфигурационный файл затем может быть изменен следующим образом

exports.config = {
   // The address of a running selenium server.
   seleniumAddress: 'http://localhost:4444/wd/hub',

   // Capabilities to be passed to the webdriver instance.
   capabilities: {
      'browserName': 'chrome'
   },
   // Spec patterns are relative to the location of the spec file. They may
   // include glob patterns.
   suites: {
      homepage: 'tests/e2e/homepage/**/*Spec.js',
      search: ['tests/e2e/contact_search/**/*Spec.js',
         'tests/e2e/venue_search/**/*Spec.js']
   },

   // Options to be passed to Jasmine-node.
   jasmineNodeOpts: {
      showColors: true, // Use colors in the command line report.
   }
};

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

protractor protractor.conf.js --suite homepage

Точно так же мы можем запустить определенные наборы тестов с помощью команды следующим образом: