JUnit এ ব্যর্থতা এবং ত্রুটির মধ্যে পার্থক্য কী?


93

আমি একটি বৃহত কোড বেসে JUnit পরীক্ষা চালিয়ে যাচ্ছি এবং আমি বুঝতে পেরেছি যে কখনও কখনও আমি "ত্রুটি" পাই যখন অন্য সময় আমি "ব্যর্থতা" পাই। পার্থক্য কি?

উত্তর:


117

ঠিক আছে, আমি সবেমাত্র একটি প্যাটার্ন লক্ষ্য করেছি এবং মনে করি আমি এটি বের করেছি (আমি ভুল হলে আমাকে সংশোধন করুন)। আমার কাছে মনে হয় যে ব্যর্থতাগুলি যখন আপনার পরীক্ষার কেসগুলি ব্যর্থ হয় - যেমন আপনার দাবিগুলি ভুল। ত্রুটিগুলি অপ্রত্যাশিত ত্রুটি যা প্রকৃতপক্ষে পরীক্ষা চালানোর চেষ্টা করার সময় ঘটে - ব্যতিক্রম ইত্যাদি are


5
যদিও প্রসারিত java.lang.AssertionErrorকিছু নিক্ষেপ করা হয় তবে এটি পরীক্ষার ত্রুটির পরিবর্তে পরীক্ষার ব্যর্থতা হিসাবে প্রদর্শিত হবে। আপনার নিজের উত্তর গ্রহণ করা বিবেচনা করা উচিত কারণ এটি সঠিক।
পোনজাও

হ্যাঁ, ঠিক এই পার্থক্য। এবং ব্যবহারিক দৃষ্টিকোণ থেকে "কোনও পার্থক্য নেই" - এটিতে যদি আপনি কোনও ত্রুটি বা ব্যর্থতা পান তবে আপনাকে এটি ঠিক করতে হবে। সুতরাং সম্ভবত "ব্যর্থতা" এবং "ত্রুটিগুলি" আলাদাভাবে জুনিয়নে গণনা করা ভুল ছিল। JUnit 4 এ দুটি সংযুক্ত করে (নীচে একটি উত্তরে ব্যাখ্যা করা হয়েছে)।
জেফ গ্রিগ

এবং যদি ব্যতিক্রমটি প্রত্যাশিত হয় তবে আপনার @Testসাথে এটিটি টিকিয়ে দেওয়া উচিত expected = SomeException.class
ডাউনহিলসকি

@ জেফগ্রিগের মধ্যে একটি বাস্তববাদী পার্থক্য রয়েছে। একাধিক পরীক্ষার ক্ষেত্রে যদি কোনও আচরণের উপর নির্ভর করা হয়, তবে আমি এখনও কেবলমাত্র একটি পরীক্ষার কেস লিখতে পারি যা সেই আচরণকে দৃ .়রূপে বলছে, অনাবৃত অবস্থায় ফেলে দেওয়ার পরে, বাকি সমস্তগুলিতে সম্ভবত সময় ব্যতিক্রম চালাতে পারে। এটি বলছে যে বাকি পরীক্ষার কেসগুলি চালানোর জন্য এখনও সেই নির্দিষ্ট আচরণের উপর নির্ভর করে যদিও অন্য কিছু পরীক্ষা করে something যখন সেই আচরণটি ভেঙে যায়, কেবলমাত্র একটি পরীক্ষার ক্ষেত্রে ব্যর্থতা রিপোর্ট করা হবে যখন বাকী ত্রুটিটি রিপোর্ট করে এবং এ থেকে আমি দেখতে পাচ্ছি যে অনেক পরীক্ষার কেস পাস না হওয়া সত্ত্বেও আমার ঠিক ঠিক একটি বাগ রয়েছে।
রনজেআরএইচ

org.junit.Assert.assertEquals () ব্যর্থ হলে JUnit4 এইচটিএমএল প্রতিবেদন দ্বারা ERROR হিসাবে বিবেচনা করা হয়। এটি আপনার বক্তব্যটির বিরোধী (যা আমি এখনও অবগত ছিলাম)। আপনি কি এই বিষয়ে আরও আলোকপাত করতে পারেন?
কৃষ্ণম

15

যদি আপনার পরীক্ষাটি এমন ব্যতিক্রম ছুঁড়ে দেয় যা জুনিতের দৃ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 এটিকে কেবল ব্যর্থতা হিসাবে সরল করে।

নিম্নলিখিত লিঙ্কটি আরও আকর্ষণীয় ইনপুট সরবরাহ করে:

http://www.devx.com/Java/Article/31983/1763/page/2


এটি সঠিক নয়। পরীক্ষার ব্যর্থতা এবং পরীক্ষার ত্রুটির মধ্যে পার্থক্য JUnit 4 এ যায় নি just আমি কেবল এটি পরীক্ষা করেছি। সংযুক্ত নিবন্ধটি বিভ্রান্তিকর ছিল। এটি বলেছিল যে "JUnit 4 কেবলমাত্র ব্যর্থতা ব্যবহার করে এটিকে সহজ করে তোলে" তবে এটি জোর দেওয়া উচিত যে JUnit 4 java.lang.SsertionError কে পরীক্ষার ব্যর্থতায় রূপান্তর করে যাতে আপনাকে জুনিট.ফ্রেমওয়ার্ক ব্যবহার করতে হবে না। সুবিধাটি হ'ল আপনি JUnit এর সাথে প্রকল্পটি যুক্ত না করেই প্রোডাকশন কোডে পরীক্ষার দাবিগুলি লিখতে শুরু করতে পারেন। পরীক্ষার ত্রুটি এবং পরীক্ষার ব্যর্থতার মধ্যে পার্থক্যও অত্যন্ত কার্যকর এবং এটি অপসারণ করা হলে একটি ধাপ পিছনে যেতে হবে।
রোনজেআরএইচ

