CodeGym /Java Blog /এলোমেলো /JUnit দিয়ে জাভাতে ইউনিট টেস্টিং
John Squirrels
লেভেল 41
San Francisco

JUnit দিয়ে জাভাতে ইউনিট টেস্টিং

এলোমেলো দলে প্রকাশিত

জাভাতে ইউনিট টেস্টিং কি?

আমরা জাভাতে JUnit শেখার আগে, আসুন সংক্ষিপ্তভাবে দেখে নেওয়া যাক ইউনিট টেস্টিং কী এবং কেন এটি এত জনপ্রিয় (যদি আপনি ইতিমধ্যে এই জিনিসটি জানেন, তাহলে 'আমি কীভাবে জাভাতে একটি জুনিট পরীক্ষা লিখব?' এ যান)। জাভাতে ইউনিট টেস্টিং বড় আকারের সফ্টওয়্যার বিকাশকে অনেক বেশি দক্ষ এবং সহজ করে তোলে। এটি উভয় ব্যক্তিকে সাহায্য করতে পারে, এবং দলগুলিকে ডিবাগিং থেকে অগণিত ঘন্টা কেটে দেয় এবং সহযোগিতা প্রক্রিয়াটিকে অপরিমেয়ভাবে প্রবাহিত করে। JUnit সহ জাভাতে ইউনিট পরীক্ষা - 1

https://junit.org/junit4/

ইউনিট পরীক্ষার অপরিহার্য ধারণা হল: স্বতন্ত্র বৈশিষ্ট্যগুলির পারমাণবিক পরীক্ষা লিখুন (যাকে ইউনিট পরীক্ষা বলা হয়) এবং ধীরে ধীরে পরীক্ষা করার পরে আরও বৈশিষ্ট্য যুক্ত করুন এবং আগেরগুলি কাজ করে তা নিশ্চিত করুন। এটি একটি অত্যন্ত সহজ কিন্তু শক্তিশালী ধারণা. এই প্রক্রিয়াটি কেমন হতে পারে তার একটি উদাহরণ হিসাবে, কল্পনা করুন আপনি একটি ভার্চুয়াল বৈজ্ঞানিক ক্যালকুলেটর তৈরি করছেন। আপাত গাণিতিক অপারেটরগুলির উপরে ( +, -, x, %), এই ক্যালকুলেটরটিতে উন্নত বৈশিষ্ট্য থাকবে যেগুলির মধ্যে কাজ করার জন্য অন্যান্য উপ-বৈশিষ্ট্যের প্রয়োজন। সূচক গণনা করতে, আপনার ক্যালকুলেটরকে সঠিকভাবে গুণ করতে সক্ষম হতে হবে। সুতরাং এই ক্যালকুলেটর তৈরি এবং পরীক্ষা করার জন্য একটি ইউনিট পরীক্ষার পদ্ধতি হবে:
  • একটি সংযোজন ফাংশন লিখুন। এটি সাবধানে পরীক্ষা করুন, এটি পরিবর্তন করুন, এটি কাজ না হওয়া পর্যন্ত পুনরাবৃত্তি করুন।
  • বিয়োগ, গুণ, ভাগ ফাংশনের জন্য একই কাজ করুন।
  • এক্সপোনেন্টের মতো আরও উন্নত অপারেটর ফাংশন লিখতে এই বেস অপারেটরগুলি ব্যবহার করুন, তারপর সেই ফাংশনগুলিও পরীক্ষা করুন।
