Руководство по тестированию транзакций Move
Tags: tutorial, blockchain, aptos, move
Published: 2022-08-25 12:32:59

> **ИССЛЕДУЕМАЯ ФУНКЦИЯ**
> Тестирование транзакции Move, описанной в этом документе, находится на стадии разработки. Поддержка этой функции будет зависеть от ее использования и принятия сообществом Aptos.

Если вы являетесь разработчиком смарт-контрактов на языке Move, то вы можете использовать тестирование транзакции Move для создания и запуска end-to-end тестов.

В этом руководстве описаны шаги по созданию и запуску end-to-end тестированию транзакции Move с помощью Aptos CLI.

- [Руководство по установке Aptos CLI](https://dev.to/egormajj/rukovodstvo-po-ustanovkie-aptos-cli-2i85)
- [Руководство по использованию Aptos CLI](https://dev.to/egormajj/rukovodstvo-po-ispolzovaniiu-aptos-cli-2lln)

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

## Обзор

Как выглядит тестирование транзакции Move, смотрите в папке `aptos_test_harness` [GitHub](https://aptos.dev/guides/move-guides/guide-move-transactional-testing#:~:text=See%20this%20aptos_test_harness-,GitHub%20folder,-for%20how%20Move).

Набор для тестирования транзакции Move состоит из двух типов файлов:

- Файлы Move с расширением `*.move`. Эти файлы Move содержат тестирование транзакции. Тестирование транзакции - это команды Rust [clap](https://docs.rs/clap/latest/clap/) (Command Line Argument Parser). Они записываются в виде символов в файлах Move. Чтобы отличить их от обычных символов Move, команды тестирование транзакции снабжаются специальным индикатором строки символов `//#` .
- Файлы базовой линии с расширением `*.exp` extension. Эти базовые файлы будут созданы пустыми при первом запуске `aptos` CLI. Если вы запустите тест с опцией `UB=1` в первый раз, файлы базовой линии будут заполнены результатами теста.

## Быстрый запуск

Прежде чем вникать в детали, вы можете выполнить следующие шаги, чтобы запустить образец для тестирования транзакции Move и посмотреть результаты.

**Шаг 1. Установите Aptos CLI**

Убедитесь, что вы установили `aptos` , инструмент Aptos CLI. Как установить и использовать инструмент `aptos` CLI, смотрите 👇 .

- [Руководство по установке Aptos CLI](https://dev.to/egormajj/rukovodstvo-po-ustanovkie-aptos-cli-2i85)
- [Руководство по использованию Aptos CLI](https://dev.to/egormajj/rukovodstvo-po-ispolzovaniiu-aptos-cli-2lln)

**Шаг 2. Запустите набор тестов Move transactional test suite**

- Клонируйте или загрузите репозиторий `aptos-core` на [GitHub](https://aptos.dev/guides/move-guides/guide-move-transactional-testing#step-2-run-the-move-transactional-test-suite:~:text=the%20aptos%2Dcore-,GitHub%20repo,-.).
- Набор тестов Move transactional находится в `aptos-core/aptos-move/aptos-transactional-test-harness/test` .
- Запустите команду `aptos` CLI с опцией `move transactional-test`

> **ИСПОЛЬЗОВАТЬ UB=1**
> При запуске команды `aptos` CLI убедитесь, что вы включили `UB=1` только в первый раз или если вы **обновили тесты**, как показано ниже.

```javascript
UB=1 aptos move transactional-test --root-path aptos-core/aptos-move/aptos-transactional-test-harness/test
```

- Параметр `--root-path` указывает, где находятся все тесты.
- Запуск теста проходит по иерархии каталогов и находит тесты, указанные в виде символов со специальным префиксом `//#`, в файлах, имена которых заканчиваются на `.move` или `.mvir`.
- Программа тестирование транзакции Move запускает тесты и сравнивает результаты тестов с базовыми файлами. В базовых файлах хранится содержимое результатов, которые были получены во время первого запуска.

## Примеры

В этом разделе представлены примеры, показывающие, как создать и запустить различные команды для тестирования транзакции Move.

**Создание учетной записи**

```javascript
//# create_account —name Alice [--initial-coins 10000]
```
Команда `create_account` генерирует детерминированную пару закрытый ключ, открытый ключ и создает именованный адрес учетной записи (Alice в приведенном выше примере).

> **ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ**
> Начальные coins могут быть заданы, в противном случае используется значение по умолчанию 10000.

**Публикация модулей**

```javascript
//# publish [--gas-budget 100]
module Alice::first_module {
    public entry fun foo() {
        return
    }
}
```
Команда `publish` публикует модуль Move на указанную учетную запись (Alice в приведенном выше примере). По желанию, количество единиц газа, разрешенное для публикации транзакции, может быть указано через `--gas-budget`.

> **ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ**
> Значение по умолчанию - это максимальное количество coins, доступное на учетной записи отправителя.

**Запуск функций скрипта модуля**

```javascript
//# run --signers Alice [--args x"68656C6C6F20776F726C64"] [--type-args "0x1::aptos_coin::AptosCoin"] [--expiration 1658432810] [--sequence-number 1] [--gas-price 1] [--show-events] -- Alice::first_module::function_name
```
Команда `run` запускает функцию скрипта модуля путем отправки транзакции.

В приведенном выше примере:

- `--signers` указывают, кто подписывает и отправляет транзакцию.
- `Alice::first_module::function_name` - полное имя функции модуля Move.
- `--args` указывают аргументы, которые нужно передать скрипт-функции.
- `--type-args` указывает аргументы типа, если скрипт-функция является родовой функцией.
- `--expiration`- время истечения срока действия транзакции.
- `--sequence-number` номер последовательности учетной записи.
- `--gas-price` цена единицы газа.
- `--show-events` выводит события транзакции, если они указаны.

**Выполнение скриптов**

```javascript
//# run --script --signers Alice [--args x"68656C6C6F20776F726C64"] [--type-args "0x1::aptos_coin::AptosCoin"] [--expiration 1658432810] [--sequence-number 1] [--gas-price 1]
script {
    use aptos_framework::coin;
    use aptos_framework::aptos_coin::AptosCoin;

    fun main(sender: &signer, receiver: address, amount: u64) {
        coin::transfer<AptosCoin>(sender, receiver, amount);
    }
}
```
Команду `run` можно также использовать с опцией `--script` для выполнения скрипта.

Просмотр ресурсов

```javascript
//# view_resource --address Alice --type 0x1::coin::CoinStore<0x1::test_coin::TestCoin> [--field coin.value]
```
`View_resource` выводит ресурсы, содержащиеся по адресу.

- `--address` учетной записи, чьи ресурсы должны быть опубликованы.
- `--type` тип ресурса, который должен быть опубликован.
- `--field` публикует только указанное поле.

Просмотр таблиц

```javascript
//# view_table --table_handle 5713946181763753045826830927579154558 --key_type 0x1::string::String --key_value x"68656C6C6F20776F726C64" --value_type 0x1::token::Collection 
```
`View_table` выводит элемент в таблице по ключу элемента. Например, в приведенном ниже коде Move:

```javascript
struct Collections has key {
    collections: Table<string::String, Collection>,
}
```

- В хранилище таблица `collections` имеет handle, хранящийся в ресурсе `Collections`.
- Чтобы запросить элемент таблицы по ключу, нам необходимо знать информацию о handle таблицы `--table_handle` `5713946181763753045826830927579154558`.
- `table_handle` - это handle таблицы, к которой выполняется запрос. Он может быть найден командой `view_resource`.
- Параметр `--key_type` - это информация о типе ключа. Чтобы получить значение ключа, используйте опцию `view_table` с параметрами `--key_type` и `--key_value`.
- Значение `--key_value` - это ключ, который используется для получения значения.
- `Key_type` используется для десериализации `key_value` для получения необработанного ключа, который может быть использован для запроса к хранилищу.
- Параметр `--value_type` - информация о типе для десериализации значения таблицы. Возвращаемое значение хранилища также должно быть десериализовано, чтобы быть полезным. Поэтому `--value_type` также необходим.