রনজেআরএইচ, আপনি কি আপনার ডিফল্ট জুনিট রিপোর্টে ত্রুটিগুলি দেখতে পাচ্ছেন?
নীল

হ্যাঁ নীল। আমি এটি চেষ্টা করেছিলাম। এখানে চিত্রের লিঙ্কের আদব ঠিক নিশ্চিত নয় তবে এটি আমার পরীক্ষার ফলাফল দেখায়: imagebucket.net/abpxucddkvn1/Capture.PNG
রনজেআরএইচ

6

"JUnit সহ জাভা 8-তে প্র্যাকমেটিক ইউনিট টেস্টিং" থেকে:

JUnit এ যুক্তি (বা জোর দেওয়া) হ'ল স্থির পদ্ধতি কল যা আপনি আপনার পরীক্ষাগুলিতে নেমে যান। প্রতিটি দৃ়তা কিছু শর্ত সত্য বলে তা যাচাই করার একটি সুযোগ। যদি দৃserted়ভাবে শর্তটি ধরে না রাখে তবে পরীক্ষাটি ঠিক সেখানেই থেমে যায়, এবং ইউনিত একটি পরীক্ষার ব্যর্থতার খবর দেয়।

(এটিও সম্ভব যে যখন ইউনাইট আপনার পরীক্ষা চালায়, তখন একটি ব্যতিক্রম ছুঁড়ে ফেলা হয় এবং ধরা পড়ে না this এক্ষেত্রে, জুনিত একটি পরীক্ষার ত্রুটির খবর দেয়))


5

টেস্ট ত্রুটি বনাম টেস্ট ব্যর্থতার মধ্যে পার্থক্যটি নীচে পরীক্ষার ব্যাখ্যা করে ।

আমি পরীক্ষার ত্রুটি এবং পরীক্ষার ব্যর্থতা ছুঁড়ে এমন লাইনে মন্তব্য করেছি।

    @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"
        }

সুতরাং জুনিট পরীক্ষার ত্রুটি দেখায় যখনই আপনি ব্যতিক্রম পান এবং যখন আপনার প্রত্যাশিত ফলাফলের মানটি আপনার প্রকৃত মানের সাথে মেলে না তখন পরীক্ষার ব্যর্থতা দেখায়


2

উত্স শ্রেণি: জুনিটরপোর্টপোর্ট রিপোর্টার.জভা

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 এর উদাহরণ হয় অন্যথায় (কোনও থ্রোয়েবল) ব্যর্থতা হিসাবে গণনা করা হয়।


1

আপনি ঠিক বলেছেন যে ব্যর্থতা JUnit দৃser়পদ পদ্ধতি দ্বারা উত্থাপিত AssertionErferences থেকে, বা একটি AssertionError নিক্ষেপ করে, বা আপনি আপনার @Testটীকাতে ঘোষণা করেছেন এমন একটি ব্যতিক্রম ছুঁড়ে ফেলেছে এবং ত্রুটিগুলি অপ্রত্যাশিত ব্যতিক্রম থেকে আসে। তবে তাদের মধ্যে একটি গুরুত্বপূর্ণ পার্থক্য রয়েছে:

একটি ব্যর্থতার অর্থ হল আপনার পরীক্ষাটি সঠিকভাবে চলেছিল এবং আপনার কোডটিতে একটি ত্রুটি চিহ্নিত করেছে।

একটি ত্রুটি বলতে আপনার কোডে একটি বাগ বোঝাতে পারে, তবে এটির জন্য আপনি এমনকি পরীক্ষাও করছিলেন না। এর অর্থ এটিও হতে পারে যে বাগটি নিজেই পরীক্ষায় রয়েছে।

সংক্ষেপে, একটি ব্যর্থতার অর্থ হল যে কোডটি পরীক্ষা করা হচ্ছে তা আবার লিখতে হবে। একটি ত্রুটির অর্থ হল এটি আপনাকে পুনর্লিখনের প্রয়োজন সেই একক পরীক্ষা হতে পারে। এর অর্থ হতে পারে এমনকি যদি আপনার কোডটিতে ব্যর্থতা ছিল, যেমন একটি NullPointerException, কারণ আপনি এমন একটি ত্রুটি সনাক্ত করেছেন যা আপনি এমনকি পরীক্ষা করছেন না, তাই এটি পরীক্ষা করা বুদ্ধিমানের কাজ হতে পারে।


0

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

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


0

মূলত, ব্যর্থতাগুলি অসম্পূর্ণ প্রতিবেদনের কথা উল্লেখ করে যখন ত্রুটিগুলি অস্বাভাবিক পরীক্ষার মৃত্যুদন্ড কার্যকর করার কারণে হয় । এবং আমি মনে করি প্রতিটি আইডিইতে উত্তীর্ণ , ব্যর্থ এবং ত্রুটি পরীক্ষার জন্য বিভিন্ন রঙ সহ প্রতীকী আইকন রয়েছে ।

আরও তথ্যের জন্য, এই পরীক্ষা করুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.