ابزارهای تست و دیباگ قراردادها در سالیدیتی

ایجاد شده توسط دکتر مصطفی جلیلی در آموزش برنامه نویسی سالیدیتی 19 مه 2025
اشتراک گذاری

ابزارهای تست و دیباگ قراردادهای هوشمند در سالیدیتی | راهنمای کامل برای توسعه‌دهندگان Web3


تست و دیباگ یکی از مراحل حیاتی در فرآیند توسعه قراردادهای هوشمند است. برخلاف برنامه‌نویسی سنتی، خطا در یک قرارداد هوشمند می‌تواند باعث از دست رفتن دارایی‌ها شود. به همین دلیل استفاده از ابزارهای تست و دیباگ مانند Hardhat، Mocha/Chai، Ganache و Mock Contracts در توسعه با سالیدیتی امری ضروری است. در این مقاله با این ابزارها و روش استفاده از آن‌ها آشنا می‌شوید.




استفاده از Hardhat برای تست قراردادهای سالیدیتی


Hardhat یکی از محبوب‌ترین محیط‌های توسعه برای سالیدیتی است که امکان کامپایل، دیپلوی، تست و دیباگ قراردادهای هوشمند را در اختیار شما قرار می‌دهد.


 ویژگی‌های کلیدی Hardhat:

- اجرای سریع تست‌ها در شبکه محلی (in-memory Ethereum node)


- استفاده از اسکریپت‌های سفارشی برای دیپلوی و تعامل


- پشتیبانی از پلاگین‌های مفید مانند Ethers.js، Waffle، و Solidity Coverage


نصب Hardhat:


npm install --save-dev hardhat
npx hardhat

سپس پروژه را ایجاد و ساختار فایل‌ها را تنظیم کنید.




نوشتن تست‌های واحد با Mocha و Chai


Hardhat به‌صورت پیش‌فرض از Mocha (فریم‌ورک تست) و Chai (ابزار assertion) استفاده می‌کند. تست واحد (unit test) برای بررسی عملکرد توابع به‌صورت جداگانه کاربرد دارد.


مثال تست ساده برای یک توکن:


کد قرارداد:


// contracts/MyToken.sol
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract MyToken is ERC20 {
constructor() ERC20("TestToken", "TTK") {
_mint(msg.sender, 1000);
}
}

کد تست:


const { expect } = require("chai");
describe("MyToken", function () {
it("Should assign total supply to deployer", async function () {
const [owner] = await ethers.getSigners();
const Token = await ethers.getContractFactory("MyToken");
const token = await Token.deploy();
const balance = await token.balanceOf(owner.address);
expect(await token.totalSupply()).to.equal(balance);
});
});

نکات تست:

- هر تابع باید حداقل یک تست داشته باشد.

- از beforeEach برای تنظیم داده‌ها در هر تست استفاده شود.

- بررسی کنید که تمام مسیرهای منطقی پوشش داده شده باشند (Code Coverage).




استفاده از Mock Contract و تست تعاملات


در قراردادهای پیچیده، گاهی نیاز به شبیه‌سازی (mock) قراردادهای خارجی دارید تا رفتار تعامل با آن‌ها را تست کنید.


کاربرد Mock:

- تست قراردادهایی که وابسته به اوراکل، توکن یا سرویس‌های خارجی هستند.

- شبیه‌سازی پاسخ دلخواه از یک تابع خاص برای بررسی منطق داخلی قرارداد اصلی.


مثال با Waffle:


// MockPriceFeed.sol
pragma solidity ^0.8.0;
contract MockPriceFeed {
function getPrice() external pure returns (uint) {
return 2000;
}
}

سپس می‌توانید در تست‌ها، به‌جای قرارداد واقعی از MockPriceFeed استفاده کرده و تعامل قرارداد اصلی را بررسی کنید.




 استفاده از Ganache برای شبیه‌سازی شبکه


Ganache یک ابزار قدرتمند برای اجرای یک شبکه بلاک‌چین محلی است که توسط Truffle ارائه می‌شود. این ابزار برای تست‌های پیچیده و بررسی وضعیت تراکنش‌ها و گس بسیار کاربردی است.


ویژگی‌ها:

- ارائه 10 آدرس با اتر تستی از ابتدا

- بررسی دقیق گس مصرفی و جزئیات تراکنش

- رابط گرافیکی برای مشاهده وضعیت شبکه


نصب و راه‌اندازی:


npm install -g ganache
ganache

سپس در hardhat.config.js شبکه را به شکل زیر تنظیم کنید:


ganache: {
url: "http://127.0.0.1:8545",
accounts: ["PRIVATE_KEY"]
}

با این تنظیمات، می‌توانید تست‌ها یا دیپلوی‌ها را مستقیماً در شبکه لوکال اجرا و بررسی کنید.


جمع‌بندی


تست و دیباگ قراردادهای هوشمند یکی از ارکان حیاتی در توسعه امن و حرفه‌ای Web3 است. با استفاده از ابزارهایی مانند Hardhat، Mocha/Chai، Ganache و Mock Contracts، می‌توانید کد خود را در شرایط مختلف شبیه‌سازی، تست و بهینه‌سازی کنید. این فرآیند نه تنها باعث افزایش کیفیت محصول نهایی می‌شود، بلکه از وقوع مشکلات جدی در شبکه اصلی جلوگیری می‌کند.

نظرات (0)

اشتراک گذاری

این پست را با دیگران به اشتراک بگذارید

تنظیمات GDPR

When you visit any of our websites, it may store or retrieve information on your browser, mostly in the form of cookies. This information might be about you, your preferences or your device and is mostly used to make the site work as you expect it to. The information does not usually directly identify you, but it can give you a more personalized web experience. Because we respect your right to privacy, you can choose not to allow some types of cookies. Click on the different category headings to find out more and manage your preferences. Please note, that blocking some types of cookies may impact your experience of the site and the services we are able to offer.