ইউনিট টেস্টিং হল সফটওয়্যার ডেভেলপমেন্টের একটি মৌলিক অনুশীলন যা আপনার কোডের নির্ভরযোগ্যতা এবং সঠিকতা নিশ্চিত করে। এই নিবন্ধে, আমরা জাভা ইউনিট পরীক্ষার মূল ধারণাগুলি অন্বেষণ করব, যার মধ্যে রয়েছে সাধারণ কোড উদাহরণ, প্যারামেট্রিকরণ, ব্যতিক্রম পরীক্ষা, টীকা যেমন @Before
, @BeforeEach
, @After
, এবং @AfterEach
, সেইসাথে মক এবং স্টাবের ব্যবহার। .
আমরা উপহাস করার জন্য জনপ্রিয় মকিটো লাইব্রেরিও চালু করব এবং Maven প্লাগইন ব্যবহার করে কোড কভারেজ পরিমাপ করার জন্য নির্দেশিকা প্রদান করব।
ইউনিট টেস্টিং হল পৃথক কম্পোনেন্ট বা কোডের একককে বিচ্ছিন্নভাবে পরীক্ষা করে তাদের সঠিকতা যাচাই করার অভ্যাস। প্রাথমিক লক্ষ্য হল বিকাশ প্রক্রিয়ার প্রথম দিকে বাগগুলি সনাক্ত করা এবং ঠিক করা, কোডের প্রতিটি ইউনিট প্রত্যাশিতভাবে আচরণ করে তা নিশ্চিত করা।
আসুন একটি সাধারণ ক্যালকুলেটর ক্লাস তৈরি করে শুরু করি যা আমরা আমাদের উদাহরণগুলির জন্য ব্যবহার করতে পারি। Calculator
ক্লাসে মৌলিক গাণিতিক ক্রিয়াকলাপ রয়েছে:
public class Calculator { public int add(int a, int b) { return a + b; } public int subtract(int a, int b) { return a - b; } public int multiply(int a, int b) { return a * b; } public int divide(int a, int b) { return a / b; } }
আমাদের Calculator
ক্লাসের জন্য একটি ইউনিট পরীক্ষা তৈরি করতে, আপনি JUnit ফ্রেমওয়ার্ক ব্যবহার করতে পারেন, জাভার জন্য একটি জনপ্রিয় টেস্টিং ফ্রেমওয়ার্ক। আসুন add
পদ্ধতির জন্য একটি সাধারণ ইউনিট পরীক্ষা লিখি:
import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; public class CalculatorTest { @Test public void testAdd() { Calculator calculator = new Calculator(); int result = calculator.add(2, 3); assertEquals(5, result); } }
এই পরীক্ষায়, আমরা প্রয়োজনীয় JUnit ক্লাস ইম্পোর্ট করি এবং @Test
এর সাথে পরীক্ষার পদ্ধতি টীকা করি। তারপরে আমরা Calculator
ক্লাসের একটি উদাহরণ তৈরি করি এবং দাবি করি যে add
পদ্ধতির ফলাফল প্রত্যাশিত মানের (5) সমান।
প্যারামিটারাইজড টেস্টগুলি আপনাকে ইনপুট ডেটার একাধিক সেটের সাথে একই পরীক্ষার লজিক চালানোর অনুমতি দেয়। এটি বিভিন্ন ইনপুট মান সহ একটি পদ্ধতি পরীক্ষা করার জন্য দরকারী। JUnit এ এটি করতে, আপনি @ParameterizedTest
টীকা ব্যবহার করতে পারেন এবং ইনপুট মান এবং প্রত্যাশিত ফলাফলগুলি পরামিতি হিসাবে প্রদান করতে পারেন। এখানে একটি উদাহরণ:
import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; import static org.junit.jupiter.api.Assertions.assertEquals; public class CalculatorTest { @ParameterizedTest @CsvSource({"2, 3, 5", "4, 7, 11", "0, 0, 0"}) public void testAdd(int a, int b, int expected) { Calculator calculator = new Calculator(); int result = calculator.add(a, b); assertEquals(expected, result); } }
এই উদাহরণে, @ParameterizedTest
টীকা আমাদেরকে CSV ফর্ম্যাটে ইনপুট মান এবং প্রত্যাশিত ফলাফলের একাধিক সেট প্রদান করতে দেয়। পরীক্ষার পদ্ধতিটি প্রতিটি সংমিশ্রণের জন্য কার্যকর করা হয়, add
পদ্ধতির সঠিকতা নিশ্চিত করে।
আপনার কোড সঠিকভাবে ত্রুটিগুলি পরিচালনা করে তা নিশ্চিত করার জন্য ব্যতিক্রমগুলি পরীক্ষা করা গুরুত্বপূর্ণ৷ ব্যতিক্রম ক্ষেত্রে পরীক্ষা করার জন্য, আপনি JUnit দ্বারা প্রদত্ত assertThrows
পদ্ধতি সহ @Test
টীকাটি ব্যবহার করতে পারেন।
এখানে একটি উদাহরণ:
javaCopy codeimport org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertThrows; public class CalculatorTest { @Test public void testDivideByZero() { Calculator calculator = new Calculator(); assertThrows(ArithmeticException.class, () -> calculator.divide(5, 0)); } }
এই পরীক্ষায়, আমরা যাচাই করি যে Calculator
ক্লাসে একটি সংখ্যাকে শূন্য দিয়ে ভাগ করলে একটি ArithmeticException
হয়।
@Before
, @BeforeEach
, @After
, এবং @AfterEach
এর মত টীকাগুলি পরীক্ষার পরিবেশ সেট আপ করতে এবং বিচ্ছিন্ন করতে ব্যবহৃত হয়। এই টীকাগুলি সাধারণ পরীক্ষা শুরু এবং পরিষ্কারের কাজগুলি পরিচালনা করতে সহায়তা করে।
@Before
এবং @After
যথাক্রমে পরীক্ষার ক্লাসে সমস্ত পরীক্ষার পদ্ধতির আগে এবং পরে একবার চালান।@BeforeEach
এবং @AfterEach
প্রতিটি পরীক্ষার পদ্ধতির আগে এবং পরে রান করে।
এখানে একটি উদাহরণ:
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; public class CalculatorTest { private Calculator calculator; @BeforeEach public void setUp() { calculator = new Calculator(); } @AfterEach public void tearDown() { calculator = null; } @Test public void testAdd() { int result = calculator.add(2, 3); assertEquals(5, result); } @Test public void testSubtract() { int result = calculator.subtract(5, 3); assertEquals(2, result); } }
এই উদাহরণে, setUp
পদ্ধতিটি @BeforeEach
দিয়ে টীকা করা হয়েছে, এবং এটি প্রতিটি পরীক্ষার আগে Calculator
অবজেক্টকে আরম্ভ করে। tearDown
পদ্ধতি, @AfterEach
এর সাথে টীকাযুক্ত, প্রতিটি পরীক্ষার পরে সংস্থানগুলি পরিষ্কার করে।
যখন আপনি ডেটাবেস বা ওয়েব পরিষেবাগুলির মতো বাহ্যিক নির্ভরতা থেকে পরীক্ষা করা কোডটিকে আলাদা করতে চান তখন ইউনিট টেস্টিংয়ে মক এবং স্টাবগুলি অপরিহার্য। তারা আপনাকে এই নির্ভরতাগুলির আচরণ অনুকরণ করার অনুমতি দেয়।
চলুন Calculator
ক্লাসটি প্রসারিত করা যাক একটি পদ্ধতি অন্তর্ভুক্ত করার জন্য যাতে একটি বাহ্যিক নির্ভরতা জড়িত থাকে এবং তারপর সেই নির্ভরতা অনুকরণ করার জন্য একটি স্টাব তৈরি করি।
public class Calculator { private ExternalService externalService; public Calculator(ExternalService externalService) { this.externalService = externalService; } public int performComplexCalculation(int a, int b) { int result = externalService.multiply(a, b); return result + externalService.getConstant(); } }
এই আপডেট করা Calculator
ক্লাসে, performComplexCalculation
গুণন এবং একটি ধ্রুবক মান পাওয়ার জন্য একটি ExternalService
উপর নির্ভর করে।
প্রকৃত ExternalService
এর উপর নির্ভর না করে আপনি কীভাবে Calculator
ক্লাস পরীক্ষা করার জন্য একটি স্টাব তৈরি করতে পারেন তা এখানে।
import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.*; public class CalculatorTest { @Test public void testPerformComplexCalculation() { // Create a stub for ExternalService ExternalService externalServiceStub = new ExternalService() { @Override public int multiply(int a, int b) { return a * b; } @Override public int getConstant() { return 5; // Stubbed constant value } }; // Create the Calculator with the stubbed ExternalService Calculator calculator = new Calculator(externalServiceStub); // Test the performComplexCalculation method int result = calculator.performComplexCalculation(2, 3); assertEquals(11, result); // 2*3 + 5 (constant) = 11 } }
এই পরীক্ষায়, ExternalService
একটি বেনামী ক্লাস তৈরি করে পরীক্ষার পদ্ধতির মধ্যে আটকে দেওয়া হয় যা প্রয়োজনীয় পদ্ধতিগুলিকে ওভাররাইড করে। এইভাবে, Calculator
পরীক্ষা পদ্ধতিটি ExternalService
এর প্রকৃত বাস্তবায়নের উপর নির্ভর না করেই চলে।
স্টাবগুলি একটি ক্লাস বা পদ্ধতির নির্দিষ্ট কার্যকারিতা বিচ্ছিন্ন এবং পরীক্ষা করার জন্য বহিরাগত সিস্টেম বা নির্ভরতার আচরণ অনুকরণ করার জন্য দরকারী। এটি আপনাকে স্টাবের আচরণ নিয়ন্ত্রণ করতে এবং প্রকৃত বাহ্যিক পরিষেবার প্রয়োজন ছাড়াই পরীক্ষার অধীনে ইউনিটে ফোকাস করতে দেয়।
মকিটো একটি জনপ্রিয় জাভা লাইব্রেরি যা মক অবজেক্ট তৈরি এবং পরিচালনা করার জন্য। ধরা যাক আমাদের একটি PaymentService
ক্লাস আছে যা একটি বাহ্যিক পেমেন্ট গেটওয়ের সাথে ইন্টারঅ্যাক্ট করে। পেমেন্ট গেটওয়ের জন্য একটি মক তৈরি করতে আমরা মকিটো ব্যবহার করতে পারি:
import org.junit.jupiter.api.Test; import static org.mockito.Mockito.*; public class PaymentServiceTest { @Test public void testProcessPayment() { PaymentGateway paymentGateway = mock(PaymentGateway.class); PaymentService paymentService = new PaymentService(paymentGateway); when(paymentGateway.charge(100.0)).thenReturn(true); boolean result = paymentService.processPayment(100.0); assertTrue(result); verify(paymentGateway, times(1)).charge(100.0); } }
এই উদাহরণে, আমরা একটি মক PaymentGateway
তৈরি করি এবং এর আচরণ সংজ্ঞায়িত করার জন্য when
পদ্ধতি ব্যবহার করি। তারপর আমরা PaymentService
ক্লাসে processPayment
পদ্ধতিতে কল করি এবং যাচাই করি যে charge
পদ্ধতিটি প্রত্যাশিত প্যারামিটার সহ কল করা হয়েছে।
কোড কভারেজ আপনার ইউনিট পরীক্ষা দ্বারা নির্বাহিত কোড লাইন, শাখা বা বিবৃতিগুলির শতাংশ পরিমাপ করে। এটি আপনাকে অ-পরীক্ষিত কোড এবং অতিরিক্ত পরীক্ষার প্রয়োজন হতে পারে এমন ক্ষেত্রগুলি সনাক্ত করতে সহায়তা করে।
Maven জাভা প্রকল্পগুলির জন্য একটি জনপ্রিয় বিল্ড টুল, এবং আপনি JaCoCo এর মতো প্লাগইনগুলি ব্যবহার করে আপনার Maven প্রকল্পে কোড কভারেজ বিশ্লেষণকে একীভূত করতে পারেন। আপনার প্রজেক্টে JaCoCo কীভাবে যুক্ত করবেন তা এখানে:
pom.xml
ফাইল খুলুন. <build> <plugins> <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.7</version> <executions> <execution> <goals> <goal>prepare-agent</goal> </goals> </execution> <execution> <id>report</id> <phase>test</phase> <goals> <goal>report</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
নিম্নলিখিত কমান্ড দিয়ে আপনার Maven বিল্ড চালান:
mvn clean verify
বিল্ড চালানোর পরে, আপনি target/site/jacoco/index.html
ফাইলে কোড কভারেজ রিপোর্ট খুঁজে পেতে পারেন। এই প্রতিবেদনটি আপনার ইউনিট পরীক্ষা দ্বারা আপনার কোডের কভারেজ সম্পর্কে বিস্তারিত তথ্য প্রদান করে।
আপনার কোডের নির্ভরযোগ্যতা এবং সঠিকতা নিশ্চিত করার জন্য জাভা ইউনিট পরীক্ষা একটি অপরিহার্য অনুশীলন। JUnit এবং Mockito এর মত টুলের সাহায্যে আপনি আপনার উপাদানগুলির জন্য কার্যকর ইউনিট পরীক্ষা এবং উপহাস লিখতে পারেন।
Maven এবং JaCoCo-এর সাথে কোড কভারেজ বিশ্লেষণকে একীভূত করে, আপনি নিশ্চিত করতে পারেন যে আপনার পরীক্ষাগুলি আপনার কোডবেসের একটি উল্লেখযোগ্য অংশ কভার করে। নিয়মিতভাবে ইউনিট পরীক্ষা পরীক্ষা করা এবং বজায় রাখা আপনাকে উচ্চ-মানের এবং শক্তিশালী জাভা অ্যাপ্লিকেশন তৈরি করতে সাহায্য করবে।
এই সিরিজের পরবর্তী অংশে, আমরা ইন্টিগ্রেশন টেস্টিং অন্বেষণ করব, সফ্টওয়্যার পরীক্ষার একটি গুরুত্বপূর্ণ দিক যাতে সামগ্রিক সিস্টেমের কার্যকারিতা সঠিকভাবে নিশ্চিত করার জন্য বিভিন্ন উপাদান এবং পরিষেবাগুলির মধ্যে মিথস্ক্রিয়া পরীক্ষা করা জড়িত।
দ্বিতীয় পর্বের জন্য সাথে থাকুন, যেখানে আমরা ইন্টিগ্রেশন পরীক্ষার উত্তেজনাপূর্ণ জগতে ডুব দেব!