আমি একটি বৃহত কোড বেসে JUnit পরীক্ষা চালিয়ে যাচ্ছি এবং আমি বুঝতে পেরেছি যে কখনও কখনও আমি "ত্রুটি" পাই যখন অন্য সময় আমি "ব্যর্থতা" পাই। পার্থক্য কি?
উত্তর:
ঠিক আছে, আমি সবেমাত্র একটি প্যাটার্ন লক্ষ্য করেছি এবং মনে করি আমি এটি বের করেছি (আমি ভুল হলে আমাকে সংশোধন করুন)। আমার কাছে মনে হয় যে ব্যর্থতাগুলি যখন আপনার পরীক্ষার কেসগুলি ব্যর্থ হয় - যেমন আপনার দাবিগুলি ভুল। ত্রুটিগুলি অপ্রত্যাশিত ত্রুটি যা প্রকৃতপক্ষে পরীক্ষা চালানোর চেষ্টা করার সময় ঘটে - ব্যতিক্রম ইত্যাদি are
@Test
সাথে এটিটি টিকিয়ে দেওয়া উচিত expected = SomeException.class
।
যদি আপনার পরীক্ষাটি এমন ব্যতিক্রম ছুঁড়ে দেয় যা জুনিতের দৃser়তা কাঠামোর মাধ্যমে বুদবুদ হয় না, তবে এটি একটি ত্রুটি হিসাবে প্রতিবেদন হয়ে যায়। উদাহরণস্বরূপ, একটি নালপয়েন্টার, বা ক্লাসনটফাউন্ড ব্যতিক্রম একটি ত্রুটির প্রতিবেদন করবে:
String s = null;
s.trim();
বা,
try {
// your code
} catch(Exception e) {
// log the exception
throw new MyException(e);
}
এটি বলার পরে, নিম্নলিখিতগুলি একটি ব্যর্থতার রিপোর্ট করবে:
Assert.fail("Failure here");
বা,
Assert.assertEquals(1, 2);
অথবা এমনকি:
throw new AssertionException(e);
এটি আপনি যে জুনিট সংস্করণটি ব্যবহার করছেন তার উপর নির্ভর করে। জুনিট 4- একটি ব্যর্থতা এবং একটি ত্রুটির মধ্যে পার্থক্য তৈরি করবে, তবে জুনিট 4 এটিকে কেবল ব্যর্থতা হিসাবে সরল করে।
নিম্নলিখিত লিঙ্কটি আরও আকর্ষণীয় ইনপুট সরবরাহ করে:
"JUnit সহ জাভা 8-তে প্র্যাকমেটিক ইউনিট টেস্টিং" থেকে:
JUnit এ যুক্তি (বা জোর দেওয়া) হ'ল স্থির পদ্ধতি কল যা আপনি আপনার পরীক্ষাগুলিতে নেমে যান। প্রতিটি দৃ়তা কিছু শর্ত সত্য বলে তা যাচাই করার একটি সুযোগ। যদি দৃserted়ভাবে শর্তটি ধরে না রাখে তবে পরীক্ষাটি ঠিক সেখানেই থেমে যায়, এবং ইউনিত একটি পরীক্ষার ব্যর্থতার খবর দেয়।
(এটিও সম্ভব যে যখন ইউনাইট আপনার পরীক্ষা চালায়, তখন একটি ব্যতিক্রম ছুঁড়ে ফেলা হয় এবং ধরা পড়ে না this এক্ষেত্রে, জুনিত একটি পরীক্ষার ত্রুটির খবর দেয়))
আমি পরীক্ষার ত্রুটি এবং পরীক্ষার ব্যর্থতা ছুঁড়ে এমন লাইনে মন্তব্য করেছি।
@Test
public void testErrorVsTestFailure() {
final String sampleString = null;
assertEquals('j', sampleString.charAt(0) );
//above line throws test error as you are trying to access charAt() method on null reference
assertEquals(sampleString, "jacob");
//above line throws Test failure as the actual value-a null , is not equal to expected value-string "jacob"
}
সুতরাং জুনিট পরীক্ষার ত্রুটি দেখায় যখনই আপনি ব্যতিক্রম পান এবং যখন আপনার প্রত্যাশিত ফলাফলের মানটি আপনার প্রকৃত মানের সাথে মেলে না তখন পরীক্ষার ব্যর্থতা দেখায়
উত্স শ্রেণি: জুনিটরপোর্টপোর্ট রিপোর্টার.জভা
public void generateReport(List<XmlSuite> xmlSuites, List<ISuite> suites, String defaultOutputDirectory) {
//......
for (ITestResult tr : (Set) entry.getValue()) {
TestTag testTag = new TestTag();
boolean isSuccess = tr.getStatus() == 1;
if (!(isSuccess)) {
if (tr.getThrowable() instanceof AssertionError)
++errors;
else {
++failures;
}
}
}
আপনি উপরের পদ্ধতিতে নীচে লাইন দেখতে পারেন
tr.getThrowable () উদাহরণ হিসাবে AssertionError
ত্রুটি গণনা বৃদ্ধি করা হয় যখন এটি AssertionError এর উদাহরণ হয় অন্যথায় (কোনও থ্রোয়েবল) ব্যর্থতা হিসাবে গণনা করা হয়।
আপনি ঠিক বলেছেন যে ব্যর্থতা JUnit দৃser়পদ পদ্ধতি দ্বারা উত্থাপিত AssertionErferences থেকে, বা একটি AssertionError নিক্ষেপ করে, বা আপনি আপনার @Test
টীকাতে ঘোষণা করেছেন এমন একটি ব্যতিক্রম ছুঁড়ে ফেলেছে এবং ত্রুটিগুলি অপ্রত্যাশিত ব্যতিক্রম থেকে আসে। তবে তাদের মধ্যে একটি গুরুত্বপূর্ণ পার্থক্য রয়েছে:
একটি ব্যর্থতার অর্থ হল আপনার পরীক্ষাটি সঠিকভাবে চলেছিল এবং আপনার কোডটিতে একটি ত্রুটি চিহ্নিত করেছে।
একটি ত্রুটি বলতে আপনার কোডে একটি বাগ বোঝাতে পারে, তবে এটির জন্য আপনি এমনকি পরীক্ষাও করছিলেন না। এর অর্থ এটিও হতে পারে যে বাগটি নিজেই পরীক্ষায় রয়েছে।
সংক্ষেপে, একটি ব্যর্থতার অর্থ হল যে কোডটি পরীক্ষা করা হচ্ছে তা আবার লিখতে হবে। একটি ত্রুটির অর্থ হল এটি আপনাকে পুনর্লিখনের প্রয়োজন সেই একক পরীক্ষা হতে পারে। এর অর্থ হতে পারে এমনকি যদি আপনার কোডটিতে ব্যর্থতা ছিল, যেমন একটি NullPointerException
, কারণ আপনি এমন একটি ত্রুটি সনাক্ত করেছেন যা আপনি এমনকি পরীক্ষা করছেন না, তাই এটি পরীক্ষা করা বুদ্ধিমানের কাজ হতে পারে।
হাস্যকরভাবে, জুনিট এবং অন্যান্য পরীক্ষার সাথে সম্পর্কিত ফ্রেমওয়ার্কগুলি (টেস্টং, হ্যামক্রেষ্ট) শর্ত যাচাই করে এবং যদি এটি ব্যর্থ হয় তবে " জাওআংআলং " এর অধীনে একটি জাভা.আং.অ্যাসেশন-এররার নিক্ষেপ করা হচ্ছে, যা বিটিডাব্লু জাভা.আং.আরগার প্রসারিত করে।
তবে এটি কোনওভাবেই উপরের উত্তরগুলির সাথে বিরোধী নয় যা অবশ্যই পুরোপুরি বৈধ। সুতরাং নির্দিষ্ট পরীক্ষার প্রবাহকে ব্যর্থতা হিসাবে চিহ্নিত করতে কেউ AssertionError নিক্ষেপ করতে পারে তবে আমি নিশ্চিত নই যে এটি সত্যই সম্পর্কিত ম্যানুয়ালগুলিতে নথিভুক্ত, কারণ ডেডিকেটেড ব্যর্থ () এপিআই ব্যবহার করা আরও উপযুক্ত। অন্যান্য ধরণের থ্রোয়েবল ব্যর্থতা হিসাবে নয়, ত্রুটি হিসাবে বিবেচিত হবে।
java.lang.AssertionError
কিছু নিক্ষেপ করা হয় তবে এটি পরীক্ষার ত্রুটির পরিবর্তে পরীক্ষার ব্যর্থতা হিসাবে প্রদর্শিত হবে। আপনার নিজের উত্তর গ্রহণ করা বিবেচনা করা উচিত কারণ এটি সঠিক।