GitHub - avito-techgraphwalker Це репо для інструменту тестування на основі моделі GraphWalker

Ось опис доданих функцій.

репо

Розбийте на кілька графіків з однаковим контекстом

Передісторія цієї функції полягає в наступному - у самій бібліотеці вже можна розділити тестову модель на окремі файли, зв’язавши їх за допомогою механізму кроків SHARED. Більше інформації про цю функцію можна знайти на сайті розробників. Однак є деякі недоліки використання SHARED. Наприклад, важко контролювати узгодженість тегів SHARED. Якщо помилково буде оголошено про перехід у нікуди, буде важко налагодити таку модель.

Як рішення, що додало можливостей бібліотеки - нові ключові слова були додані до синтаксису опису моделі - INDEGREE та OUTDEGREE. Що це означає:

  • Додавання OUTDEGREE до вершини означає, що є перехід (ребро) із зазначеним іменем від цієї вершини до якоїсь іншої вершини поза графом.
  • Додавання мітки INDEGREE до вершини означає протилежне, а саме існування переходу (ребра) до поточної вершини з якогось зовнішнього графіка.

Функціональність INDEGREE та OUTDEGREE надає нам можливість розділити величезний графік тестової моделі на невеликі, чіткі підграфи. Під час запуску mvn graphwalker: generate-sources - він створює об'єднання всіх підграфів в один тимчасовий файл * .graphml і поміщає його в підкаталог/link (resources). Графік об'єднання може бути використаний:

  • генерувати кодові інтерфейси, що підлягають реалізації;
  • перевірити узгодженість тестової моделі;
  • для налагодження тестів.

Тестова модель, розділена на підграфи (порівняно з "монолітною" тестовою моделлю), має кращу ремонтопридатність. Наприклад, у випадку конфлікту злиття буде набагато простіше вирішити його в одному маленькому файлі підграфа, а не в одному величезному, монолітному файлі тестової моделі.

Використовуючи INDEGREE, ми можемо реалізувати деякі редакційні логіки, такі як:

Щоб не дублювати одну і ту ж команду для набору переходів в однаковий стан, а також мати можливість вказувати подібні команди для з’єднань OUTDEGREE → INDEGREE, було введено ключове слово SET.

![Приклад SET] (docs/SET keyword.png? Raw = true "Приклад ключового слова SET")

Спрощена інтеграція таймера у вершини

Шаблон згенерованого файлу Java змінено. Створені методи інтерфейсу на основі вершин тепер повертають логічне значення. Таким чином, будь-який метод, заснований на вершині, буде працювати доти, поки логіка інтерфейсу не поверне істину або не закінчиться час очікування.

Анотація @code із синтаксисом YEd

![@code анотація] (docs/code annotation.png? raw = true "@code annotation")

У деяких випадках інформації про генерований елемент (край або вершина) достатньо для генерації коду реалізації інтерфейсу. Ось як виглядатиме згенерований код для прикладу вище.

Однак слід зазначити, що ця функція призначена для згенерованих моделей, а не створених вручну.

