জাভা 8 কোডের জন্য শর্তসাপেক্ষিত কভারেজ পরিমাপ করা কি বোধগম্য?


19

আমি ভাবছি জাভা 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 কোডের জন্য শর্তসাপেক্ষিত কভারেজ পরিমাপ করা কি বোধগম্য? আন্ডারস্টেট কোড স্পট করছে এমন অন্য কোনও সরঞ্জাম রয়েছে কি?


5
আপনার কোডটি ভালভাবে পরীক্ষা করা হয়েছে কিনা তা নির্ধারণের জন্য কভারেজ ম্যাট্রিক্স কখনও ভাল উপায় হয় নি , কেবল যা পরীক্ষা করা হয়নি তা নির্ধারণ করার জন্য । একজন ভাল বিকাশকারী তার মনের বিভিন্ন ক্ষেত্রে চিন্তা করবে এবং সেগুলির জন্য পরীক্ষার পরিকল্পনা করবে - বা কমপক্ষে যা সে গুরুত্বপূর্ণ বলে মনে করে।
কেডগ্রিগরি

3
অবশ্যই উচ্চ শর্তসাপেক্ষিত কভারেজটির অর্থ এই নয় যে আমাদের ভাল পরীক্ষা রয়েছে, তবে আমি মনে করি যে মৃত্যুদন্ড কার্যকর করার পথগুলি উন্মুক্ত এবং এটিই বেশিরভাগ ক্ষেত্রে প্রশ্নটি। শর্তসাপেক্ষে কভারেজ ব্যতীত অনির্ধারিত পরিস্থিতি সনাক্ত করা আরও শক্ত। পাথ সম্পর্কিত: [ব্যবহারকারী: নাল], [ব্যবহারকারী: নোটনল, ইউজার নাম: নুল], [ব্যবহারকারী: নোটনাল, ইউজার নাম: নোটনাল]। আমি কী মিস করছি?
ক্যারল লেয়ান্ডোভস্কি

6
কিসের চুক্তি getName? দেখে মনে হচ্ছে এটি যদি userনাল হয় তবে এটি "অজানা" ফিরে আসা উচিত। যদি userশূন্য না হয় এবং user.getName()শূন্য হয় তবে এটি "অজানা" ফিরে আসা উচিত। যদি userশূন্য না হয় এবং শূন্য user.getName()না হয়, এটি ফিরে আসা উচিত। সুতরাং আপনি সেই তিনটি ক্ষেত্রে ইউনিট-পরীক্ষা করবেন কারণ এটি চুক্তির getNameবিষয়ে। আপনি এটি পিছিয়ে করছেন বলে মনে হচ্ছে। আপনি শাখাগুলি দেখতে এবং সেগুলি অনুসারে পরীক্ষাগুলি লিখতে চান না, আপনি আপনার চুক্তি অনুসারে আপনার পরীক্ষাগুলি লিখতে চান এবং চুক্তিটি পূর্ণ হয়েছে তা নিশ্চিত করতে চান। আপনার যখন ভাল কভারেজ থাকে তখনই।
ভিনসেন্ট সাভার্ড 20

