কীভাবে পরীক্ষা করবেন যে কোনও ব্যতিক্রম ছুঁড়ে দেওয়া হয়নি?


238

আমি জানি যে এটির একটি উপায় হ'ল:

@Test
public void foo(){
   try{
      //execute code that you expect not to throw Exceptions.
   }
   catch(Exception e){
      fail("Should not have thrown any exception");
   }
}

এটি করার কোনও পরিষ্কার উপায় আছে কি? (সম্ভবত জুনিতকে ব্যবহার করছেন @Rule?)


10
যদি কোন প্রত্যাশিত ব্যতিক্রম ব্যতীত অন্য কোনও ব্যতিক্রম ছুঁড়ে ফেলে তবে একটি জুনিত পরীক্ষা ব্যর্থ হয়েছে বলে বিচার করা হয়। সাধারণত কোনও ব্যতিক্রম আশা করা যায় না।
রায়েডওয়াল্ড

JUnit এ ব্যর্থতা এবং ত্রুটির মধ্যে কোনও পার্থক্য নেই? প্রথমটির অর্থ পরীক্ষা ব্যর্থ হয়েছে, দ্বিতীয়টির অর্থ অপ্রত্যাশিত কিছু ঘটেছে।
ভিটুইল

উত্তর:


198

আপনি এটিকে ভুল উপায়ে পৌঁছে যাচ্ছেন। কেবল আপনার কার্যকারিতা পরীক্ষা করুন: যদি কোনও ব্যতিক্রম ছুঁড়ে দেওয়া হয় তবে পরীক্ষাটি স্বয়ংক্রিয়ভাবে ব্যর্থ হবে। যদি কোনও ব্যতিক্রম ছুঁড়ে না দেওয়া হয় তবে আপনার পরীক্ষাগুলি সবুজ হয়ে উঠবে।

আমি এই প্রশ্নটি সময়ে সময়ে আগ্রহের বিষয়টি লক্ষ্য করেছি তাই আমি আরও কিছুটা প্রসারিত করব।

ইউনিট পরীক্ষার পটভূমি

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

বা, ইউনিট টেস্টিংয়ের শিল্প সংজ্ঞা অনুসারে , রায় ওশেরোভের দ্বিতীয় সংস্করণ , পৃষ্ঠা 11:

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

যে বিষয়টি বুঝতে গুরুত্বপূর্ণ তা হল এক ইউনিট কাজের সাধারণত কেবল একটি পদ্ধতি নয় তবে খুব মৌলিক স্তরে এটি একটি পদ্ধতি এবং তার পরে এটি অন্য ইউনিটের কাজের দ্বারা আবদ্ধ হয়।

এখানে চিত্র বর্ণনা লিখুন

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

কাজের প্রথম ইউনিটটি বৈধ এবং অবৈধ ইনপুট ক্ষেত্রে কোনও বৈধ ব্যবহারকারীর ফিরিয়ে দেওয়া হচ্ছে কিনা তা পরীক্ষা করা উচিত।
ডেটাসোর্স দ্বারা নিক্ষেপ করা যে কোনও ব্যতিক্রমগুলি এখানে পরিচালনা করতে হবে: কোনও ব্যবহারকারী উপস্থিত না থাকলে এমন একটি পরীক্ষা করা উচিত যা দেখায় যে যখন ব্যবহারকারীকে খুঁজে পাওয়া যায় না তখন একটি ব্যতিক্রম ছুঁড়ে দেওয়া হয়। এর একটি নমুনা হতে পারে IllegalArgumentExceptionযা টীকাটির সাথে ধরা পড়ে @Test(expected = IllegalArgumentException.class)

কাজের এই বেসিক ইউনিটের জন্য একবার আপনি আপনার সমস্ত ব্যবহারের কেসগুলি পরিচালনা করার পরে, আপনি একটি স্তরটি উপরে যান। এখানে আপনি ঠিক একই কাজ করেন তবে আপনি কেবলমাত্র ব্যতিক্রমগুলি পরিচালনা করেন যা বর্তমানের নীচের স্তর থেকে আসে। এটি আপনার টেস্টিং কোডটিকে সুসংগঠিত রাখে এবং জায়গা জুড়ে হ্যাপ না করে জিনিসগুলি কোথায় ভুল হয় তা খুঁজে পেতে আপনাকে খুব শীঘ্রই আর্কিটেকচারের মধ্য দিয়ে চালানোর অনুমতি দেয়।

