Automated Test Creation এবং Deployment Testing

Testing এবং Debugging (টেস্টিং এবং ডিবাগিং) - সলিডিটি (Solidity) - Computer Programming

388

Automated testing এবং deployment testing হল স্মার্ট কন্ট্রাক্ট ডেভেলপমেন্ট প্রক্রিয়ার অপরিহার্য অংশ। Solidity কোডের জন্য automated tests তৈরি করার মাধ্যমে আপনি আপনার স্মার্ট কন্ট্রাক্টের কার্যকারিতা নিশ্চিত করতে পারেন এবং ডিপ্লয়মেন্টের সময় ত্রুটির সম্ভাবনা কমাতে পারেন।

এই লেখায় আমরা automated test creation এবং deployment testing এর গুরুত্ব, ব্যবহার এবং প্রক্রিয়া নিয়ে আলোচনা করব।


১. Automated Test Creation in Solidity

Automated testing স্মার্ট কন্ট্রাক্ট ডেভেলপমেন্টে একটি গুরুত্বপূর্ণ বিষয়, কারণ এটি আপনাকে আপনার কোডের কার্যকারিতা সঠিকভাবে যাচাই করতে এবং প্রোডাকশনে ডিপ্লয় করার আগে ত্রুটি শনাক্ত করতে সাহায্য করে। সাধারণত JavaScript, TypeScript, এবং Solidity এর মধ্যে ব্যবহার করা হয় Mocha, Chai, এবং Hardhat/Truffle এর মতো টেস্টিং ফ্রেমওয়ার্ক।

Testing Frameworks

  1. Hardhat: Solidity ডেভেলপমেন্টের জন্য একটি শক্তিশালী ফ্রেমওয়ার্ক, যা টেস্টিং, ডিবাগিং এবং স্মার্ট কন্ট্রাক্ট ডিপ্লয়মেন্টের জন্য ব্যবহৃত হয়।
  2. Truffle: একটি জনপ্রিয় টেস্টিং এবং ডিপ্লয়মেন্ট ফ্রেমওয়ার্ক, যা উন্নত স্মার্ট কন্ট্রাক্ট ডেভেলপমেন্ট এবং টেস্টিং সমর্থন করে।

১.১. Test Creation Using Hardhat

Hardhat হল Solidity ডেভেলপমেন্টের জন্য একটি উন্নত টুল, যার মাধ্যমে আপনি স্মার্ট কন্ট্রাক্টের অটোমেটেড টেস্ট লিখতে পারেন। নিচে Hardhat ব্যবহার করে টেস্ট তৈরি করার প্রক্রিয়া দেওয়া হলো।

  1. Install Hardhat:
npm install --save-dev hardhat
  1. Create a basic Hardhat project:
npx hardhat
  1. Write Tests: Hardhat টেস্টিং ফ্রেমওয়ার্ক ব্যবহার করে টেস্ট তৈরি করা যায়, যা Mocha এবং Chai টেস্টিং লাইব্রেরি ব্যবহার করে।

Example of Automated Test Using Hardhat:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract MyToken {

    string public name = "MyToken";
    uint256 public totalSupply;
    mapping(address => uint256) public balances;

    constructor(uint256 _initialSupply) {
        totalSupply = _initialSupply;
        balances[msg.sender] = _initialSupply;
    }

    function transfer(address _recipient, uint256 _amount) public returns (bool) {
        require(balances[msg.sender] >= _amount, "Insufficient balance");
        balances[msg.sender] -= _amount;
        balances[_recipient] += _amount;
        return true;
    }
}

Writing Automated Tests for MyToken Contract:

const { expect } = require("chai");
const { ethers } = require("hardhat");

describe("MyToken Contract", function () {
    let MyToken;
    let myToken;
    let owner;
    let addr1;
    let addr2;

    beforeEach(async function () {
        // Get the ContractFactory and Signers
        MyToken = await ethers.getContractFactory("MyToken");
        [owner, addr1, addr2] = await ethers.getSigners();

        // Deploy the contract
        myToken = await MyToken.deploy(1000);
        await myToken.deployed();
    });

    it("Should have correct name and total supply", async function () {
        expect(await myToken.name()).to.equal("MyToken");
        expect(await myToken.totalSupply()).to.equal(1000);
    });

    it("Should transfer tokens correctly", async function () {
        await myToken.transfer(addr1.address, 500);
        expect(await myToken.balances(addr1.address)).to.equal(500);
    });

    it("Should fail on insufficient balance", async function () {
        await expect(myToken.transfer(addr2.address, 2000))
            .to.be.revertedWith("Insufficient balance");
    });
});

এখানে:

  • beforeEach: এই ফাংশনটি কন্ট্রাক্ট ডেপ্লয় করার আগে রান হয়, যাতে প্রতিটি টেস্টের জন্য নতুন কন্ট্রাক্ট তৈরি হয়।
  • it: টেস্টের প্রতিটি ক্ষেত্রে নির্দিষ্ট ফাংশন বা লজিক যাচাই করা হয়। এখানে Should have correct name and total supply, Should transfer tokens correctly ইত্যাদি টেস্টগুলো যাচাই করা হচ্ছে।