1
আবার, আমি বলছি না যে কভারেজটি প্রমাণ করে যে আমার কোডটি নিখুঁতভাবে পরীক্ষা করা হয়েছে, তবে এটি নিশ্চিতভাবে মূল্যায়নযোগ্য সরঞ্জাম ছিল যা আমি নিশ্চিত করে পরীক্ষা করেছি না। আমি মনে করি যে পরীক্ষার চুক্তিগুলি কার্যকরকরণের পাথগুলি পরীক্ষা করা থেকে অবিচ্ছেদ্য ((আপনার উদাহরণটি ব্যতিক্রমী কারণ এতে অন্তর্নিহিত ভাষা প্রক্রিয়া জড়িত)। আপনি যদি পরীক্ষার পথটি না পরীক্ষা করে থাকেন তবে আপনি সম্পূর্ণরূপে চুক্তি সম্পাদন করেন নি বা চুক্তিটি পুরোপুরি সংজ্ঞায়িত হয়নি।
ক্যারল লেয়ান্ডোভস্কি

2
আমি আমার আগের বিষয়টির পুনরাবৃত্তি করতে যাচ্ছি: এটি সর্বদা ক্ষেত্রে unless যার অর্থ কোনও তৃতীয় পক্ষের গ্রন্থাগার নেই এবং এসডিকে কোনও ব্যবহার নেই।
কেডিগ্রিগরি

উত্তর:


4

জাভা 8 এ তৈরি করা যেতে পারে এমন যৌক্তিক শাখাগুলি পরিমাপ করার মতো কোনও সরঞ্জাম রয়েছে?

আমি কারও সম্পর্কে সচেতন নই। জ্যাকোকো (ওরফে ইক্লিএমা) এর মাধ্যমে আপনার যে কোডটি রয়েছে তা চালানোর চেষ্টা করেছি, তবে এটি Optionalসংস্করণে 0 টি শাখা দেখায় । অন্যথায় এটির কনফিগার করার কোনও পদ্ধতি আমার জানা নেই। আপনি যদি এটি জেডিকে ফাইলগুলি অন্তর্ভুক্ত করার জন্য কনফিগার করেন তবে এটি তাত্ত্বিকভাবে শাখাগুলি প্রদর্শন করবে Optionalতবে আমি মনে করি জেডিকে কোড যাচাই করা শুরু করা নিরীহ হবে। আপনাকে কেবল এটি সঠিক বলে ধরে নিতে হবে।

আমি মনে করি মূল সমস্যাটি যদিও বুঝতে পেরেছে যে জাভা 8 এর আগে আপনার অতিরিক্ত শাখাগুলি এক অর্থে কৃত্রিমভাবে তৈরি শাখা ছিল। জাভা 8 এ তাদের আর অস্তিত্ব নেই এর অর্থ হ'ল কাজের জন্য এখন আপনার কাছে সঠিক সরঞ্জাম রয়েছে (এই ক্ষেত্রে, Optional)। প্রাক জাভা 8 কোডে আপনাকে অতিরিক্ত ইউনিট পরীক্ষা লিখতে হয়েছিল যাতে আপনার আত্মবিশ্বাস থাকতে পারে যে কোডের প্রতিটি শাখা একটি গ্রহণযোগ্য উপায়ে আচরণ করে - এবং কোডের বিভাগগুলিতে এটি কিছুটা গুরুত্বপূর্ণ হয়ে ওঠে যা User/ / এর মতো তুচ্ছ নয় / getNameউদাহরণ।

জাভা 8 কোডে, আপনি এর পরিবর্তে কোডটি সঠিকভাবে কাজ করে এমন জেডিকে আপনার আস্থা রাখছেন। যেমনটি, আপনার Optionalকোডটি কভারেজ সরঞ্জামগুলি যেমন আচরণ করে তেমন লাইনটিও আচরণ করা উচিত : 0 টি শাখা সহ 3 লাইন। সেখানে কোডে অন্যান্য লাইন এবং শাখা যে নীচে কোন কিছু যা আপনি ঠিক আগে মনোযোগ প্রদান করা হয় নি, কিন্তু প্রত্যেক সময় আপনি ব্যবহার কিছু একটি মত করেছি অস্তিত্ব হয়েছে ArrayListবা HashMap


2
"যে তারা আর জাভা 8 তে বিদ্যমান নেই ..." - আমি এটির সাথে একমত হতে পারি না, জাভা 8 পশ্চাদপটে সামঞ্জস্যপূর্ণ ifএবং nullএটি এখনও ভাষার অংশ; ;) পুরানো উপায়ে কোড লেখা এবং পাস করা এখনও সম্ভব nullব্যবহারকারী বা nullনাম সহ ব্যবহারকারী user আপনার পরীক্ষাগুলি কেবল প্রমাণিত করা উচিত যে পদ্ধতিটি কীভাবে প্রয়োগ করা হয় তা নির্বিশেষে চুক্তিটি পূরণ করা হয়। মুল বক্তব্যটি হ'ল আপনি যদি চুক্তিটি পুরোপুরি পরীক্ষিত করেন তবে আপনাকে বলার মতো কোনও সরঞ্জাম নেই।
করোল লেয়ানডোভস্কি

1
@ কারোললিভান্ডোভস্কি আমি মনে করি শাজ যা বলছে তা হ'ল আপনি যদি Optional(এবং সম্পর্কিত পদ্ধতিগুলি) কীভাবে কাজ করেন তা বিশ্বাস করেন তবে আপনাকে আর পরীক্ষা করতে হবে না। আপনি যেভাবে পরীক্ষা করেছিলেন সেভাবে নয় if-else: প্রত্যেকটিই ifছিল একটি সম্ভাব্য মাইনফিল্ড। Optionalএবং অনুরূপ ক্রিয়াকলাপের আইডিয়ামগুলি ইতিমধ্যে কোড করে দেওয়া হয়েছে এবং আপনাকে বেড়াতে যাওয়ার গ্যারান্টিযুক্ত নেই, সুতরাং মূলত সেখানে একটি "শাখা" নিখোঁজ হয়ে গেছে।
আন্দ্রেস এফ।

1
@AndresF। আমি মনে করি না যে করল আমাদের পরীক্ষা করার পরামর্শ দিচ্ছে Optional। যেমনটি তিনি বলেছিলেন, যুক্তিযুক্তভাবে আমাদের এখনও পরীক্ষা করা উচিত যা আমরা getName()যতটা সম্ভব বিভিন্ন পরিকল্পনা প্রয়োগ করি না কেন আমাদের উদ্দেশ্য হিসাবে পরিচালনা করে। কোড কভারেজ টুলিং ছাড়াই এটি নির্ধারণ করা আরও শক্ত
মাইক পার্টরিজ

1
@ মাইকপার্টরিজ হ্যাঁ, তবে মুল বক্তব্যটি এটি শাখার কভারেজের মাধ্যমে হয়নি। লেখার সময় শাখার কভারেজ প্রয়োজন if-elseকারণ সেগুলি প্রতিটি নির্মাণ সম্পূর্ণরূপে অ্যাড-হক। বিপরীতভাবে, Optional, orElse, map, ইত্যাদি, সমস্ত ইতিমধ্যে পরীক্ষা করা হয়। যখন আপনি আরও শক্তিশালী প্রতিমা ব্যবহার করেন তখন শাখাগুলি কার্যকরভাবে "বিলুপ্ত" হয়।
আন্দ্রেস এফ।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.