Являются ли функции в объектах страниц хорошей практикой для больших проектов? - PullRequest
0 голосов
/ 06 ноября 2018

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

Основной вопрос: куда поместить функции, используемые более чем одним тестом? Какой из этих методов является правильным? (po = файл объекта страницы)

  1. Функции без ожидающих / утверждающих команд должны быть в po и другие в вспомогательных файлах (1 вспомогательный файл на компонент / функциональность)

  2. Все функции в файле помощника

  3. Функции без ожидающих / утверждающих команд в po, а другие команды должны быть просто записаны в самом тесте (в этот момент некоторый тестовый файл может иметь около 700+ строк)

Я был бы очень признателен, если бы кто-нибудь дал мне представление о том, какой путь является правильным

p.s. Использование javascript / машинописного текста, селенового веб-драйвера, транспортира, жасмина для веб-автоматизации

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

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

"use strict";
/*********************************************
 *  Imports
 *********************************************/
const users = require("page-objects/users");
const {logIn, logOut} = require("actions/actions");
const editUser = require("page-objects/dialogs/edit-user");

/*********************************************
 *  E2E Test
 *********************************************/
describe("Suite: Right for export", () => {

    beforeAll(async () => await logIn("user-list"));
    afterAll(async () => await logOut());

    it("Case - Export enabled", async () => {

        await users.searchFor("testuser12");
        await users.clickEditLink("testuser12");
        await editUser.enableExport(true);
        await editUser.update();

        expect(await users.getCellValue("Is Export Enabled")).toBe("YES");
    });
});

1) Что входит в объекты страницы?

Как видите, я предпочитаю завершать действия в своих тестах. Таким образом searchFor нажимает на поле поиска, очищает его, набирает переданную строку, нажимает ввод и затем вызывает функцию ожидания, которая ждет, пока поиск не будет применен. Но если ни один технический специалист не хочет идти по шагам вручную, он, вероятно, догадывается, что ему нужно выполнить все вышеперечисленное, чтобы что-то искать. Вот почему все, что для них не важно, уходит за кулисы в Page-Objects.

2) Должны ли объекты страницы включать функции?

Почему бы и нет? :) Допустим, у меня есть всплывающее окно, которое меняет права пользователя. Помимо всех локаторов, перечисленных в объекте страницы (отдельный файл от теста), я могу включить действия, которые я выполняю с ним Допустим, что selectOption () будет щелкать раскрывающийся список-> выбрать параметр-> подтвердить. Или вы хотите нажать кнопку «Обновить» и подождать, пока диалоговое окно не исчезнет. Это все примеры методов, которые у меня есть в моем ПО. Посмотрите на синтаксис: если кто-то нетехнический видит editUser.enableExport(true);, он может выяснить по имени объекта, в котором он находится (на какой странице выполняется действие) - здесь всплывающее окно editUser, тогда метод не требует пояснений. что он делает - включает экспортное право (или отключает, если передано false), а затем вы перечисляете параметры внутри () - true или false. Но старайтесь избегать ожиданий в ваших заказах, потому что для этого нужны тесты.

3) Как структурировать файлы?

Вероятно, все, что больше 700 строк, должно быть разделено. Но это не правило, скорее мой опыт. Создайте один файл на компонент, иногда на страницу. Но, например, если у страницы есть всплывающее окно, это, вероятно, отдельные объекты страницы. Для организации кода используйте js-классы, функции конструктора (ищите их). И тогда вы можете назначить глобальные переменные, если ваш конфиг, который указывает на эти файлы. Или, как я сделал, требуются необходимые компоненты перед каждым тестом - более долгий путь, но все в одном месте.

Удачи!

0 голосов
/ 07 ноября 2018
  1. Разделить каждую страницу на небольшой компонент по бизнес-логике, области страницы или области функций.

  2. Определить селекторы, функцию для управления элементом, функции для проверки каждого компонента в отдельном файле.

  3. Определить файл для страницы для ссылки на компоненты.

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

Структура папок:

Project Folder
  |
  -- PageA foler
     CompA.ts
     CompB.ts
     ...
     index.ts

// Index.ts

class PageA {

   public compA;
   public compB;

   contructor() {
      this.compA = new CompA()
      this.compB = new CompB()
   }
}

export = new PageA();

// Жасмин test-compA.ts

pageA.compA.inputUserName();
pageA.compB.clickLogin();
pageA.compB.verify...();

// Жасмин test-pageA.ts

...