২. Deployment Testing

Deployment testing হল স্মার্ট কন্ট্রাক্টটি প্রকৃত ব্লকচেইনে ডিপ্লয় করার পূর্বে পরীক্ষা করার প্রক্রিয়া। এটি ডিপ্লয়মেন্টের জন্য প্রয়োজনীয় সমস্ত সেটিংস এবং কনফিগারেশন সঠিকভাবে কাজ করছে কিনা, তা যাচাই করতে সহায়ক।

২.১. Deployment Testing with Hardhat

Hardhat ব্যবহার করে স্মার্ট কন্ট্রাক্ট ডিপ্লয়মেন্ট টেস্ট করতে পারেন। এর মাধ্যমে আপনি আপনার স্মার্ট কন্ট্রাক্টের ডিপ্লয়মেন্ট প্রক্রিয়া স্বয়ংক্রিয়ভাবে পরীক্ষা করতে পারবেন।

  1. Configure Deployment Script:
const hre = require("hardhat");

async function main() {
  const [deployer] = await hre.ethers.getSigners();
  console.log("Deploying contracts with the account:", deployer.address);

  const Token = await hre.ethers.getContractFactory("MyToken");
  const token = await Token.deploy(1000);
  console.log("Token deployed to:", token.address);
}

main()
  .then(() => process.exit(0))
  .catch((error) => {
    console.error(error);
    process.exit(1);
  });
  1. Run Deployment Script:
npx hardhat run scripts/deploy.js --network localhost

এই স্ক্রিপ্টটি কন্ট্রাক্ট ডিপ্লয় করবে এবং তার অ্যাড্রেস প্রিন্ট করবে, যা পরবর্তীতে টেস্টিং ও ভেরিফিকেশনের জন্য ব্যবহার করা হবে।


৩. Test Coverage

Test coverage স্মার্ট কন্ট্রাক্টের সকল ফাংশনের কার্যকারিতা সঠিকভাবে পরীক্ষা করতে সাহায্য করে। এটি নিশ্চিত করে যে আপনার কোডের সমস্ত অংশ টেস্ট করা হয়েছে এবং কোনো ফাংশন বাদ পড়েনি।

Hardhat এবং Truffle এর মধ্যে coverage টুল ব্যবহৃত হয়।

Example Using Hardhat Coverage:

  1. Install Hardhat Coverage:
npm install --save-dev hardhat-coverage
  1. Run Coverage:
npx hardhat coverage

এই কমান্ডটি আপনার প্রজেক্টে থাকা টেস্টের কভারেজ রিপোর্ট তৈরি করবে এবং এটি আপনাকে জানাবে কতটা কোড টেস্ট করা হয়েছে।


৪. Mocking External Calls

যখন আপনার স্মার্ট কন্ট্রাক্ট অন্যান্য কন্ট্রাক্ট বা পরিষেবার সাথে ইন্টারঅ্যাক্ট করে, তখন সেই কলগুলি টেস্ট করার জন্য mocking প্রয়োজন হতে পারে। Mocking এর মাধ্যমে আপনি external কন্ট্রাক্ট বা লাইব্রেরি কলগুলির আচরণ সিমুলেট করতে পারেন।

Example Using Mock Contracts:

const { expect } = require("chai");
const { ethers } = require("hardhat");

describe("Mocking External Call", function () {
    let externalContract;
    let myContract;
    let owner;

    beforeEach(async function () {
        const ExternalContract = await ethers.getContractFactory("ExternalContract");
        externalContract = await ExternalContract.deploy();
        await externalContract.deployed();

        const MyContract = await ethers.getContractFactory("MyContract");
        myContract = await MyContract.deploy(externalContract.address);
        await myContract.deployed();
    });

    it("Should interact with the external contract", async function () {
        const result = await myContract.interactWithExternalContract();
        expect(result).to.equal("Expected Result");
    });
});

এখানে:

  • Mocking external contract এর মাধ্যমে আমরা external contract এর কল সিমুলেট করেছি এবং তার আউটপুট পরীক্ষা করেছি।

সারাংশ

Automated testing এবং deployment testing স্মার্ট কন্ট্রাক্ট ডেভেলপমেন্টের অপরিহার্য অংশ। Hardhat এবং Truffle টেস্টিং ফ্রেমওয়ার্ক ব্যবহার করে আপনি স্মার্ট কন্ট্রাক্টের কার্যকারিতা এবং ডিপ্লয়মেন্ট সঠিকভাবে যাচাই করতে পারেন। Mocking external calls, Test coverage, Deployment testing, এবং Automated testing এর মাধ্যমে আপনার কোডের নিরাপত্তা এবং কার্যকারিতা নিশ্চিত করা সম্ভব।

Content added By
Promotion

Are you sure to start over?

Loading...