# Assertion

**Assertion** узел - это узел, используемый для написания тестов. Каждый **Assertion** узел состоит из набора **Assertion**-ов - минимальных проверок различных утверждений. При запуске **Assertion** узла запускается проверка всех **Assertion**-ов. Если хотя бы одна проверка завершится с ошибкой, то выполнение всего **Assertion** узла завершается с ошибкой.&#x20;

**Assertion** узел может быть создан как потомок [RequestStep](https://docs-ru.testmace.com/node-types/requeststep) узла, либо как самостоятельный узел. Причем [RequestStep](https://docs-ru.testmace.com/node-types/requeststep) узел может имет не более одного **Assertion** узла в качестве потомка.

Создать **Assertion** узел можно следующими способами: из дерева проекта в контекстном меню [RequestStep](https://docs-ru.testmace.com/node-types/requeststep) узла выбрать **Add node** -> **Assertion.** Либо в секции ответа [RequestStep](https://docs-ru.testmace.com/node-types/requeststep) узла во вкладке Assertion выбрать **+ CREATE NEW ASSERTION NODE**.

![](https://1540441421-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lh_FaVh9XfQJ0p1KqZ1%2F-M2Sk7THxphw3vU2CDVz%2F-M2T9B9Xe_ko_bAnchnA%2FTestMace%202020-03-15%2016.25.37.png?alt=media\&token=c2d67250-0de9-492e-8dca-187407c23edb)

В дереве проекта **Assertion** узел выглядит следующим образом:

![](https://1540441421-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lh_FaVh9XfQJ0p1KqZ1%2F-M2Sk7THxphw3vU2CDVz%2F-M2T9_siaCP6psfTX_Xb%2FTestMace%202020-03-15%2016.27.55.png?alt=media\&token=d660c3c3-1b7d-47a2-8cb1-6e2d52340b9f)

Если запуск **Assertion** узла завершился успешно, то в дереве он принимает следующий вид:

![](https://1540441421-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lh_FaVh9XfQJ0p1KqZ1%2F-M2Sk7THxphw3vU2CDVz%2F-M2T9jfi_x53Nzud58v3%2FTestMace%202020-03-15%2016.28.35.png?alt=media\&token=95d39fd0-cbc7-4512-b6fe-0c7250ad83f5)

В случае, если запуск **Assertion** узла завершился с ошибкой, узел выглядит так:

![](https://1540441421-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lh_FaVh9XfQJ0p1KqZ1%2F-M2Sk7THxphw3vU2CDVz%2F-M2T9x3EL17536xmIgpK%2FTestMace%202020-03-15%2016.29.23.png?alt=media\&token=c7406bcd-247a-45b3-923f-bc6e946b1962)

В дереве для данного типа узла доступны следующие пункты меню:

![](https://1540441421-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lh_FaVh9XfQJ0p1KqZ1%2F-M2Sk7THxphw3vU2CDVz%2F-M2TAACn_y_NplaPFGCl%2FTestMace%202020-03-15%2016.30.02.png?alt=media\&token=9e49d5f0-a109-4ffc-83e9-3e11c0861b5c)

* **Remove node.** Удалить узел.
* **Run.** Запустить узел.
* **Show in explorer.** Открыть папку с узлом в файловом менеджере.

Вкладка с **Assertion** узлом выглядит следующим образом:

![](https://1540441421-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lh_FaVh9XfQJ0p1KqZ1%2F-M2Sk7THxphw3vU2CDVz%2F-M2TE0NdZV0ZLWbl12Ok%2FTestMace%202020-03-15%2016.31.27\(edit\).png?alt=media\&token=82d2e3b3-823d-43a3-ba39-f5d69676d596)

На скрине отмечены следующие области:

1. Панель управления
2. Панель настроек выбранного **Assertion**-а
3. Список **Assertion**-ов

На панели управления расположены следующие кнопки

* **RUN** - запуск списка **Assertion**-ов
* **FIX ERRORS** - исправление ошибок **Assertion**-ов где это возможно. Данная кнопка активируется в случае, если есть ошибки в **Assertion**-ах. Функционал исправления ошибок описан в разделах **Исправление ошибок** каждого из **Assertion**-ов.
* **DISABLE ERRORS** - выключение **Assertion**-ов, завершившихся с ошибкой. Отключенные **Assertion**-ы не будут участвовать в дальнейших запусках. Данная кнопка активируется в случае, если есть ошибки в **Assertion**-ах
* **+ ADD ASSERTION** - добавление **Assertion** в список

Ниже панели управления находится список **Assertion**-ов. Каждый элемент в данном списке выглядит следующим образом:

![](https://1540441421-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lh_FaVh9XfQJ0p1KqZ1%2F-M2Sk7THxphw3vU2CDVz%2F-M2THhkhc6ecEUS-Z9hS%2FTestMace%202020-03-15%2016.53.55\(edit\).png?alt=media\&token=139799aa-5119-43b6-92a4-aa64f0a6bbab)

На скрине отмечены следующие области:

1. Подсветка статуса. Если **Assertion** не запускался, то его цвет серый, если запуск завершился с ошибкой - красный, если успешно - зеленый
2. Место для захвата и перетаскивания элемента
3. Иконка конкретного типа **Assertion**-а
4. Краткое текстовое представление **Assertion**-а
5. Кнопка для отображения/скрытия подробностей о произошедших ошибках&#x20;
6. Удалить **Assertion**
7. Задизейблить **Assertion**. При этом не будет участвовать в последующих запусках
8. Запустить **Assertion**
9. Исправить **Assertion**

{% hint style="info" %}
Заметим, что контролы 6, 7, 8 и 9 появляются при наведении на **Assertion**.
{% endhint %}

Интерфейс панели настроек выбранного **Assertion**-а зависит от выбранного **Assertion**-а. В следующих разделах мы подробно разберем каждый из **Assertion**-ов.

Все Assertion имеют общее поле `Name` для описания назначения данной проверки. Если поле оставить пустым, то будет задано описание по-умолчанию в зависимости от свойств assertion-а.

### Шаблонный Assertion

Начиная с версии 1.0.0 Assertion узел можно создавать без привязки к RequestStep как любой другой узел в проекте. Его можно использовать с целью проверки результатов работы нескольких запросов, либо как шаблон, в котором будет описан ряд типичных проверок для каждого запроса.&#x20;

В отличии от Assertion-а, который привязан к RequestStep и наследует его контекст (переменные, динамические переменные, response), шаблонный Assertion получает во время запуска контекст того узла, который ссылается на данный шаблон. Контекст сохраняется во встроенную переменную `$host` и инициализируется только после запуска.

Отдельный запуск шаблонного Assertion становится нецелесообразным, поскольку в нем отсутствует контекст и все проверки заведомо провалятся. По этой причине TestMace отключает возможность самостоятельного запуска такого узла и пропускает его при выполнении сценария, в котором тот находится.&#x20;

Для отладки в интерфейсе шаблона отображается имя узла, который последним запускался и передавал свой контекст в шаблон. В таком случае будет доступна подсветка значений и автоподстановка в выражениях, содержащих переменную `$host`

![Пример шаблонного Assertion узла](https://1540441421-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lh_FaVh9XfQJ0p1KqZ1%2F-M2Sk7THxphw3vU2CDVz%2F-M2TIrdD_G9xkFaIP4Lo%2FTestMace%202020-03-15%2017.08.03.png?alt=media\&token=ce8b31aa-aae0-4948-a4b3-eee941ef78f9)

Подробнее об использовании самостоятельного узла Assertion как шаблона и примеры смотрите в разделе [Link Assertion](https://docs-ru.testmace.com/node-types/assertion/link-assertion).

### Файловое представление

**Assertion** узел хранится в файле \<nodename>.yml, где \<nodename> - название Assertion-а и имеет следующий формат:

```javascript
{
  "type": "object",
  "properties": {
    "type": {
      "description": "Type of Assertion node",
      "const": "Assertion",
      "type": "string"
    },
    "assertions": {
      "description": "List of assertions",
      "type": "array",
      "items": {
        "$ref": "#/definitions/AbstractAssertion"
      },
      "default": []
    },
    "children": {
      "description": "List of children names",
      "type": "array",
      "items": {
        "type": "string"
      },
      "default": []
    },
    "variables": {
      "$ref": "#/definitions/NodeVariables",
      "description": "Node variables dictionary"
    },
    "name": {
      "description": "Node name",
      "type": "string"
    }
  },
  "required": [
    "assertions",
    "children",
    "name",
    "type",
    "variables"
  ],
  "definitions": {
    "AbstractAssertion": {
      "oneOf": [
        {
          "$ref": "#/definitions/CompareAssertion"
        },
        {
          "$ref": "#/definitions/ContainsAssertion"
        },
        {
          "$ref": "#/definitions/XPathAssertion"
        },
        {
          "$ref": "#/definitions/ScriptAssertion"
        }
      ]
    },
    "CompareAssertion": {
      "type": "object",
      "properties": {
        "type": {
          "description": "Type of Compare assertion",
          "const": "compare",
          "type": "string"
        },
        "actualValue": {
          "description": "Actual value",
          "type": "string",
          "default": "${$response.body}"
        },
        "operator": {
          "$ref": "#/definitions/CompareOperator",
          "description": "Operator",
          "default": "equal"
        },
        "expectedValue": {
          "description": "Expected value",
          "type": "string"
        },
        "disabled": {
          "type": "boolean",
          "default": false
        }
      },
      "required": [
        "actualValue",
        "disabled",
        "expectedValue",
        "operator",
        "type"
      ]
    },
    "CompareOperator": {
      "enum": [
        "equal",
        "greater",
        "greater or equal",
        "less",
        "less or equal",
        "not equal"
      ],
      "type": "string"
    },
    "ContainsAssertion": {
      "type": "object",
      "properties": {
        "type": {
          "description": "Type of Contains assertion",
          "const": "contains",
          "type": "string"
        },
        "text": {
          "description": "Text to be searched",
          "type": "string",
          "default": "${$response.body}"
        },
        "value": {
          "description": "Value for search in text",
          "type": "string"
        },
        "disabled": {
          "type": "boolean",
          "default": false
        }
      },
      "required": [
        "disabled",
        "text",
        "type",
        "value"
      ]
    },
    "XPathAssertion": {
      "type": "object",
      "properties": {
        "type": {
          "description": "Type of Xpath assertion",
          "const": "xpath",
          "type": "string"
        },
        "text": {
          "description": "Text to be searched",
          "type": "string",
          "default": "${$response.body}"
        },
        "path": {
          "description": "XPath selector",
          "type": "string"
        },
        "expectedValue": {
          "description": "Expected value",
          "type": "string"
        },
        "disabled": {
          "type": "boolean",
          "default": false
        }
      },
      "required": [
        "disabled",
        "expectedValue",
        "path",
        "text",
        "type"
      ]
    },
    "ScriptAssertion": {
      "type": "object",
      "properties": {
        "type": {
          "description": "Type of Script assertion",
          "const": "script",
          "type": "string"
        },
        "script": {
          "description": "Assertion script",
          "type": "string",
          "default": "`function test(assertion, variables) {\n  // It should return true if test is passed\n  // return true;\n}`"
        },
        "disabled": {
          "type": "boolean",
          "default": false
        }
      },
      "required": [
        "disabled",
        "script",
        "type"
      ]
    },
    "NodeVariables": {
      "type": "object",
      "additionalProperties": {
        "type": "string"
      }
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}
```
