জাভা 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 সরবরাহ করছিল কারণ এটি সুবিধাজনক ছিল - এবং এটি খুব সাধারণ বিষয়, কারণ ভাল উত্সর্গের পরীক্ষার ডেটা আশ্চর্যজনকভাবে একটি কঠিন সমস্যা - তবে আপনার পরীক্ষা এটি কিছুই পরীক্ষা করে নিলেও গ্রিন-বার হবে। এ জাতীয় পরীক্ষাটি অকেজো থেকেও খারাপ।