JUnit হল Java এ ইউনিট টেস্টিং করার জন্য সবচেয়ে জনপ্রিয় ফ্রেমওয়ার্ক। JUnit ব্যবহার করে, আপনি সহজেই আপনার কোডের বিভিন্ন অংশের কার্যকারিতা পরীক্ষা করতে পারেন। কখনো কখনো, আপনাকে কোডের কার্যকারিতা পরীক্ষা করতে হবে নির্দিষ্ট সময়সীমার মধ্যে সম্পন্ন হচ্ছে কিনা, এবং এই ক্ষেত্রে @Test(timeout=) এবং assertTimeout() খুবই কার্যকরী।
এই টিউটোরিয়ালে, আমরা @Test(timeout=) এবং assertTimeout() এর ব্যবহারের মাধ্যমে কিভাবে টেস্টে সময়সীমা নির্ধারণ এবং সময় পরীক্ষা করা যায়, তা বিস্তারিতভাবে আলোচনা করব।
১. @Test(timeout=) এর ব্যবহার
JUnit 4 এবং JUnit 5 এ @Test(timeout=) অ্যানোটেশন ব্যবহার করে টেস্ট মেথডে একটি সময়সীমা (timeout) নির্ধারণ করা যায়। যখন নির্দিষ্ট সময়ের মধ্যে টেস্ট সম্পন্ন না হয়, তখন টেস্টটি fail হয়ে যাবে।
উদাহরণ:
import org.junit.Test;
import static org.junit.Assert.*;
public class TimeoutTest {
// @Test(timeout=) Example
@Test(timeout = 1000) // Timeout is 1000 milliseconds (1 second)
public void testWithTimeout() throws InterruptedException {
// Simulate some long-running task
Thread.sleep(500); // Test will pass as sleep time is less than timeout
}
@Test(timeout = 1000) // Timeout is 1000 milliseconds (1 second)
public void testWithTimeoutFail() throws InterruptedException {
// Simulate a long-running task
Thread.sleep(2000); // Test will fail as sleep time exceeds timeout
}
}
এখানে, testWithTimeout() টেস্টটি সফল হবে কারণ sleep(500) 1 সেকেন্ডের মধ্যে সম্পন্ন হবে। অন্যদিকে, testWithTimeoutFail() টেস্টটি ব্যর্থ হবে কারণ sleep(2000) 1 সেকেন্ডের সীমা অতিক্রম করবে এবং timeout ভেঙে যাবে।
@Test(timeout=) এর সুবিধা:
- সুনির্দিষ্ট সময়ে সম্পন্ন না হওয়া কোডের কার্যকারিতা পরীক্ষা করা যায়।
- কোডের পারফরম্যান্সও পরীক্ষা করা সম্ভব, বিশেষ করে দীর্ঘকালীন রানিং প্রসেসের ক্ষেত্রে।
২. assertTimeout() এর ব্যবহার (JUnit 5)
JUnit 5 এ assertTimeout() পদ্ধতি ব্যবহার করা হয় যেখানে নির্দিষ্ট সময়সীমার মধ্যে কোনো অপারেশন সম্পন্ন হচ্ছে কিনা তা পরীক্ষা করা হয়। এই পদ্ধতিটি assertTimeoutPreemptively() এবং assertTimeout() এর মতো বেশ কিছু পদ্ধতির মাধ্যমে সময় নির্ধারণ করে থাকে।
assertTimeout() এর উদাহরণ:
import org.junit.jupiter.api.Test;
import java.time.Duration;
import static org.junit.jupiter.api.Assertions.*;
public class TimeoutTest {
// Using assertTimeout() to check timeout
@Test
void testWithAssertTimeout() {
assertTimeout(Duration.ofMillis(1000), () -> {
// Simulate a task that takes less than 1 second
Thread.sleep(500); // Will pass because sleep time is less than timeout
});
}
// Using assertTimeout() to check timeout failure
@Test
void testWithAssertTimeoutFail() {
assertTimeout(Duration.ofMillis(1000), () -> {
// Simulate a task that takes more than 1 second
Thread.sleep(1500); // Will fail because sleep time exceeds timeout
});
}
}
এখানে:
- assertTimeout(Duration.ofMillis(1000), ...): এটি নিশ্চিত করে যে, ভিতরের কোড ব্লকটি 1 সেকেন্ডের মধ্যে সম্পন্ন হবে।
- Thread.sleep(500): প্রথম টেস্টটি সফল হবে কারণ এটি 1 সেকেন্ডের মধ্যে সম্পন্ন হবে।
- Thread.sleep(1500): দ্বিতীয় টেস্টটি ব্যর্থ হবে কারণ এটি 1 সেকেন্ডের বেশি সময় নিবে।
assertTimeout() এর সুবিধা:
- assertTimeout() ব্যবহার করে নির্দিষ্ট সময়ের মধ্যে কার্যকলাপ সম্পন্ন হচ্ছে কিনা তা পরীক্ষা করা যায়।
- Duration টাইপ ব্যবহার করে সময়সীমা নির্ধারণ করা হয়, যা আরো নমনীয় এবং স্পষ্ট।
- JUnit 5 এ assertTimeoutPreemptively() ব্যবহার করে প্রক্রিয়া শুরু হওয়ার পর থেকে সময়সীমা নির্ধারণ করা যেতে পারে, যা পারফরম্যান্স পরীক্ষার জন্য উপকারী।
৩. assertTimeoutPreemptively() এর ব্যবহার (JUnit 5)
JUnit 5 এ assertTimeoutPreemptively() ব্যবহার করা যায়, যেখানে আপনি একটি নির্দিষ্ট সময়সীমার মধ্যে ব্লকটি সম্পন্ন না হলে তা বাধা দিতে পারেন এবং থ্রেড অবিলম্বে থামিয়ে দিতে পারেন।
উদাহরণ:
import org.junit.jupiter.api.Test;
import java.time.Duration;
import static org.junit.jupiter.api.Assertions.*;
public class TimeoutTest {
// Using assertTimeoutPreemptively() to check timeout
@Test
void testWithAssertTimeoutPreemptively() {
assertTimeoutPreemptively(Duration.ofMillis(1000), () -> {
// Simulate a long-running task
Thread.sleep(1500); // This will fail and terminate before completing
});
}
}
এখানে, assertTimeoutPreemptively() ব্যবহার করে, টেস্টটি 1 সেকেন্ডের মধ্যে শেষ না হলে এটি প্রক্রিয়া থামিয়ে দেবে এবং টেস্টটি fail হয়ে যাবে।
৪. মোটকথা
- @Test(timeout=) (JUnit 4) এবং assertTimeout() (JUnit 5) উভয়ই time-bound tests পরিচালনা করার জন্য ব্যবহৃত হয়।
- assertTimeout() JUnit 5 এর একটি সুবিধাজনক পদ্ধতি যা Duration টাইপ ব্যবহার করে সময় নির্ধারণ করতে সাহায্য করে।
- assertTimeoutPreemptively() ব্যবহার করে, আপনি কোনো কোড ব্লকের কার্যকলাপের সময়সীমা পেরিয়ে যাওয়ার আগেই থ্রেডকে থামিয়ে দিতে পারেন, যা আরো নির্ভুল পরীক্ষা পরিচালনা করে।
এই টেস্টিং পদ্ধতিগুলি time-sensitive operations যেমন API কল, ডাটাবেস প্রসেসিং, বা অন্যান্য দীর্ঘকালীন কাজের জন্য উপকারী, যেখানে সঠিক সময়ে সম্পন্ন না হওয়া প্রসেসের কার্যকারিতা পরীক্ষার জন্য timeout প্রয়োজন হয়।
Read more