paint-brush
জাভা পরীক্ষা: মূল ধারণা [পর্ব 1: ইউনিট পরীক্ষা]দ্বারা@gromspys
1,621 পড়া
1,621 পড়া

জাভা পরীক্ষা: মূল ধারণা [পর্ব 1: ইউনিট পরীক্ষা]

দ্বারা Sergei Korneev10m2023/11/14
Read on Terminal Reader

অতিদীর্ঘ; পড়তে

এই নিবন্ধে, আমরা জাভা ইউনিট পরীক্ষার মূল ধারণাগুলি অন্বেষণ করব, যার মধ্যে রয়েছে সাধারণ কোড উদাহরণ, প্যারামেট্রিকরণ, ব্যতিক্রম পরীক্ষা এবং টীকা৷
featured image - জাভা পরীক্ষা: মূল ধারণা [পর্ব 1: ইউনিট পরীক্ষা]
Sergei Korneev HackerNoon profile picture

ইউনিট টেস্টিং হল সফটওয়্যার ডেভেলপমেন্টের একটি মৌলিক অনুশীলন যা আপনার কোডের নির্ভরযোগ্যতা এবং সঠিকতা নিশ্চিত করে। এই নিবন্ধে, আমরা জাভা ইউনিট পরীক্ষার মূল ধারণাগুলি অন্বেষণ করব, যার মধ্যে রয়েছে সাধারণ কোড উদাহরণ, প্যারামেট্রিকরণ, ব্যতিক্রম পরীক্ষা, টীকা যেমন @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 , @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 কীভাবে যুক্ত করবেন তা এখানে:


  1. আপনার প্রকল্পের pom.xml ফাইল খুলুন.
  2. 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-এর সাথে কোড কভারেজ বিশ্লেষণকে একীভূত করে, আপনি নিশ্চিত করতে পারেন যে আপনার পরীক্ষাগুলি আপনার কোডবেসের একটি উল্লেখযোগ্য অংশ কভার করে। নিয়মিতভাবে ইউনিট পরীক্ষা পরীক্ষা করা এবং বজায় রাখা আপনাকে উচ্চ-মানের এবং শক্তিশালী জাভা অ্যাপ্লিকেশন তৈরি করতে সাহায্য করবে।


এই সিরিজের পরবর্তী অংশে, আমরা ইন্টিগ্রেশন টেস্টিং অন্বেষণ করব, সফ্টওয়্যার পরীক্ষার একটি গুরুত্বপূর্ণ দিক যাতে সামগ্রিক সিস্টেমের কার্যকারিতা সঠিকভাবে নিশ্চিত করার জন্য বিভিন্ন উপাদান এবং পরিষেবাগুলির মধ্যে মিথস্ক্রিয়া পরীক্ষা করা জড়িত।


দ্বিতীয় পর্বের জন্য সাথে থাকুন, যেখানে আমরা ইন্টিগ্রেশন পরীক্ষার উত্তেজনাপূর্ণ জগতে ডুব দেব!