Написание тестов с помощью Blueprint
Обзор
Инструментарий для тестирования (обычно это песочница) уже включен в TypeScript SDK под названием Blueprint. Вы можете создать демо-проект и запустить тест по умолчанию в два этапа:
- Создайте новый проект Blueprint:
npm create ton@latest MyProject
- Проведите тест:
cd MyProject
npx blueprint test
В результате Вы увидите соответствующий вывод в окне терминала:
% npx blueprint test
> MyProject@0.0.1 test
> jest
PASS tests/Main.spec.ts
Main
✓ should deploy (127 ms)
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 1.224 s, estimated 2 s
Ran all test suites.
Базовое использование
Тестирование смарт-контрактов позволяет обеспечить безопасность, оптимизировать расход газа и изучить крайние случаи. Написание тестов в Blueprint (основанном на Sandbox) осуществляется путем определения произвольных действий с контрактом и сравнения результатов тестирования с ожидаемым результатом, например:
it('should execute with success', async () => { // description of the test case
const res = await main.sendMessage(sender.getSender(), toNano('0.05')); // performing an action with contract main and saving result in res
expect(res.transactions).toHaveTransaction({ // configure the expected result with expect() function
from: main.address, // set expected sender for transaction we want to test matcher properties from
success: true // set the desirable result using matcher property success
});
printTransactionFees(res.transactions); // print table with details on spent fees
});
Написание тестов для сложных утверждений
Основная схема создания теста такова:
- Создайте определенную обернутую сущность
Contract
с помощью функцииblockchain.openContract()
. - Опишите действия, которые должен выполнить Ваш
контракт
, и сохраните результат выполнения в переменнойres
. - Проверьте свойства с помощью функции
expect()
и матчераtoHaveTransaction()
.
Матчер toHaveTransaction
ожидает объект с любой комбинацией полей из типа FlatTransaction
, определенных со следующими свойствами
Имя | Тип | Описание |
---|---|---|
с сайта | Адрес? | Контрактный адрес отправителя сообщения |
на | Адрес | Контрактный адрес назначения сообщения (альтернативное имя свойства to ). |
значение | bigint? | Количество Тонкоинов в сообщении в нанотонах |
тело | Клетка | Тело сообщения определяется как ячейка |
op | число? | Код операции - это номер идентификатора операции (обычно crc32 из TL-B). Ожидается в первых 32 битах тела сообщения. |
успех | булево? | Пользовательский флаг песочницы, определяющий результирующий статус определенной транзакции. True - если фаза вычислений и действий прошла успешно. В противном случае - False. |
Вы можете опустить поля, которые Вас не интересуют, и передать функции, принимающие типы, возвращающие булевы (true
означает "хорошо"), для проверки, например, диапазонов чисел, опкодов сообщений и т.д. Обратите внимание, что если поле является необязательным (например, from?: Address
), то функция должна принимать и необязательный тип.
Весь список полей матчера Вы можете узнать из Документации по песочнице.
Конкретный набор тестов
Извлечение SendMode
Чтобы извлечь режим отправки отправленного сообщения, Вы можете использовать следующий код:
const smc = await blockchain.getContract(addr);
const re = blockchain.executor.runTransaction({
config: blockchain.configBase64, libs: null, verbosity: 'full',
now: Math. floor (Date.now) / 1000),
lt: BigInt(Date.now()),
randomSeed: null,
ignoreChksig: false,
debugEnabled: true,
shardAccount: beginCell()
.store (storeShardAccount (smc.account))
.endCell()
.toBoc()
.toString('base64'),
message: beginCell()
.store (storeMessageRelaxed (...))
.endCell(),
});
if (!re.result. success || !re.result.actions) {
throw new Error('fail');
}
const actions = loadoutList(Cell.fromBase64(re.result.actions).beginParse());
actions[0].type === 'sendMsg' && actions[0].mode;
Учебники
Узнайте больше о тестировании из самых ценных уроков сообщества на TON:
- Урок 2: Тестирование FunC для смарт-контракта
- TON Hello World часть 4: Пошаговое руководство по тестированию вашего первого смарт-контракта
- TON Smart Contract Pipeline
- [YouTube]Шестой урок FunC & Blueprint. Газ, оплата, тесты
Примеры
Проверьте тестовые наборы, используемые для контрактов экосистемы TON, и учитесь на примерах.
- тесты песочницы liquid-staking-contract
- governance_tests
- JettonWallet.spec.ts
- governance_tests
- MassSender.spec.ts
- TonForwarder.spec.ts
- Assurer.spec.ts