রিয়েল ওয়ার্ল্ডে, অন্য কারও কোডের জন্য ইউনিট পরীক্ষাগুলি লেখা সম্পূর্ণ স্বাভাবিক normal অবশ্যই, মূল বিকাশকারীটি এটি ইতিমধ্যে করা উচিত ছিল, তবে প্রায়শই আপনি উত্তরাধিকার কোডটি পান যেখানে এটি ঠিক করা হয়নি। যাইহোক, উত্তরাধিকারের কোডটি বহু গ্যালাক্সি থেকে বহু দশক আগে এসেছিল কিনা, দূরের কথা, বা আপনার সহকর্মীদের মধ্যে কেউ গত সপ্তাহে এটি পরীক্ষা করেছে বা আপনি আজ লিখেছেন কিনা, লিগ্যাসি কোডটি পরীক্ষা ছাড়াই কোড কিনা তা বিবেচনাধীন নয় doesn't
নিজেকে জিজ্ঞাসা করুন: কেন আমরা ইউনিট পরীক্ষা লিখি? গ্রিনে যাওয়া স্পষ্টতই শেষ হওয়ার এক মাধ্যম, চূড়ান্ত লক্ষ্যটি হচ্ছে পরীক্ষার অধীনে কোড সম্পর্কে দৃser়তা প্রমাণ বা প্রমাণ করা।
বলুন আপনার কাছে এমন একটি পদ্ধতি রয়েছে যা ভাসমান-পয়েন্ট সংখ্যাটির বর্গমূল গণনা করে। জাভাতে, ইন্টারফেসটি এটিকে সংজ্ঞায়িত করবে:
public double squareRoot(double number);
আপনি প্রয়োগটি লিখেছেন বা অন্য কেউ করেছেন কিনা তা বিবেচ্য নয়, আপনি স্কোয়ার রুটের কয়েকটি বৈশিষ্ট্য যুক্ত করতে চান:
- এটি স্কয়ার্টের মতো সাধারণ শিকড়গুলি ফিরিয়ে আনতে পারে (4.0)
- এটি স্কয়ার্ট (২.০) এর মতো যুক্তিসঙ্গত নির্ভুলতার মতো একটি বাস্তব শিকড় খুঁজে পেতে পারে
- এটি দেখতে পাবে যে স্কয়ার্ট (0.0) 0.0
- itণাত্মক সংখ্যা খাওয়ানোর সময় এটি একটি অবৈধ অরগমেন্ট এক্সেপশনটি ছুড়ে দেয়, যেমন স্কয়ার্ট-এ (-১.০)
সুতরাং আপনি এগুলি স্বতন্ত্র পরীক্ষা হিসাবে লিখতে শুরু করুন:
@Test
public void canFindSimpleRoot() {
assertEquals(2, squareRoot(4), epsilon);
}
ওহো, এই পরীক্ষাটি ইতিমধ্যে ব্যর্থ হয়েছে:
java.lang.AssertionError: Use assertEquals(expected, actual, delta) to compare floating-point numbers
আপনি ভাসমান পয়েন্ট পাটিগণিত সম্পর্কে ভুলে গেছেন। ঠিক আছে, আপনি পরিচয় করিয়ে দিন double epsilon=0.01:
@Test
public void canFindSimpleRootToEpsilonPrecision() {
assertEquals(2, squareRoot(4), epsilon);
}
এবং অন্যান্য পরীক্ষা যোগ করুন: অবশেষে
@Test
@ExpectedException(IllegalArgumentException.class)
public void throwsExceptionOnNegativeInput() {
assertEquals(-1, squareRoot(-1), epsilon);
}
ওফ, আবার:
java.lang.AssertionError: expected:<-1.0> but was:<NaN>
আপনার পরীক্ষা করা উচিত ছিল:
@Test
public void returnsNaNOnNegativeInput() {
assertEquals(Double.NaN, squareRoot(-1), epsilon);
}
আমরা এখানে কি করেছি? পদ্ধতিটি কীভাবে আচরণ করা উচিত সে সম্পর্কে আমরা কয়েকটি অনুমান দিয়ে শুরু করেছিলাম এবং দেখেছি যে সমস্ত সত্য ছিল না। তারপরে আমরা পদ্ধতিটি আমাদের সংশোধিত অনুমান অনুসারে আচরণ করে তা প্রমাণ লিখতে আমরা পরীক্ষার স্যুটটি সবুজ করে দিয়েছি। এখন এই কোডের ক্লায়েন্টরা এই আচরণের উপর নির্ভর করতে পারে। যদি কেউ স্কয়াররোটের প্রকৃত বাস্তবায়নকে অন্য কোনও কিছুর সাথে বিনিময় করে, এমন কিছু যা উদাহরণস্বরূপ NaN ফেরার পরিবর্তে সত্যিই একটি ব্যতিক্রম ছুঁড়ে ফেলেছে, আমাদের পরীক্ষাগুলি তা তাৎক্ষণিকভাবে ধরা পড়বে।
এই উদাহরণটি তুচ্ছ, তবে প্রায়শই আপনি কোডের বৃহত অংশে উত্তরাধিকারী হন যেখানে এটি আসলে কী করে তা অস্পষ্ট। সেক্ষেত্রে কোডের চারপাশে একটি পরীক্ষার জোতা রাখা স্বাভাবিক। কোডটি কীভাবে আচরণ করা উচিত সে সম্পর্কে কয়েকটি প্রাথমিক অনুমান দিয়ে শুরু করুন, তাদের জন্য ইউনিট পরীক্ষা লিখুন, পরীক্ষা করুন। সবুজ, ভাল, আরও পরীক্ষা লিখুন। যদি লাল হয়, তবে এখন আপনার ব্যর্থতা রয়েছে যা আপনি কোনও অনুমানের বিরুদ্ধে রাখতে পারেন। লিগ্যাসি কোডে একটি বাগ থাকতে পারে। এই বিশেষ ইনপুট সম্পর্কে অনুমানটি অস্পষ্ট হতে পারে। হয়তো আপনার কাছে কোনও অনুমান নেই। সেক্ষেত্রে পরীক্ষার পুনর্লিখন করুন যাতে এটি অপ্রত্যাশিত আচরণের দলিল করে:
@Test
public void throwsNoExceptionOnNegativeInput() {
assertNotNull(squareRoot(-1)); // Shouldn't this fail?
}
সময়ের সাথে সাথে, আপনি একটি পরীক্ষার জোতা দিয়ে শেষ করেন যা কোডটি আসলে কীভাবে আচরণ করে তা নথিভুক্ত করে এবং একটি কোডেড অনুমান অনুসারে পরিণত হয়। আপনি যদি কখনও লিগ্যাসি কোডটি পরিবর্তন করতে চান বা অন্য কোনও কিছু দিয়ে এটি প্রতিস্থাপন করতে চান তবে নতুন কোডটি একই আচরণ করে বা নতুন কোডটি প্রত্যাশিত এবং নিয়ন্ত্রিত উপায়ে আলাদা আচরণ করে তা পরীক্ষা করার জন্য আপনার কাছে পরীক্ষার জোতা রয়েছে (উদাহরণস্বরূপ এটি আসলে এটি আপনি যে বাগটি সমাধান করেছেন এটি ঠিক করে দেয়) es এই জোতা একদিন সম্পূর্ণ হতে হবে না, আসলে, একটি অসম্পূর্ণ জোতা থাকা সবসময় কোন জোতা না থাকার চেয়ে প্রায় সবসময় ভাল। জোতা থাকার অর্থ আপনি নিজের ক্লায়েন্ট কোডটি আরও স্বাচ্ছন্দ্যে লিখতে পারেন, আপনি জানেন যে আপনি যখন কোনও কিছু পরিবর্তন করেন তখন জিনিসগুলি কোথায় ভেঙে যায় এবং কখন শেষ হয়ে যায় সেগুলি ভেঙে যায় expect
আপনাকে ইউনিট পরীক্ষা লিখতে হবে এমন মানসিকতা থেকে বেরিয়ে আসার চেষ্টা করা উচিত, যেমন আপনার প্রয়োজন যেমন একটি ফর্মের মধ্যে বাধ্যতামূলক ক্ষেত্রগুলি পূরণ করতে হবে। এবং কেবল লাল রেখাকে সবুজ করতে আপনার ইউনিট পরীক্ষা লিখতে হবে না। ইউনিট পরীক্ষাগুলি আপনার শত্রু নয়, ইউনিট পরীক্ষাগুলি আপনার বন্ধু।