# Assertion

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

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

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

![](/files/-M2T9B9Xe_ko_bAnchnA)

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

![](/files/-M2T9_siaCP6psfTX_Xb)

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

![](/files/-M2T9jfi_x53Nzud58v3)

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

![](/files/-M2T9x3EL17536xmIgpK)

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

![](/files/-M2TAACn_y_NplaPFGCl)

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

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

![](/files/-M2TE0NdZV0ZLWbl12Ok)

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

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

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

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

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

![](/files/-M2THhkhc6ecEUS-Z9hS)

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

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 узла](/files/-M2TIrdD_G9xkFaIP4Lo)

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

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

**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#"
}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs-ru.testmace.com/node-types/assertion.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