পরীক্ষার বৈধ এবং ত্রুটিযুক্ত ইনপুট হ্যান্ডলিং

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

আপনি যখন বৈধ ইনপুট নিয়ে কাজ করেন আপনি অন্তর্নিহিত প্রত্যাশাটি সেট করে থাকেন যে আপনি যা পরীক্ষা করেন তা কার্যকর হবে।

যেমন একটি পদ্ধতি কল ভালো চেহারা পারেন: existingUserById_ShouldReturn_UserObject। যদি এই পদ্ধতিটি ব্যর্থ হয় (যেমন: একটি ব্যতিক্রম ছুঁড়ে দেওয়া হয়) তবে আপনি জানেন যে কিছু ভুল হয়েছে এবং আপনি খনন শুরু করতে পারেন।

আরেকটি পরীক্ষা যোগ করে ( nonExistingUserById_ShouldThrow_IllegalArgumentException) যা ত্রুটিযুক্ত ইনপুট ব্যবহার করে এবং একটি ব্যতিক্রম প্রত্যাশা করে আপনি দেখতে পারেন যে আপনার পদ্ধতিটি ভুল ইনপুট দিয়ে যা করার কথা বলে তা করে কিনা।

টি এল; ডিআর

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

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


2
বিষয়টি হ'ল আমি টিডিডি করার চেষ্টা করছি এবং আমি যে সহযোগী ব্যবহার করি সেগুলির মধ্যে একটি ব্যতিক্রম ছুঁড়ে দিচ্ছে। সুতরাং আমার এই সত্যটি পরীক্ষা করা দরকার যে আমি সহযোগী দ্বারা ছুঁড়ে দেওয়া ব্যতিক্রমটি গ্রাস করছি
অঙ্কিত ধিংরা

6
আপনি কি বলছেন যে আপনার কার্যকারিতা কোনও ব্যতিক্রম পরিচালনার উপর নির্ভরশীল? এটি একটি কোড গন্ধ: সুন্দরভাবে আপনাকে সমস্যাগুলি ধরতে দেয় ব্যতিক্রমগুলি রয়েছে; এগুলি প্রবাহ নিয়ন্ত্রণের জন্য ব্যবহৃত হয় না। আপনি যদি এমন কোনও দৃশ্যের পরীক্ষা করতে চান যেখানে কোনও ব্যতিক্রম ছুঁড়ে ফেলা উচিত তবে আপনার expectedমন্তব্যটি ব্যবহার করা উচিত । আপনি যদি এমন কোনও পরিস্থিতি পরীক্ষা করতে চান যেখানে আপনার কোডটি ব্যর্থ হয় এবং আপনি ত্রুটিটি সঠিকভাবে পরিচালিত হয়েছে কিনা তা দেখতে চান: ব্যবহার করুন expectedএবং সম্ভবত সমাধান হয়েছে কিনা তা নির্ধারণের জন্য দৃser় ব্যবহার করুন।
জেরোইন ভেনেভেল

বিষয়টি হ'ল আমি সহযোগীর সাথে যে ব্যতিক্রম ঘটেছে সেগুলি থেকে পুনরুদ্ধার করতে পারি না এবং আমি যা করি তা কেবল একটি লগ.ডিবুগ ("ত্রুটি বার্তা") ব্যবহার করে সমস্যাটি লগ করা। সুতরাং আমি সম্ভবত দৃ block়ভাবে বলতে পারি এমন ক্যাচ ব্লকের অংশ হিসাবে কোনও পার্শ্ব প্রতিক্রিয়া ঘটছে না।
অঙ্কিত ধীঙ্গরা

5
@ জিরোভানভেনিল এটি পরীক্ষা করে নিখুঁতভাবে বৈধ যে কোনও ত্রুটির পরিস্থিতি যা কোনও ব্যতিক্রম ছোঁড়ার কারণ হয়ে থাকে তা সঠিকভাবে পরিচালনা করা হয়।
থরবজর্ন রাভন অ্যান্ডারসন