এটি নিশ্চিত করে যে বৈশিষ্ট্যগুলি যেগুলি অন্যান্য ছোট উপ-বৈশিষ্ট্যগুলি তৈরি করে তা কেবল তাদের নিজের অধিকারে সঠিকভাবে কাজ করে না তবে এর মধ্যে ত্রুটিপূর্ণ উপ-বিশিষ্ট নেই। উদাহরণস্বরূপ, যদি আমি এক্সপোনেন্ট ফাংশন পরীক্ষা করছি এবং কিছু ভুল হচ্ছে, আমি জানি যে বাগটি সম্ভবত গুণিতক সাবফিচারে নেই, কারণ গুণন ফাংশনটি ইতিমধ্যেই ব্যাপকভাবে পরীক্ষা করা হয়েছে। এটি বাগ খুঁজে বের করার জন্য ব্যাকট্রেস এবং পরিদর্শন করার জন্য আমার প্রয়োজনীয় কোডের মোট পরিমাণকে ব্যাপকভাবে সরিয়ে দেয়। আশা করি, এই তুচ্ছ উদাহরণটি পরিষ্কার করে দেয় যে কীভাবে ইউনিট পরীক্ষার চারপাশে চিন্তাভাবনা প্রক্রিয়াটি গঠন করা হয়। কিন্তু কিভাবে ইউনিট টেস্টিং বাকি সফ্টওয়্যার উন্নয়ন প্রক্রিয়ার সাথে ইন্টারঅ্যাক্ট করে? আপনার যদি আরও জটিল বৈশিষ্ট্য থাকে, যা একসাথে কাজ করতে এবং যোগাযোগ করতে সক্ষম হতে হবে? এই ধরনের জটিল বৈশিষ্ট্যগুলি একসাথে সঠিকভাবে কাজ করতে পারে তা নিশ্চিত করার জন্য ইউনিট পরীক্ষা অপর্যাপ্ত। প্রকৃতপক্ষে, এটি সফ্টওয়্যার পরীক্ষার চারটি স্তরের মাত্র প্রথম ধাপ (আমি বড় অক্ষর ব্যবহার করি কারণ আমি শিল্পের মান বা সফ্টওয়্যার পরীক্ষার জন্য সবচেয়ে সাধারণ পদ্ধতির উল্লেখ করি)। শেষ তিনটি ধাপ হলইন্টিগ্রেশন টেস্টিং , সিস্টেম টেস্টিং , এবং অ্যাকসেপ্টেন্স টেস্টিং. এই সবগুলি সম্ভবত আপনি যা মনে করেন তারা ঠিক তা বোঝায়, তবে আমাকে স্পষ্ট করতে দিন: উপরে উল্লিখিত "জটিল বৈশিষ্ট্যগুলি," একে অপরের সাথে সঠিকভাবে যোগাযোগ করার জন্য আমরা যা করতে পারি তা ইন্টিগ্রেশন টেস্টিং। (যেমন, নিশ্চিত করা যে ক্যালকুলেটর "3 + 7 * 4 - 2" পরিচালনা করতে পারে) সিস্টেম টেস্টিং একটি নির্দিষ্ট সিস্টেমের সামগ্রিক নকশা পরীক্ষা করছে; একটি পণ্যে প্রায়শই জটিল বৈশিষ্ট্যগুলির একাধিক সিস্টেম একসাথে কাজ করে, তাই আপনি এগুলিকে সিস্টেমে গোষ্ঠীবদ্ধ করুন এবং পৃথকভাবে পরীক্ষা করুন৷ (উদাহরণস্বরূপ আপনি যদি একটি গ্রাফিং ক্যালকুলেটর তৈরি করছেন, আপনি প্রথমে সংখ্যার সাথে মোকাবিলা করার জন্য গাণিতিক 'সিস্টেম' তৈরি করবেন, যতক্ষণ না এটি উদ্দেশ্য অনুযায়ী কাজ করে ততক্ষণ পরীক্ষা করা হবে এবং তারপর আপনি প্রত্যাহার করার জন্য গ্রাফিং 'সিস্টেম' তৈরি এবং পরীক্ষা করবেন, যেমন এটি গাণিতিক সিস্টেমের বন্ধ তৈরি করবে)। গ্রহণযোগ্যতা পরীক্ষা হল ব্যবহারকারী-স্তরের পরীক্ষা; এটি ব্যবহারকারীদের দ্বারা গ্রহণযোগ্য একটি সমাপ্ত পণ্য তৈরি করতে সমস্ত সিস্টেম সিঙ্কে কাজ করতে পারে কিনা তা দেখছে (যেমন, ব্যবহারকারীরা ক্যালকুলেটর পরীক্ষা করছেন)। সফ্টওয়্যার বিকাশকারীরা কখনও কখনও প্রক্রিয়াটির এই চূড়ান্ত পদক্ষেপটিকে উপেক্ষা করতে পারে, কারণ কোম্পানিগুলি প্রায়শই অন্যান্য কর্মচারীদের আলাদাভাবে ব্যবহারকারী (বিটা) পরীক্ষা নিযুক্ত করে থাকে।

আমি কিভাবে জাভাতে একটি JUnit পরীক্ষা লিখব?