Правило Правильний синтаксис Неправильний синтаксис
лише всередині блоку коментарів v_Vertex/* @code myCheck () * / @code myCheck () v_Vertex/* коментар * /
крапка з комою для розділення v_Vertex/* @code myCheck () будь-який коментар * / v_Vertex/* будь-який коментар @code myCheck () * /
немає логічних операторів зверху v_Vertex/* @code myCheck ("Текст") * / v_Vertex/* @code check1 () && check2 () * /
тільки рядок, число, булеве значення. v_Vertex/* @code myCheck ("1", "2") * / v_Vertex/* @code myCheck (- "2") * /
або інші методи як параметри e_Edge/* @code myAction ((String) valueOf (1)); * / e_Edge/* @code myAction ((Float) valueOf ("1.0")); * /
методи з однаковими іменами повертають те саме v_Vertex/* @code myCheck () */e_Edge/* @code myAction ((логічний) myCheck ()); * / v_Vertex/* @code myCheck ((логічне значення) myAction ()) */e_Edge/* @code myAction (); * /
ніяких інших анотацій v_Vertex/* *** TODO *** *// v_Vertex/* @code * /

Генератор контурів із підтвердженням доступності

![Генерація контуру] (docs/Path generation.bmp? Raw = true "генерація контуру з перевіренням доступності")

У наведеній вище моделі, щоб потрапити у v7, вам потрібно встановити необхідні значення захисних змінних e5, e6, e7. Єдиний законний шлях до v7 - зелений. Щоб встановити такий маршрут за допомогою AStarPath, нам довелося б описати додаткову точку v1, інакше генерується неправильний початок маршруту → v07 → v7, що спричинить виняток виконання.

Використовуючи org.graphwalker.core.generator.ShortestPath при генерації шляху, буде достатньо вказати лише кінцеву вершину.

Важливо зазначити, що згенеровані контури можуть містити лише унікальні вершини та ребра, тому такий маршрут, як A → B → A → C (цикли або цикли), не буде генеруватися.

Шаблон заводського методу для роз’єднання реалізації

Скажімо, існує модель, що складається з багатьох окремих підграф.

З реалізаціями такого масштабу стає складніше боротися зі зіткненнями імен, а також міняти окремі частини. Як альтернативу цьому рішенню, інтерфейс ContextFactory буде сформований у цільових/згенерованих джерелах, реалізуючи його, ви можете роз’єднати реалізації підграфов.

Параметризовані тести можуть значно зменшити розмір тестової моделі, а також зробити її набагато зручнішою для читання. Область між двома спеціально позначеними станами буде відтворено на стільки окремих автоматизованих тестів, скільки записів у наборі даних. Самі параметризовані автоматизовані тести можна запускати паралельно один одному, зменшуючи тим самим загальний час.

Різні типи параметризації

Для параметризації доступні як окремі ребра, так і частини графіка, побудовані з декількох ребер і вершин.

Щоб параметризувати один єдиний край, вам потрібно відредагувати його мітку в редакторі yEd. Для цього ви можете клацнути правою кнопкою миші на виділеному краї та вибрати «Додати мітку». Потім потрібно вставити код таблиці HTML. На жаль, yEd не надає зручних способів створення такого роду таблиць, тому вам доведеться редагувати HTML-код у самому редакторі. Детальніше про особливості yEd читайте тут і тут. Приклад таблиці можна взяти звідси та скопіювати через буфер обміну.

  • Набір даних із двома рядками з параметрами label і s_trg

  • Багаторядковий набір даних з параметрами label, s_trg, AB_test

Попередження - підтримуються лише типи даних "Рядок", "Логічна", "Числова" (int/double). У кожному стовпці можна оголосити лише один тип даних. Параметр типу String може бути оголошений як одне слово або, якщо він складається з декількох слів, цитується як - "приклад тестового рядка з пробілами" .

Для того, щоб параметризувати лінійний переріз графіка (як щупальце восьминога), необхідно з'єднати дві точки розрізу графіка з новим ребром. Початкова точка або кореневий набір даних - це вершина, яка не буде параметризована. Фінал - це вершина, яка буде параметризована. Але в той же час всі переходи від цього краю більше не будуть параметризовані.

Єдина різниця між таким сполучним фронтом і попередньою версією полягає в тому, що в ньому нічого не оголошено, за винятком коду таблиці HTML. Він не містить ні назви краю, ні опису тексту, ні ваги чи інших параметрів.

  • Дворядковий набір даних з параметрами label і s_trg

Для всіх параметризованих елементів - ребер та вершин всередині розділу графіка, включаючи кінцеву вершину, бібліотека graphwalker генеруватиме подібні методи

Належні аргументи методу будуть передані під час виконання.