Написання тестів за допомогою 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()
. - Опишіть дії, які повинен виконати ваш
Contract
, і збережіть результат виконання у зміннійres
. - Перевірте властивості за допомогою функції
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:
- [Урок 2: Тестування FunC для смарт-контракту] (https://github.com/romanovichim/TonFunClessons_Eng/blob/main/lessons/smartcontract/2lesson/secondlesson.md)
- [TON Hello World частина 4: Покрокове керівництво для тестування вашого першого смарт-контракту] (https://ton-community.github.io/tutorials/04-testing/)
- TON Smart Contract Pipeline
- [[YouTube]Шостий урок FunC & Blueprint. Газ, збори, тести]] (https://youtu.be/3XIpKZ6wNcg)
Приклади
Ознайомтеся з наборами тестів, які використовуються для контрактів TON Ecosystem, і навчіться на прикладах.
- випробування в пісочниці з рідинно-контрактним підрядом
- governance_tests
- JettonWallet.spec.ts
- governance_tests
- MassSender.spec.ts
- TonForwarder.spec.ts
- Assurer.spec.ts