এখন আপনি ইউনিট পরীক্ষার সুবিধা এবং সীমাবদ্ধতা সম্পর্কে একটি পরিষ্কার ধারণা আছে, আসুন কিছু কোড কটাক্ষপাত করা যাক! আমরা JUnit নামে একটি জনপ্রিয় জাভা টেস্টিং ফ্রেমওয়ার্ক ব্যবহার করব (আরেকটি জনপ্রিয় হল TestNG, যেটি আপনি চাইলে ব্যবহার করতে পারেন। এগুলি অনেকটা একই রকম, সিনট্যাক্টিকভাবে; TestNG JUnit দ্বারা অনুপ্রাণিত)। আপনি এখানে JUnit ডাউনলোড এবং ইনস্টল করতে পারেন । এই উদাহরণ কোডের জন্য, আমরা 'বৈজ্ঞানিক ক্যালকুলেটর' উদাহরণটি চালিয়ে যাব যা আমি আগে উল্লেখ করেছি; এটি আপনার মাথা চারপাশে মোড়ানো বেশ সহজ, এবং পরীক্ষার কোড অত্যন্ত সহজ। প্রচলিত অনুশীলন হল আপনার প্রতিটি ক্লাসের জন্য আলাদা পরীক্ষা ক্লাস লিখতে হবে, তাই আমরা সেটাই করব। ধরা যাক এই মুহুর্তে, আমাদের কাছে Math.javaসমস্ত গণিত ফাংশন সহ একটি ফাইল রয়েছে (সহ Math.add), এবং আমরা একটি লিখছিMathTests.javaএকই প্যাকেজে ফাইল। এখন ইম্পোর্ট স্টেটমেন্ট এবং ক্লাস বডি সেট আপ করা যাক: (সম্ভাব্য জুনিট ইন্টারভিউ প্রশ্ন: আপনাকে জিজ্ঞাসা করা হতে পারে আপনার জুনিট পরীক্ষা কোথায় রাখবেন এবং আপনার সোর্স ফাইলগুলি আমদানি করতে হবে কিনা। আপনি যদি একই প্যাকেজে আপনার পরীক্ষার ক্লাস লিখছেন আপনার প্রধান ক্লাস, তাহলে পরীক্ষার ক্লাসে আপনার সোর্স ফাইলের জন্য কোনো ইম্পোর্ট স্টেটমেন্টের প্রয়োজন নেই। অন্যথায়, আপনি আপনার সোর্স ফাইল ইম্পোর্ট করছেন তা নিশ্চিত করুন!)

import org.junit.jupiter.Test;    //gives us the @Test header
import static org.junit.jupiter.api.Assertions.assertEquals; //less typing :) 