1
@dpk হ্যাঁ আপনি পারেন। আপনি throws IllegalArgumentExceptionআপনার পরীক্ষা যোগ করুন । আপনি শেষ পর্যন্ত যা চান তা হ'ল যদি কোনও ব্যতিক্রম থাকে তবে আপনার পরীক্ষাটি লাল হয়ে যায়। আচ্ছা, কি অনুমান? আপনার লেখার দরকার নেই fail()। যেমন @ জিরোইন ভেনেভেল লিখেছেন: "যদি ব্যতিক্রম ছুঁড়ে দেওয়া হয় তবে পরীক্ষাটি স্বয়ংক্রিয়ভাবে ব্যর্থ হবে।
আমেদী ভ্যান গ্যাস

132

আমি সোনারকিউবের নিয়ম "স্কুইড: এস 2699" এর কারণে এই হোঁচট খেয়েছি: "এই পরীক্ষার ক্ষেত্রে কমপক্ষে একটি দৃ one়তা যুক্ত করুন" "

আমার একটি সহজ পরীক্ষা ছিল যার ব্যতিক্রম ছাড়াই only

এই সাধারণ কোডটি বিবেচনা করুন:

public class Printer {

    public static void printLine(final String line) {
        System.out.println(line);
    }
}

এই পদ্ধতিটি পরীক্ষা করতে কোন ধরণের দৃ ?়তা যুক্ত করা যেতে পারে? অবশ্যই, আপনি এটির চারপাশে চেষ্টা করতে পারেন তবে এটি কেবল কোড ব্লাট।

সমাধানটি ইউনাইট থেকেই আসে।

যদি কোনও ব্যতিক্রম ছুঁড়ে না দেওয়া হয় এবং আপনি এই আচরণটি স্পষ্টভাবে চিত্রিত করতে চান তবে কেবল expectedনীচের উদাহরণ হিসাবে যুক্ত করুন :

@Test(expected = Test.None.class /* no exception expected */)
public void test_printLine() {
    Printer.printLine("line");
}

Test.None.class প্রত্যাশিত মানের জন্য ডিফল্ট।


30
আমি মনে করি এটিই সেরা উত্তর। গৃহীত উত্তরটি দুর্দান্ত, এবং লেখকের কোড গন্ধটি উল্লেখ করার জন্য সঠিক। তবে তিনি সুনির্দিষ্ট প্রশ্নের উত্তর দেননি।
হেলিশহাইট হ'ল

4
এটি লক্ষ্য করা আকর্ষণীয় যে প্রত্যাশিতটির জন্য ডিফল্ট মানটি কোনওটি নয়, সুতরাং @ টেস্টের সাহায্যে কেবল পদ্ধতিটি বর্ণনা করা।
ওজিওমাজনার


41

জুনিয়ট 5 (বৃহস্পতি) ব্যতিক্রম অনুপস্থিতি / উপস্থিতি যাচাই করার জন্য তিনটি ফাংশন সরবরাহ করে:

assertAll​()

সমস্ত সরবরাহ যে জোর দেওয়াexecutables
  ব্যতিক্রম ছুঁড়ে না ফেলে।

assertDoesNotThrow​()

জোর দেওয়া হয়েছে যে
  সরবরাহকৃতগুলি কার্যকর করা executable/ কোনও ধরণের ব্যতিক্রম supplier
ছুঁড়ে না ফেলে

JUnit 5.2.0 (29 এপ্রিল 2018)
  থেকে   এই ফাংশনটি উপলব্ধ ।

assertThrows​()

জোর দেওয়া হয়েছে যে সরবরাহকৃত কার্যকরকরণ ব্যতিক্রম executable
ছুঁড়ে ফেলেছেexpectedType
  এবং ব্যতিক্রমটি ফিরিয়ে দেয় ।

উদাহরণ

package test.mycompany.myapp.mymodule;

import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.Test;

class MyClassTest {

    @Test
    void when_string_has_been_constructed_then_myFunction_does_not_throw() {
        String myString = "this string has been constructed";
        assertAll(() -> MyClass.myFunction(myString));
    }

    @Test
    void when_string_has_been_constructed_then_myFunction_does_not_throw__junit_v520() {
        String myString = "this string has been constructed";
        assertDoesNotThrow(() -> MyClass.myFunction(myString));
    }

    @Test
    void when_string_is_null_then_myFunction_throws_IllegalArgumentException() {
        String myString = null;
        assertThrows(
            IllegalArgumentException.class,
            () -> MyClass.myFunction(myString));
    }

}

