ইউনিট টেস্টিং হল সফটওয়্যার ডেভেলপমেন্টের একটি মৌলিক অনুশীলন যা আপনার কোডের নির্ভরযোগ্যতা এবং সঠিকতা নিশ্চিত করে। এই নিবন্ধে, আমরা জাভা ইউনিট পরীক্ষার মূল ধারণাগুলি অন্বেষণ করব, যার মধ্যে রয়েছে সাধারণ কোড উদাহরণ, প্যারামেট্রিকরণ, ব্যতিক্রম পরীক্ষা, টীকা যেমন , , , এবং , সেইসাথে মক এবং স্টাবের ব্যবহার। . @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; } } একটি সাধারণ ইউনিট পরীক্ষা লেখা আমাদের ক্লাসের জন্য একটি ইউনিট পরীক্ষা তৈরি করতে, আপনি JUnit ফ্রেমওয়ার্ক ব্যবহার করতে পারেন, জাভার জন্য একটি জনপ্রিয় টেস্টিং ফ্রেমওয়ার্ক। আসুন পদ্ধতির জন্য একটি সাধারণ ইউনিট পরীক্ষা লিখি: Calculator 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 ক্লাস ইম্পোর্ট করি এবং এর সাথে পরীক্ষার পদ্ধতি টীকা করি। তারপরে আমরা ক্লাসের একটি উদাহরণ তৈরি করি এবং দাবি করি যে পদ্ধতির ফলাফল প্রত্যাশিত মানের (5) সমান। @Test Calculator add প্যারামিটারাইজড টেস্ট প্যারামিটারাইজড টেস্টগুলি আপনাকে ইনপুট ডেটার একাধিক সেটের সাথে একই পরীক্ষার লজিক চালানোর অনুমতি দেয়। এটি বিভিন্ন ইনপুট মান সহ একটি পদ্ধতি পরীক্ষা করার জন্য দরকারী। 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); } } এই উদাহরণে, টীকা আমাদেরকে CSV ফর্ম্যাটে ইনপুট মান এবং প্রত্যাশিত ফলাফলের একাধিক সেট প্রদান করতে দেয়। পরীক্ষার পদ্ধতিটি প্রতিটি সংমিশ্রণের জন্য কার্যকর করা হয়, পদ্ধতির সঠিকতা নিশ্চিত করে। @ParameterizedTest 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 @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 JaCoCo Maven প্লাগইন কনফিগারেশন যোগ করুন: <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-এর সাথে কোড কভারেজ বিশ্লেষণকে একীভূত করে, আপনি নিশ্চিত করতে পারেন যে আপনার পরীক্ষাগুলি আপনার কোডবেসের একটি উল্লেখযোগ্য অংশ কভার করে। নিয়মিতভাবে ইউনিট পরীক্ষা পরীক্ষা করা এবং বজায় রাখা আপনাকে উচ্চ-মানের এবং শক্তিশালী জাভা অ্যাপ্লিকেশন তৈরি করতে সাহায্য করবে। এই সিরিজের পরবর্তী অংশে, আমরা ইন্টিগ্রেশন টেস্টিং অন্বেষণ করব, সফ্টওয়্যার পরীক্ষার একটি গুরুত্বপূর্ণ দিক যাতে সামগ্রিক সিস্টেমের কার্যকারিতা সঠিকভাবে নিশ্চিত করার জন্য বিভিন্ন উপাদান এবং পরিষেবাগুলির মধ্যে মিথস্ক্রিয়া পরীক্ষা করা জড়িত। দ্বিতীয় পর্বের জন্য সাথে থাকুন, যেখানে আমরা ইন্টিগ্রেশন পরীক্ষার উত্তেজনাপূর্ণ জগতে ডুব দেব!