public class MathTests {
	//...
}
প্রথম আমদানি বিবৃতি আমাদের @Testহেডার দেয়। @Testআমরা প্রতিটি পরীক্ষার ফাংশনের সংজ্ঞার উপরে সরাসরি ' ' লিখি , যাতে JUnit জানে যে এটি একটি একক ইউনিট পরীক্ষা যা আলাদাভাবে চালানো যেতে পারে। পরে, আমি আপনাকে দেখাব কিভাবে আপনি এই হেডার ব্যবহার করে নির্দিষ্ট ইউনিট পরীক্ষা চালাতে পারেন। দ্বিতীয় আমদানি বিবৃতি আমাদের টাইপিং একটু বিট সংরক্ষণ করে. আমাদের ফাংশন পরীক্ষা করার জন্য আমরা যে প্রাথমিক JUnit ফাংশনটি ব্যবহার করি তা হল Assert.assertEquals(), যা দুটি প্যারামিটার (প্রকৃত মান এবং প্রত্যাশিত মান) নেয় এবং নিশ্চিত করে যে তারা সমান। এই দ্বিতীয় আমদানি বিবৃতিটি আমাদেরকে শুধুমাত্র ' ' টাইপ করার অনুমতি দেয় assertEquals(...প্রতিবার এটি কোন প্যাকেজের অংশ তা নির্দিষ্ট করার পরিবর্তে। এখন 2 + 2 প্রকৃতপক্ষে 4 তা যাচাই করার জন্য একটি খুব সাধারণ টেস্ট কেস লিখি!

import org.junit.jupiter.Test; // gives us the @Test header
import static org.junit.jupiter.api.Assertions.assertEquals; // less typing :) 


public class MathTests {
	@Test
	public void add_twoPlusTwo_returnsFour(){
	final int expected = 4;
	final int actual = Math.add(2, 2);
	assertEquals(“2+2 is 4”, actual, expected);
	}
}
আসুন পরীক্ষা ফাংশনের প্রতিটি পাঁচটি লাইনের উপর যান এবং তারা কী করে: লাইন 5: এই @Testহেডারটি নির্দিষ্ট করে যে নীচের ফাংশনের সংজ্ঞাটি add_twoPlusTwo_returnsFour()আসলেই একটি পরীক্ষা ফাংশন যা JUnit আলাদাভাবে চালাতে পারে। লাইন 6: এটি আমাদের পরীক্ষার ক্ষেত্রে ফাংশন স্বাক্ষর। টেস্ট কেস সবসময় খুব একক হয়; তারা শুধুমাত্র একটি নির্দিষ্ট উদাহরণ পরীক্ষা করে, যেমন 2+2=4। আপনি যে ফাংশনটি পরীক্ষা করছেন সেটির নাম কোথায় [function]_[params]_returns[expected](), আপনি যে নির্দিষ্ট উদাহরণ পরামিতিগুলি পরীক্ষা করছেন এবং ফাংশনের প্রত্যাশিত রিটার্ন মান হল সেটি হল আপনার [function]পরীক্ষার কেসগুলির নাম " " ফর্মে রাখা নিয়ম৷ টেস্ট ফাংশনে প্রায় সবসময়ই একটি রিটার্ন টাইপ থাকে ' ' কারণ পুরো ফাংশনের মূল পয়েন্টটি চালানো হয়[params][expected]voidassertEquals, যা আপনার পরীক্ষা পাস হোক বা না হোক কনসোলে আউটপুট করবে; আপনার কোথাও ফেরত দেওয়ার জন্য অন্য কোনো ডেটার প্রয়োজন নেই। লাইন 7: আমরা finalরিটার্ন টাইপের একটি ' ' ভেরিয়েবল ঘোষণা করি Math.add (int)এবং কনভেনশন অনুসারে এটিকে 'প্রত্যাশিত' নাম দিই। এর মান হল উত্তর যা আমরা আশা করছি (4)। লাইন 8: আমরা finalরিটার্ন টাইপের একটি ' ' ভেরিয়েবল ডিক্লেয়ার করি Math.add (int)এবং কনভেনশন অনুসারে এটিকে 'প্রকৃত' নাম দিই। এর মান এর ফলাফল Math.add(2, 2)। লাইন 9: সুবর্ণ লাইন। এটি এমন লাইন যা প্রকৃত এবং প্রত্যাশিত তুলনা করে এবং আমাদের বলে যে আমরা পরীক্ষায় উত্তীর্ণ হয়েছি শুধুমাত্র যদি তারা সমান হয়। পাস করা প্রথম প্যারামিটারটি "2+2 হল 4" হল পরীক্ষার ফাংশনের বর্ণনা।

যদি আমার ফাংশন একটি ব্যতিক্রম নিক্ষেপ করা উচিত?

যদি আপনার নির্দিষ্ট পরীক্ষার উদাহরণটি একটি বাস্তব এবং প্রত্যাশিত মান সমান বলে দাবি করার পরিবর্তে একটি ব্যতিক্রম নিক্ষেপ করা উচিত, তাহলে JUnit এর শিরোনামে এটি স্পষ্ট করার একটি উপায় রয়েছে @Test। আসুন নীচের একটি উদাহরণ দেখুন। Math.javaধরে নিলাম যে আমাদের কলে একটি ফাংশন আছে Math.divide, আমরা নিশ্চিত করতে চাই যে ইনপুটগুলিকে 0 দ্বারা ভাগ করা যাবে না। পরিবর্তে, যেকোনো 'a' মান কল করার চেষ্টা করলে একটি ব্যতিক্রম ( ) Math.divide(a, 0)নিক্ষেপ করা উচিত । ArithmeticException.classআমরা শিরোনামে এইভাবে উল্লেখ করি:

import org.junit.jupiter.Test; // gives us the @Test header
import static org.junit.jupiter.api.Assertions.assertEquals; // less typing :) 


public class MathTests {
	@Test (expectedExceptions = ArithmeticException.class)
	public void divide_byZero_throwsException() throws ArithmeticException{
	Math.divide(1, 0);
	}
}
আপনার জন্য একাধিক ব্যতিক্রম থাকতে পারে expectedExceptions, শুধু আপনার ব্যতিক্রম ক্লাস তালিকাভুক্ত করতে বন্ধনী এবং কমা ব্যবহার নিশ্চিত করুন, যেমন:

expectedException = {FirstException.class, SecondException.class, … }

আমি কিভাবে জাভাতে আমার JUnit পরীক্ষা চালাব?

IntelliJ-এ JUnit কীভাবে যোগ করবেন: https://stackoverflow.com/questions/19330832/setting-up-junit-with-intellij-idea আপনি আপনার প্রকল্পটি চালাতে পারেন যেভাবে আপনি সাধারণত পরীক্ষা চালান। একটি পরীক্ষার ক্লাসে সমস্ত পরীক্ষা চালানো হলে সেগুলিকে বর্ণানুক্রমিকভাবে চালানো হবে। @OrderJUnit 5-এ, আপনি একটি ট্যাগ যোগ করে পরীক্ষাগুলিতে অগ্রাধিকার যোগ করতে পারেন । একটি উদাহরণ:

@TestMethodOrder(OrderAnnotation.class)
public class Tests {
…
@Test
@Order(2)
public void a_test() { … }

@Test
@Order (1)
public void b_test() { … }
…
}
যদিও বর্ণানুক্রমিকভাবে এবং কোডে a_test()আগে আসে , এখানে আগে চলবে , কারণ ক্রম অনুসারে 2 এর আগে 1 আসে। তাই যে JUnit এর মৌলিক জন্য সব সম্পর্কে. এখন, কিছু সাধারণ JUnit ইন্টারভিউ প্রশ্ন মোকাবেলা করা যাক, এবং পথ ধরে JUnit সম্পর্কে আরও কিছু জানুন! b_test()b_test()a_test()

JUnit ইন্টারভিউ প্রশ্ন (অতিরিক্ত তথ্য)

এখানে আমি সবচেয়ে জনপ্রিয় JUnit ইন্টারভিউ প্রশ্ন সংগ্রহ করেছি। আপনার যদি কিছু যোগ করার থাকে - নীচের মন্তব্যে এটি করতে দ্বিধা বোধ করুন। প্রশ্ন: পরীক্ষায় স্বয়ংক্রিয়ভাবে ব্যর্থ হওয়ার জন্য আপনি আপনার পরীক্ষা পদ্ধতিতে কোন পদ্ধতিকে কল করতে পারেন? একটি: ব্যর্থ ("ত্রুটির বিবরণ এখানে!"); প্রশ্ন: আপনি একটি কুকুর ক্লাস পরীক্ষা করছেন; একটি Dog অবজেক্ট পরীক্ষা করার জন্য, আপনি এটিতে পরীক্ষা চালানোর আগে এটিকে ইনস্ট্যান্টিয়েট করতে হবে। সুতরাং আপনি কুকুরটিকে ইনস্ট্যান্ট করার জন্য একটি সেটআপ() ফাংশন লিখুন। সমস্ত পরীক্ষার সময় আপনি শুধুমাত্র একবার এই ফাংশনটি চালাতে চান। SetUp() ফাংশন স্বাক্ষরের উপরে আপনাকে সরাসরি কী রাখতে হবে যাতে JUnit পরীক্ষা চালানোর আগে setUp() চালাতে জানে? A: @BeforeClass (@BeforeAll JUnit 5) প্রশ্ন:উপরে বর্ণিত setUp() ফাংশনের ফাংশন স্বাক্ষর কি হতে হবে? উত্তর: পাবলিক স্ট্যাটিক শূন্যতা। @BeforeClass (@BeforeAll in JUnit 5) অথবা @AfterClass (@AfterAll JUnit 5) সহ যেকোনো ফাংশন স্ট্যাটিক হওয়া দরকার। প্রশ্ন: আপনি কুকুর ক্লাস পরীক্ষা সম্পন্ন করেছেন. আপনি void tearDown() ফাংশন লিখুন যা ডেটা পরিষ্কার করে এবং প্রতিটি পরীক্ষার পরে কনসোল করার জন্য তথ্য মুদ্রণ করে। আপনি এই ফাংশন প্রতিটি একক পরীক্ষার পরে চালানোর জন্য চান. টিয়ারডাউন() ফাংশন সিগনেচারের উপরে আপনাকে সরাসরি কী রাখতে হবে যাতে জুনিট প্রতিটি পরীক্ষা চালানোর পরে টিয়ারডাউন() চালাতে জানে? A: @After (@AfterEach জুন 5 এ)
মন্তব্য
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION