@vr1/be-driven-syntax-sugar 2.0.2 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,7 +1,30 @@
1
1
  # @vr1/be-driven-syntax-sugar
2
-
3
2
  Синтаксический сахар, для того чтобы тесты, такие как pw или jest, писать в виде bdd тестов.
4
3
 
4
+ # Мотивация
5
+ Цель появления этой библиотеки - получить преимущества подхода к тестированию через given-when-then, известного как Behavior Testing
6
+ или Behavior Driven Development, и при этом не получить недостатков "главного" фреймворка этот подход воплощающего - cucumber.
7
+
8
+ Подход BDD предполагает следующие преимущества:
9
+ 1. Описание тестов бизнес-языком (как противопоставление техническому языку)
10
+ 2. Разбитие тестов на отчётливые шаги/степы даёт переиспользование и пермутабельность. Пермутабельность это возможность составить новые тесты, например edge-кейсы, с использованием уже существующих степов без написания новых или с минимальным их написанием.
11
+ 3. Сам подход разбития на степы даёт возможность добавления вариативности в тесты. Это преимущество не воплощено в cucumber/gherkin, но теоретически всегда было возможно. Но воплощено здесь.
12
+
13
+ Недостатки фреймворка cucumber, в частности языка gherkin: для описания последовательности тестов используется текстовый язык, и для привязки степов в коде к мнемоникам в тесте используются регулярные выражения. Изначально задумывалось, что язык gherkin позволит писать тесты не-программистам, т.е. бизнес-аналитикам, продукт-овнерам, тестировщикам-мануальщикам. Однако, по факту,
14
+ во всех проэктах, где я работал, не-программисты всегда сопротивляются этому и активно отказываются в этом участвовать, а то и вовсе саботируют эту возможность. Отсюда получается, что gherkin не дал того для чего был задуман, но привнёс сложности, которые не нужны тем людям, кто реально пишет тесты - программистам и тестировщикам-автоматизаторам. Сложности заключаются в следующем:
15
+ 1. Для матчинга используются регулярные выражения, которые добавляют некоторую когнитивную сложность сами по себе.
16
+ 2. Неочевидные ошибки, когда две регулярки могут поматчиться на мнемонику или наоборот ни одна, и тест, который должен бы работать - не работает.
17
+ 3. Все степы становятся "глобальными", что накладывает на них дополнительные требования, их нужно писать "более универсальными", чтобы они работали в максимально возможном количестве комбинаций
18
+ 4. Глобальность также добавляет проблему пересечения контекстов, где степы, которые имеют похожее "звучание", и можно по ошибке вставить мнемонику принадлежащую "чужому контексту", и также получить нерабочий тест
19
+ 5. Поскольку язык текстовый, то сильно ограничена возможность передачи параметров, они могут представлять из себя только строку или число. Есть также механизм передачи таблиц (состоящих также из строк и чисел), но он просто ужасен, пользоваться им неудобно.
20
+
21
+ От этих недостатков свободна библиотека @vr1/be-driven а также её аналог - адаптер к существующим тест-раннерам - @vr1/be-driven-syntax-sugar
22
+ 1. Степы это обычные TS функции и для их использования нужно явно заимпортировать нужный степ и вставить в функцию given, when или then.
23
+ 2. Уровень "глобальности" может определить сам разработчик, можно сделать как глобальные шаги, так и локальные, которые можно использовать только в контексте тестов определённой фичи или группы фич
24
+ 3. Параметром могут быть не только строки и числа, но и enum, массивы, POJO объекты, и вообще любые типы данных доступные в TS. Тут хочется порекомендовать разработчику не злоупотреблять этой возможностью, и не использовать в качестве параметров степов такие сущности, как например стримы или сервисы, т.е. не скатываться на обратную сторону этой монеты.
25
+
26
+ todo дописать ридми
27
+
5
28
  # ограничение
6
29
  Тест может быть только асинхронным, хотя шаги могут быть и синхронными.
7
30
 