1
এটি এখন সেরা উত্তর। অন্যান্য উত্তরগুলি
জুনিয়নের

29

জাভা 8 এটিকে অনেক সহজ করে তোলে এবং কোটলিন / স্কাল দ্বিগুণ।

আমরা একটু ইউটিলিটি ক্লাস লিখতে পারি

class MyAssertions{
  public static void assertDoesNotThrow(FailingRunnable action){
    try{
      action.run()
    }
    catch(Exception ex){
      throw new Error("expected action not to throw, but it did!", ex)
    }
  }
}

@FunctionalInterface interface FailingRunnable { void run() throws Exception }

এবং তারপরে আপনার কোডটি সহজভাবে হয়ে যায়:

@Test
public void foo(){
  MyAssertions.assertDoesNotThrow(() -> {
    //execute code that you expect not to throw Exceptions.
  }
}

যদি আপনার জাভা -8 এ অ্যাক্সেস না থাকে তবে আমি একটি বেদনাদায়ক পুরানো জাভা সুবিধা ব্যবহার করব: এরিবিট্রি কোড ব্লক এবং একটি সহজ মন্তব্য

//setup
Component component = new Component();

//act
configure(component);

//assert 
/*assert does not throw*/{
  component.doSomething();
}

এবং পরিশেষে, কোটলিনের সাথে, এমন একটি ভাষার সাথে আমি সম্প্রতি প্রেম করেছি:

fun (() -> Any?).shouldNotThrow() 
    = try { invoke() } catch (ex : Exception){ throw Error("expected not to throw!", ex) }

@Test fun `when foo happens should not throw`(){

  //...

  { /*code that shouldn't throw*/ }.shouldNotThrow()
}

আপনি কীভাবে এটি প্রকাশ করতে চান ঠিক তা নিয়ে ভাবার মতো অনেক জায়গা থাকলেও আমি সবসময় সাবলীল দৃser়তার প্রতি অনুরাগী ছিলাম ।


সংক্রান্ত

আপনি এটিকে ভুল উপায়ে পৌঁছে যাচ্ছেন। কেবল আপনার কার্যকারিতা পরীক্ষা করুন: যদি কোনও ব্যতিক্রম ছুঁড়ে দেওয়া হয় তবে পরীক্ষাটি স্বয়ংক্রিয়ভাবে ব্যর্থ হবে। যদি কোনও ব্যতিক্রম ছুঁড়ে না দেওয়া হয় তবে আপনার পরীক্ষাগুলি সবুজ হয়ে উঠবে।

এটি নীতিগতভাবে সঠিক তবে উপসংহারে ভুল।

জাভা নিয়ন্ত্রণ প্রবাহের জন্য ব্যতিক্রমগুলির অনুমতি দেয়। এটি জেআরই রানটাইম নিজে থেকেই API এর Double.parseDoubleমাধ্যমে NumberFormatExceptionএবং এর Paths.getমাধ্যমে সম্পন্ন করেInvalidPathException

প্রদত্ত আপনি এমন একটি উপাদান লিখেছেন যা এর জন্য সংখ্যার স্ট্রিংকে বৈধ Double.ParseDoubleকরে তুলবে, সম্ভবত একটি রেজেক্স ব্যবহার করে, সম্ভবত একটি হাতে লেখা লিখিত পার্সার, অথবা এমন কিছু যা কিছু অন্যান্য ডোমেন নিয়মকে এম্বেড করে যা নির্দিষ্ট কিছুতে ডাবলটির সীমাবদ্ধ করে দেয়, কীভাবে সেরা এটি পরীক্ষা করা যায় উপাদান? আমি মনে করি যে একটি সুস্পষ্ট পরীক্ষা হ'ল এটি প্রমাণ করা, যখন ফলস্বরূপ স্ট্রিংটি বিশ্লেষণ করা হয়, তখন কোনও ব্যতিক্রম ছুঁড়ে দেওয়া হয় না। আমি উপরের assertDoesNotThrowবা /*comment*/{code}ব্লক হয় ব্যবহার করে যে পরীক্ষা লিখতে হবে । কিছুটা এইরকম

@Test public void given_validator_accepts_string_result_should_be_interpretable_by_doubleParseDouble(){
  //setup
  String input = "12.34E+26" //a string double with domain significance

  //act
  boolean isValid = component.validate(input)

  //assert -- using the library 'assertJ', my personal favourite 
  assertThat(isValid).describedAs(input + " was considered valid by component").isTrue();
  assertDoesNotThrow(() -> Double.parseDouble(input));
}

আমিও এই পরীক্ষা parameterize করতে উৎসাহিত করব inputব্যবহার Theoriesবা Parameterizedযাতে আপনি আরও সহজে অন্যান্য ইনপুট জন্য এই পরীক্ষাটি পুনরায় ব্যবহার করতে পারেন। বিকল্পভাবে, আপনি বিদেশী যেতে চাইলে, আপনি একটি পরীক্ষা-প্রজন্মের সরঞ্জামের জন্য যেতে পারেন (এবং এটি )। পরামিতি পরীক্ষার জন্য টেস্টএনজির আরও ভাল সমর্থন রয়েছে better

যা আমি বিশেষভাবে অসম্মত মনে করি তা হ'ল ব্যবহারের সুপারিশ @Test(expectedException=IllegalArgumentException.class), এই ব্যতিক্রমটি বিপজ্জনকভাবে বিস্তৃত । যদি আপনার কোডটি পরিবর্তিত হয় যে পরীক্ষার নির্মাণকারীর অধীনে থাকা উপাদানটি রয়েছে if(constructorArgument <= 0) throw IllegalArgumentException()এবং আপনার পরীক্ষাটি সেই যুক্তিটির জন্য 0 সরবরাহ করছিল কারণ এটি সুবিধাজনক ছিল - এবং এটি খুব সাধারণ বিষয়, কারণ ভাল উত্সর্গের পরীক্ষার ডেটা আশ্চর্যজনকভাবে একটি কঠিন সমস্যা - তবে আপনার পরীক্ষা এটি কিছুই পরীক্ষা করে নিলেও গ্রিন-বার হবে। এ জাতীয় পরীক্ষাটি অকেজো থেকেও খারাপ।


2
(প্রত্যাশিত ব্যতিক্রমের ব্যবহার সম্পর্কিত) ইউনাইট ৪.১13 থেকে আপনি Assert.assertThrowsকিছু কোড একটি ব্যতিক্রম ছুঁড়েছে কিনা তা পরীক্ষা করতে ব্যবহার করতে পারেন ।
ম্যাজউইন্ড

22

আপনি যদি আপনার কোডটিতে সমস্ত ত্রুটি ধরতে যথেষ্ট দুর্ভাগ্য হন। আপনি বোকামি করতে পারেন

class DumpTest {
    Exception ex;
    @Test
    public void testWhatEver() {
        try {
            thisShouldThrowError();
        } catch (Exception e) {
            ex = e;
        }
        assertEquals(null,ex);
    }
}

1
কেবলমাত্র একটি ছোট পরামর্শ, এটি পরীক্ষা করার আগে Exception exহওয়া উচিত = null;
ডিনিস

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

3
অথবা কেবল ধরা সহজ, এবং সুন্দর আইএমওতে Assert.fail () রাখুন।
isaac.hazan

হ্যা আমি আপনার সাথে একমত. আরও একটি উপায় হ'ল @ টেস্টের শীর্ষে একটি টীকা যুক্ত করা (প্রত্যাশিত = অবৈধপ্রক্রিয়াপূর্বক। কলা)
বেন টেনিসন

আপনার ভুল বানানটি বিভ্রান্তিকর: এই শোল্টথ্রুআরআর -> এই শোল্ডথ্রোঅরআর
অস্কার ব্রাভো


7

যদিও এই পোস্টটি এখন 6 বছরের পুরানো, তবে জুনিত বিশ্বে অনেক কিছু বদলেছে। জুনিট 5 এর সাথে আপনি এখন ব্যবহার করতে পারেন

org.junit.jupiter.api.Assertions.assertDoesNotThrow()

উদা:

public void thisMethodDoesNotThrowException(){
   System.out.println("Hello There");
}

@Test
public void test_thisMethodDoesNotThrowException(){
  org.junit.jupiter.api.Assertions.assertDoesNotThrow(
      ()-> thisMethodDoesNotThrowException()
    );
}

আশা করি এটি এমন লোকদের সহায়তা করবে যারা জুনিট 5 এর নতুন সংস্করণ ব্যবহার করছে


আমি আশা করি এখানে কংক্রিট ব্যতিক্রম শ্রেণি নির্দিষ্ট করার উপায় ছিল। আমি এই ভিতরে কি আছে Awaitility's untilAsserted(ThrowingRunnable assertion)। পরীক্ষার অধীনে থাকা সিস্টেমটি বর্তমানে আমি সরবরাহ করা থ্রোংআরনেবলের উপর একটি নির্দিষ্ট ব্যতিক্রম ছুঁড়ে দিচ্ছি, তবে এটি এটি করা বন্ধ না করা পর্যন্ত আমি এটিকে কিছুটা সময় দিতে চাই। তবে এটি অন্যরকম ব্যতিক্রম ছুঁড়ে ফেললে আমি পরীক্ষার তাত্ক্ষণিকভাবে ব্যর্থ হতে চাই।
উবেগেশ

1

আপনি যদি পরীক্ষা করতে চান তবে আপনার পরীক্ষার লক্ষ্য ব্যতিক্রম ব্যয় করেছে কিনা। (JMock2 ব্যবহার করে মক সহযোগী) হিসাবে পরীক্ষাটি ছেড়ে দিন:

@Test
public void consumesAndLogsExceptions() throws Exception {

    context.checking(new Expectations() {
        {
            oneOf(collaborator).doSth();
            will(throwException(new NullPointerException()));
        }
    });

    target.doSth();
 }

যদি আপনার টার্গেটটি ফেলে দেওয়া ব্যতিক্রমটি গ্রাস করে তবে পরীক্ষাটি পাস হবে, অন্যথায় পরীক্ষা ব্যর্থ হবে।

আপনি যদি নিজের ব্যতিক্রম গ্রহণের যুক্তি পরীক্ষা করতে চান তবে জিনিসগুলি আরও জটিল হয়। আমি পরামর্শটি এমন কোনও সহযোগীর কাছে জমা দেওয়ার পরামর্শ দিচ্ছি যা উপহাস করা যায়। সুতরাং পরীক্ষা হতে পারে:

@Test
public void consumesAndLogsExceptions() throws Exception {
    Exception e = new NullPointerException();
    context.checking(new Expectations() {
        {
            allowing(collaborator).doSth();
            will(throwException(e));

            oneOf(consumer).consume(e);
        }
    });

    target.doSth();
 }

আপনি কখনও এটি লগ করতে চান তবে কখনও কখনও এটি অতিরিক্ত নকশা করা হয়। এই ক্ষেত্রে, এই নিবন্ধ ( http://java.dzone.com/articles/monitor-declarative-transac , http://blog.novoj.net/2008/09/20/testing-aspect-Pointcuts-is-there যদি আপনি এই ক্ষেত্রে টিডিডি জেদ করেন তবে -সহজ-সহজ উপায় / ) সহায়তা করতে পারে।


1

AssertNull (...) ব্যবহার করুন

@Test
public void foo() {
    try {
        //execute code that you expect not to throw Exceptions.
    } catch (Exception e){
        assertNull(e);
    }
}

6
আমি বলবো এটি বিভ্রান্তিকর। ক্যাচ ব্লকটি কখনই পৌঁছায় না, সুতরাং এটি assertNullকখনও কার্যকর হয় না। তবে দ্রুত পাঠক এই ধারণাটি পেয়ে গেছেন যে একটি দৃ .়তা তৈরি করা হয়েছে যা সত্যিই নন-নিক্ষেপের ক্ষেত্রে যাচাই করে। অন্য কথায়: যদি ক্যাচ ব্লকটি পৌঁছে যায় তবে ব্যতিক্রমটি সর্বদা শূন্য থাকে it সুতরাং এটি একটি সাধারণ দ্বারা প্রতিস্থাপন করা যেতে পারে fail
Andreas

প্রকৃতপক্ষে বিভ্রান্তিকর, ..... তবে অপেক্ষা করুন, ... ওহ আমি দেখতে ... assertNull(e)যেমন ব্যর্থ হয়েছে, পরীক্ষা রিপোর্ট হবে বিবৃত হিসাবে হিসাবে eহতে পারে না nullcatchব্লক ... মাইক এই মাত্র অদ্ভুত প্রোগ্রামিং হল: - /। .. হ্যাঁ অন্তত fail()আন্দ্রেস এর মতো ব্যবহার করুন
জুলিয়ান

1

আপনি আশা করতে পারেন যে কোনও নিয়ম তৈরি করে ব্যতিক্রম ছুঁড়ে দেওয়া হবে না।

@Rule
public ExpectedException expectedException = ExpectedException.none();

প্রত্যাশিত ব্যতিক্রমগুলি নিক্ষিপ্ত ব্যতিক্রমগুলি দৃ .় করতে ব্যবহৃত হয়। আপনার প্রদত্ত কোডটি কেবলমাত্র নিয়মের সূচনা করার জন্য যাতে আপনি দৃ the়তার জন্য আপনার প্রয়োজনীয়তা যুক্ত করতে পারেন। এই কোডটি নিজেই কোনও মান যুক্ত করে না। জাভাডোক এও বলেছে: "/ ** * এমন একটি {@ লিঙ্কপ্লেইন টেস্টের বিধি বিধান s যা প্রত্যাশা করে যে * ছাড়ানো হবে না (এই নিয়ম ব্যতীত আচরণের সাথে অভিন্ন) * ।
পিম হাজেব্রুক

আমি আপনার সাথে একমত, এবং এটি সেভাবে ব্যবহার করব না, তবে এটি দৃ exception়ভাবে প্রমাণ করা যায় যে কোনও ব্যতিক্রম ছুঁড়ে দেওয়া হয়নি। যদি পরীক্ষাটি পাস হয় তবে যথেষ্ট বলার অপেক্ষা রাখে না যে ব্যতিক্রমটি ছুঁড়ে দেওয়া হয়নি, তবে অন্যদিকে যদি প্রশ্ন থাকে তবে অবশ্যই এটির প্রয়োজন রয়েছে। এবং খুব কমই কিন্তু এখনও মাঝে মাঝে এটি দৃশ্যমান হওয়া ভাল। কোড এবং পরিস্থিতি যদি পরিবর্তিত হয় এবং আমাদের কোনও নির্দিষ্ট প্রান্তের ক্ষেত্রে কোন পরীক্ষা না থাকে তবে কী হবে?
LazerBanana

আপনি কীভাবে প্রত্যাশিত ব্যতিক্রম সহ এটি দৃ would়ভাবে দেখবেন তা জানতে আগ্রহী। এবং হ্যাঁ, যদি প্রয়োজনীয়তাগুলি পরিবর্তন হয় এবং নির্দিষ্ট ধরণের কেসগুলির জন্য আপনার যদি পরীক্ষা না হয় তবে আপনি স্ক্রুযুক্ত ;-) সর্বদা সব কোণার কেসগুলি কভার করেন।
পিম হাজেব্রুক

আপনি কি বোঝাতে চেয়েছেন? আপনি এটি উপর দৃsert়তা না, আপনি এটি আশা। এই ক্ষেত্রে, আপনি কোনও ব্যতিক্রম আশা করবেন না। আপনি কি সম্পর্কে নিশ্চিত না।
লেজারবানা

0

এটি সর্বোত্তম উপায় নাও হতে পারে তবে এটি নিশ্চিতভাবে নিশ্চিত করে যে পরীক্ষা করা হচ্ছে এমন কোড ব্লক থেকে ব্যতিক্রম ছোঁড়া হয়নি।

import org.assertj.core.api.Assertions;
import org.junit.Test;

public class AssertionExample {

    @Test
    public void testNoException(){
        assertNoException();
    }    

    private void assertException(){
        Assertions.assertThatThrownBy(this::doNotThrowException).isInstanceOf(Exception.class);
    }

    private void assertNoException(){
        Assertions.assertThatThrownBy(() -> assertException()).isInstanceOf(AssertionError.class);
    }

    private void doNotThrowException(){
        //This method will never throw exception
    }
}

0

আপনি এটি একটি @ বিধি ব্যবহার করে করতে পারেন এবং তারপরে নীচে দেখানো মত পদ্ধতি রিপোর্টমিসিংএক্সেপশন উইথমেসেজ কল করতে পারেন: এটি স্কালা কোড।

এখানে চিত্র বর্ণনা লিখুন


1
private val? এটা কোন ভাষা? স্পষ্টতই জাভা নয়; পি এবং দয়া করে, স্ক্রিনশট হিসাবে কোড সরবরাহ করবেন না, এটি স্বাগত নয়।
অ্যান্ড্রেমনিয়ি

আমি দেখেছি আপনি এটি স্কালার কথা উল্লেখ করেছেন, তবে জাভাতে এটি সহজেই করা যায় তা বলার
পক্ষে দৃ argument়

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

-1

নিম্নলিখিতটি সমস্ত ব্যতিক্রম, পরীক্ষিত বা চেক করা ছাড়াই পরীক্ষায় ব্যর্থ হয়েছে:

@Test
public void testMyCode() {

    try {
        runMyTestCode();
    } catch (Throwable t) {
        throw new Error("fail!");
    }
}

-1

জুনিট থেকে প্রাপ্ত তথ্যের উপর ভিত্তি করে আপনি নিজের যে কোনও ধরণের দাবি তৈরি করতে পারেন:

static void assertDoesNotThrow(Executable executable) {
    assertDoesNotThrow(executable, "must not throw");
}
static void assertDoesNotThrow(Executable executable, String message) {
    try {
        executable.execute();
    } catch (Throwable err) {
        fail(message);
    }
}

এবং পরীক্ষা:

//the following will succeed
assertDoesNotThrow(()->methodMustNotThrow(1));
assertDoesNotThrow(()->methodMustNotThrow(1), "fail with specific message: facepalm");
//the following will fail
assertDoesNotThrow(()->methodMustNotThrow(2));
assertDoesNotThrow(()-> {throw new Exception("Hello world");}, "Fail: must not trow");

সাধারণভাবে বলতে গেলে কোনও পরিস্থিতিতেই পরীক্ষাটি তাত্ক্ষণিকভাবে ব্যর্থ হওয়ার সম্ভাবনা রয়েছে ("ব্লে ব্লে ব্লা"), যে কোনও জায়গাতেই এটি বোঝা যায়। উদাহরণস্বরূপ পরীক্ষার ক্ষেত্রে যদি কিছু ফেলে দেওয়া হয় তবে ব্যর্থ হওয়ার জন্য এটি চেষ্টা / ক্যাচ ব্লকে ব্যবহার করুন:

try{methodMustNotThrow(1);}catch(Throwable e){fail("must not throw");}
//or
try{methodMustNotThrow(1);}catch(Throwable e){Assertions.fail("must not throw");}

এটি আমাদের পরীক্ষা করা পদ্ধতির নমুনা, মনে করুন আমাদের কাছে এমন একটি পদ্ধতি রয়েছে যা নির্দিষ্ট পরিস্থিতিতে ব্যর্থ হতে হবে না তবে এটি ব্যর্থ হতে পারে:

void methodMustNotThrow(int x) throws Exception{
    if (x == 1) return;
    throw new Exception();
}

উপরের পদ্ধতিটি একটি সাধারণ নমুনা। তবে এটি জটিল পরিস্থিতিতে কাজ করে, যেখানে ব্যর্থতা এতটা সুস্পষ্ট নয়। আমদানি আছে:

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.function.Executable;
import static org.junit.jupiter.api.Assertions.*;

যথাযথ কোড তৈরি করা জড়িত না এমন দৃser়তা দেওয়া হয়নি এমনটি যাচাই করার জন্য মোটামুটি আরও ভাল বিকল্প রয়েছে। @ বিধি তাদের মধ্যে একটি
বর্গান

@ ভারগান আমি আপনার নিজস্ব যুক্তি তৈরির পদ্ধতিটি ইঙ্গিত করেছি যেভাবে এটি ইউনাইট দ্বারা ডিজাইন করা হয়েছে বিশেষত আপনার নিজের বক্তব্য তৈরির উদ্দেশ্যে। JUnit সরবরাহ করে যে নকশার দ্বারা, বিশেষত সেই উদ্দেশ্যে, আপনার নিজস্ব নিয়ম তৈরি করতে, JUnit এর আচরণকে এখনও বাস্তবায়িত হয়নি এমন জোর দিয়ে প্রসারিত করুন। কারণ এই বিশ্বে সবকিছু বাস্তবায়িত হয় না কারণ এই দাবীগুলি অভিন্নভাবে কাজ করে যেহেতু ইউএনইট-এর দাবী ব্যর্থতা প্রতিবেদনের পাশাপাশি পাসিং বা ব্যর্থতার ক্ষেত্রে কাজ করে।
আর্মাজেডেস্কু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.