আমি ভাবছি জাভা 8 আসার পর থেকে জাভাটির জন্য বর্তমান সরঞ্জামগুলির দ্বারা শর্তাধীন কোড কভারেজ পরিমাপ করা অচল নয়। জাভা 8 এর সাথে Optional
এবং Stream
আমরা প্রায়শই কোড শাখা / লুপগুলি এড়াতে পারি, যা সমস্ত সম্ভাব্য মৃত্যুদন্ডের পথ পরীক্ষা না করে খুব উচ্চতর শর্তযুক্ত কভারেজ পাওয়া সহজ করে তোলে। আসুন জাভা 8 কোডের সাথে পুরানো জাভা কোডটি তুলনা করি:
জাভা 8 এর আগে:
public String getName(User user) {
if (user != null) {
if (user.getName() != null) {
return user.getName();
}
}
return "unknown";
}
উপরোক্ত পদ্ধতিতে কার্যকর সম্ভাব্য 3 টি পাথ রয়েছে। শর্তসাপেক্ষে কভারেজের 100% পেতে আমাদের 3 ইউনিট পরীক্ষা তৈরি করতে হবে।
জাভা 8:
public String getName(User user) {
return Optional.ofNullable(user)
.map(User::getName)
.orElse("unknown");
}
এই ক্ষেত্রে, শাখাগুলি গোপন রয়েছে এবং 100% কভারেজ পাওয়ার জন্য আমাদের কেবল 1 টি পরীক্ষা প্রয়োজন এবং আমরা কোন ক্ষেত্রে পরীক্ষা করব তা বিবেচ্য নয়। যদিও এখনও একই 3 যৌক্তিক শাখা রয়েছে যা আবৃত করা উচিত আমি বিশ্বাস করি। আমি মনে করি যে এটি শর্তযুক্ত কভারেজের পরিসংখ্যানগুলিকে এই দিনগুলিতে সম্পূর্ণ অবিশ্বস্ত করে তোলে।
জাভা 8 কোডের জন্য শর্তসাপেক্ষিত কভারেজ পরিমাপ করা কি বোধগম্য? আন্ডারস্টেট কোড স্পট করছে এমন অন্য কোনও সরঞ্জাম রয়েছে কি?
getName
? দেখে মনে হচ্ছে এটি যদি user
নাল হয় তবে এটি "অজানা" ফিরে আসা উচিত। যদি user
শূন্য না হয় এবং user.getName()
শূন্য হয় তবে এটি "অজানা" ফিরে আসা উচিত। যদি user
শূন্য না হয় এবং শূন্য user.getName()
না হয়, এটি ফিরে আসা উচিত। সুতরাং আপনি সেই তিনটি ক্ষেত্রে ইউনিট-পরীক্ষা করবেন কারণ এটি চুক্তির getName
বিষয়ে। আপনি এটি পিছিয়ে করছেন বলে মনে হচ্ছে। আপনি শাখাগুলি দেখতে এবং সেগুলি অনুসারে পরীক্ষাগুলি লিখতে চান না, আপনি আপনার চুক্তি অনুসারে আপনার পরীক্ষাগুলি লিখতে চান এবং চুক্তিটি পূর্ণ হয়েছে তা নিশ্চিত করতে চান। আপনার যখন ভাল কভারেজ থাকে তখনই।