@@ -26,7 +26,7 @@ async function runSteps(options, testName, steps) {
26
26
  options = { ...defaultOptions, ...options };
27
27
  const store = {};
28
28
  Object.assign(store, options.initialData);
29
- options.testWrapper(testName, async (data) => {
29
+ await options.testWrapper(testName, async (data) => {
30
30
  Object.assign(store, data);
31
31
  for (let step of steps) {
32
32
  const stepType = step.and ? "And" : step.stepType;
@@ -1 +1 @@
1
- {"version":3,"file":"runTest.js","sourceRoot":"","sources":["../../src/testScenario/runTest.ts"],"names":[],"mappings":";;AASA,0BAKC;AAaD,4BAkBC;AA7CD,0DAAiD;AAIjD,MAAM,cAAc,GAAoB;IACtC,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE;IACzC,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE;CAChD,CAAC;AAEF,SAAgB,OAAO,CAAC,OAAwB,EAAE,IAAU;IAC1D,OAAO,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,OAAO,EAAE,CAAC;IAC5C,MAAM,KAAK,GAAG,IAAA,2BAAS,EAAkB,IAAI,CAAC,KAAK,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IAC9E,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,OAAwB,EAAE,QAAgB,EAAE,IAAyB;IAC9F,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAC;IACzF,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACnF,MAAM,QAAQ,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,MAAM,CAAC,IAAqB;IACnC,OAAO,OAAa,IAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC;AAClD,CAAC;AAEM,KAAK,UAAU,QAAQ,CAAC,OAAwB,EAAE,QAAgB,EAAE,KAAiB;IAC1F,OAAO,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,OAAO,EAAE,CAAC;IAE5C,MAAM,KAAK,GAAG,EAAE,CAAC;IACjB,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAE1C,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE,KAAK,EAAC,IAAI,EAAC,EAAE;QACzC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC3B,KAAK,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAkB,CAAC;YAC5D,MAAM,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;gBAC5D,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC/D,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;YACnC,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;AAGL,CAAC"}
1
+ {"version":3,"file":"runTest.js","sourceRoot":"","sources":["../../src/testScenario/runTest.ts"],"names":[],"mappings":";;AASA,0BAKC;AAaD,4BAkBC;AA7CD,0DAAiD;AAIjD,MAAM,cAAc,GAAoB;IACtC,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE;IACzC,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE;CAChD,CAAC;AAEF,SAAgB,OAAO,CAAC,OAAwB,EAAE,IAAU;IAC1D,OAAO,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,OAAO,EAAE,CAAC;IAC5C,MAAM,KAAK,GAAG,IAAA,2BAAS,EAAkB,IAAI,CAAC,KAAK,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IAC9E,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,OAAwB,EAAE,QAAgB,EAAE,IAAyB;IAC9F,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAC;IACzF,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACnF,MAAM,QAAQ,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,MAAM,CAAC,IAAqB;IACnC,OAAO,OAAa,IAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC;AAClD,CAAC;AAEM,KAAK,UAAU,QAAQ,CAAC,OAAwB,EAAE,QAAgB,EAAE,KAAiB;IAC1F,OAAO,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,OAAO,EAAE,CAAC;IAE5C,MAAM,KAAK,GAAG,EAAE,CAAC;IACjB,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAE1C,MAAM,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE,KAAK,EAAC,IAAI,EAAC,EAAE;QAC/C,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC3B,KAAK,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAkB,CAAC;YAC5D,MAAM,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;gBAC5D,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC/D,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;YACnC,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;AAGL,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vr1/be-driven-syntax-sugar",
3
- "version": "2.0.2",
3
+ "version": "2.0.3",
4
4
  "description": "syntax sugar to write pw and jest tests in bdd style ",
5
5
  "repository": {
6
6
  "type": "git",
@@ -31,7 +31,7 @@ export async function runSteps(options: ScenarioOptions, testName: string, steps
31
31
  const store = {};
32
32
  Object.assign(store, options.initialData);
33
33
 
34
- options.testWrapper(testName, async data => {
34
+ await options.testWrapper(testName, async data => {
35
35
  Object.assign(store, data);
36
36
  for (let step of steps) {
37
37
  const stepType = step.and ? "And" : step.stepType as string;