Java 8 इसे बहुत आसान बनाता है, और Kotlin / Scala दोगुना।
हम थोड़ा उपयोगिता वर्ग लिख सकते हैं
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()
}
हालाँकि, आपको यह व्यक्त करने के तरीके के साथ बहुत कुछ करने की गुंजाइश है, मैं हमेशा धाराप्रवाह मुखरता का प्रशंसक था ।
के बारे में
आप इसे गलत तरीके से ले रहे हैं। बस अपनी कार्यक्षमता का परीक्षण करें: यदि अपवाद को फेंक दिया जाता है तो परीक्षण स्वचालित रूप से विफल हो जाएगा। यदि कोई अपवाद नहीं फेंका गया है, तो आपके परीक्षण सभी हरे हो जाएंगे।
यह सिद्धांत में सही है लेकिन निष्कर्ष में गलत है।
जावा नियंत्रण के प्रवाह के लिए अपवादों की अनुमति देता है। यह JRE रनटाइम द्वारा खुद के 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));
}
मैं आपको इस परीक्षण input
का उपयोग करने के लिए पैरामीटर को प्रोत्साहित करने के लिए भी प्रोत्साहित करूंगा ताकि आप अन्य इनपुट के लिए इस परीक्षण का अधिक आसानी से उपयोग Theories
कर Parameterized
सकें। वैकल्पिक रूप से, यदि आप विदेशी जाना चाहते हैं, तो आप एक परीक्षण-निर्माण उपकरण (और यह ) के लिए जा सकते हैं । TestNG के पास मानकीकृत परीक्षणों के लिए बेहतर समर्थन है।
मुझे जो विशेष रूप से असहनीय लग रहा है वह उपयोग करने की सिफारिश है @Test(expectedException=IllegalArgumentException.class)
, यह अपवाद खतरनाक रूप से व्यापक है । यदि आपका कोड इस तरह बदलता है कि परीक्षण के निर्माता के तहत घटक है if(constructorArgument <= 0) throw IllegalArgumentException()
, और आपका परीक्षण उस तर्क के लिए 0 आपूर्ति कर रहा था क्योंकि यह सुविधाजनक था - और यह बहुत आम है, क्योंकि अच्छा उत्पादन परीक्षण डेटा आश्चर्यजनक रूप से कठिन समस्या है - तो आपका परीक्षण ग्रीन-बार होगा भले ही यह कुछ भी परीक्षण न करे। इस तरह की परीक्षा बेकार से भी बदतर है।