Перейти до основного вмісту

Написання тестів за допомогою Blueprint

Огляд

Інструментарій для тестування (зазвичай пісочниця) вже включено до TypeScript SDK під назвою Blueprint. Ви можете створити демонстраційний проект і запустити тест за замовчуванням у два кроки:

  1. Створіть новий проєкт Blueprint:
npm create ton@latest MyProject
  1. Проведіть тест:
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
});

Написання тестів на складне твердження

Основний робочий процес створення тесту виглядає наступним чином:

  1. Створіть спеціальну обгорнуту сутність Contract за допомогою blockchain.openContract().
  2. Опишіть дії, які повинен виконати ваш Contract, і збережіть результат виконання у змінній res.
  3. Перевірте властивості за допомогою функції expect() та відповідника toHaveTransaction().

Відповідник toHaveTransaction очікує об'єкт з будь-якою комбінацією полів типу FlatTransaction, визначених з наступними властивостями

Ім'яТипОпис
відАдреса?Контрактна адреса відправника повідомлення
наАдресаКонтрактна адреса призначення повідомлення (Альтернативна назва властивості to).
значенняБіґінт?Кількість Toncoins у повідомленні в нанотонах
тілоCellТіло повідомлення визначено як комірка
opномер?Код операції - це номер ідентифікатора операції (зазвичай crc32 у TL-B). Очікується у перших 32 бітах тіла повідомлення.
успіхбулевий?Прапорець користувацької пісочниці, який визначає результуючий статус певної транзакції. True - якщо і обчислення, і фаза дії пройшли успішно. В іншому випадку - False.

Ви можете опустити поля, які вас не цікавлять, і передати функції, які приймають типи, що повертають булеві значення ("істина" означає "добре") для перевірки, наприклад, діапазонів чисел, опкодів повідомлень тощо. Зверніть увагу, що якщо поле є необов'язковим (наприклад, 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:

Приклади

Ознайомтеся з наборами тестів, які використовуються для контрактів TON Ecosystem, і навчіться на прикладах.

Дивіться також