টেস্টএনজি (TestNG) হল একটি শক্তিশালী টেস্টিং ফ্রেমওয়ার্ক যা ডেভেলপারদের টেস্ট অটোমেশন এবং ইনটিগ্রেশন সহজ করে। তবে, বড় প্রকল্প বা একাধিক টেস্ট কেস পরিচালনা করার সময় টেস্টের পারফরম্যান্স অপটিমাইজেশন খুবই গুরুত্বপূর্ণ। এখানে কিছু Performance Optimization Techniques দেওয়া হলো যা TestNG-তে ব্যবহার করা যেতে পারে।
১. Parallel Execution (প্যারালাল এক্সিকিউশন)
Parallel execution একাধিক টেস্ট বা টেস্ট কেস একই সময়ে চালানোর মাধ্যমে টেস্টিং-এর সময় কমাতে সাহায্য করে। TestNG-তে প্যারালাল এক্সিকিউশন সহজে কনফিগার করা যায়।
উদাহরণ: TestNG.xml এর মাধ্যমে Parallel Execution সেটআপ করা
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="Parallel Execution Example" parallel="methods" thread-count="4">
<test name="Test Suite 1">
<classes>
<class name="TestClass1"/>
<class name="TestClass2"/>
</classes>
</test>
</suite>
কনফিগারেশন:
parallel="methods": টেস্ট মেথডগুলো প্যারালালভাবে চালাবে।thread-count="4": একসাথে ৪টি থ্রেড ব্যবহার করবে।
কোড উদাহরণ:
import org.testng.annotations.Test;
public class TestClass1 {
@Test
public void testMethod1() {
System.out.println("Test Method 1 in TestClass1 - Thread ID: " + Thread.currentThread().getId());
}
@Test
public void testMethod2() {
System.out.println("Test Method 2 in TestClass1 - Thread ID: " + Thread.currentThread().getId());
}
}
আউটপুট:
Test Method 1 in TestClass1 - Thread ID: 12
Test Method 2 in TestClass1 - Thread ID: 13
২. DataProvider (ডেটা প্রোভাইডার)
@DataProvider ব্যবহার করে একাধিক ডেটা পাস করতে পারে এবং একটি টেস্ট মেথডে ভিন্ন ভিন্ন ডেটা সেট দিয়ে টেস্ট চালাতে পারে। এটি কোড পুনঃব্যবহারযোগ্যতা বাড়ায় এবং একাধিক ইনপুট দিয়ে টেস্ট চালানোর মাধ্যমে সময় বাঁচায়।
উদাহরণ: @DataProvider ব্যবহার করা
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class TestClass2 {
@DataProvider(name = "loginData")
public Object[][] provideData() {
return new Object[][] {
{"user1", "pass1"},
{"user2", "pass2"},
{"user3", "pass3"}
};
}
@Test(dataProvider = "loginData")
public void loginTest(String username, String password) {
System.out.println("Testing with Username: " + username + " and Password: " + password);
}
}
আউটপুট:
Testing with Username: user1 and Password: pass1
Testing with Username: user2 and Password: pass2
Testing with Username: user3 and Password: pass3
ফায়দা:
- একাধিক ডেটার মাধ্যমে একক টেস্ট মেথড চালানো যায়, যা কার্যকরী এবং সময় সাশ্রয়ী।
৩. TestNG Listener ব্যবহার করা
Listener টেস্টের ফলাফল লগ, সুনির্দিষ্ট কাস্টম কার্যপ্রণালী পরিচালনা করার জন্য ব্যবহার করা হয়। এটি টেস্টের পারফরম্যান্স অপটিমাইজ করতে সাহায্য করে, কারণ আপনি টেস্টের পূর্বে বা পরবর্তী সময়ে কিছু নির্দিষ্ট কোড চালাতে পারেন।
উদাহরণ: TestNG Listener ব্যবহার করা
import org.testng.ITestContext;
import org.testng.ITestListener;
import org.testng.ITestResult;
public class CustomListener implements ITestListener {
@Override
public void onTestStart(ITestResult result) {
System.out.println("Test started: " + result.getName());
}
@Override
public void onTestSuccess(ITestResult result) {
System.out.println("Test passed: " + result.getName());
}
@Override
public void onTestFailure(ITestResult result) {
System.out.println("Test failed: " + result.getName());
}
@Override
public void onTestSkipped(ITestResult result) {
System.out.println("Test skipped: " + result.getName());
}
@Override
public void onTestFailedButWithinSuccessPercentage(ITestResult result) {}
@Override
public void onStart(ITestContext context) {}
@Override
public void onFinish(ITestContext context) {}
}
TestNG.xml ফাইলে Listener কনফিগার করা:
<suite name="Test Suite">
<listeners>
<listener class-name="CustomListener"/>
</listeners>
<test name="Test 1">
<classes>
<class name="TestClass1"/>
</classes>
</test>
</suite>
ফায়দা:
- টেস্ট ফলাফল ট্র্যাক এবং মনিটর করা যায়, যা পারফরম্যান্স উন্নত করতে সাহায্য করে।
৪. Avoiding Unnecessary Test Initialization (অপ্রয়োজনীয় টেস্ট ইনিশিয়ালাইজেশন এড়ানো)
বড় টেস্ট স্যুটে, অনেক সময় টেস্ট কেসের জন্য পুনরায় একই ইনিশিয়ালাইজেশন করা হয় যা অপটিমাইজ করা যায়। আপনি @BeforeClass বা @BeforeSuite অ্যানোটেশন ব্যবহার করে ইনিশিয়ালাইজেশন কেবল একবার করতে পারেন।
উদাহরণ: @BeforeClass ব্যবহার করে টেস্ট ইনিশিয়ালাইজেশন
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
public class TestClass3 {
@BeforeClass
public void setup() {
System.out.println("Initializing resources before running tests");
}
@Test
public void testMethod1() {
System.out.println("Running test method 1");
}
@Test
public void testMethod2() {
System.out.println("Running test method 2");
}
}
ফায়দা:
- ইনিশিয়ালাইজেশন কেবল একবার ঘটবে, যা সময় বাঁচায় এবং টেস্ট পারফরম্যান্স উন্নত করে।
৫. Use of @Test(priority) (টেস্ট প্রায়োরিটি ব্যবহার করা)
@Test(priority) ব্যবহার করে আপনি টেস্টের অগ্রাধিকার নির্ধারণ করতে পারেন, যা টেস্ট রান করার সময় কার্যকরী হতে পারে। গুরুত্বপূর্ণ টেস্ট আগে চালানোর মাধ্যমে আপনি সময় অপচয় কমাতে পারেন।
উদাহরণ: @Test(priority) ব্যবহার করা
import org.testng.annotations.Test;
public class TestClass4 {
@Test(priority = 1)
public void testMethod1() {
System.out.println("Test Method 1 (Priority 1)");
}
@Test(priority = 2)
public void testMethod2() {
System.out.println("Test Method 2 (Priority 2)");
}
@Test(priority = 0)
public void testMethod3() {
System.out.println("Test Method 3 (Priority 0)");
}
}
আউটপুট:
Test Method 3 (Priority 0)
Test Method 1 (Priority 1)
Test Method 2 (Priority 2)
ফায়দা:
- টেস্ট কেসের কার্যকারিতা অনুযায়ী অগ্রাধিকার নির্ধারণ করা যায়, যা পারফরম্যান্স অপটিমাইজেশন করে।
উপসংহার
TestNG-তে পারফরম্যান্স অপটিমাইজেশন খুবই গুরুত্বপূর্ণ, বিশেষ করে বড় টেস্ট স্যুট বা প্রোজেক্টে। প্যারালাল এক্সিকিউশন, ডেটা প্রোভাইডার, লিসেনার ব্যবহার এবং ইনিশিয়ালাইজেশন অপটিমাইজেশন দ্বারা আপনি আপনার টেস্ট স্যুটের পারফরম্যান্স উন্নত করতে পারেন। এই টেকনিকগুলো ব্যবহার করলে টেস্টিং এর সময় এবং রিসোর্সের দক্ষতা বৃদ্ধি পায়, এবং বড় প্রোজেক্টে টেস্ট চালানো আরও কার্যকরী হয়ে ওঠে।
Read more