2017-10-18 47 views
5

बाकी usage documentation बीमित इस तरह उदाहरण है:भ्रम बीमित फ्लोटिंग प्वाइंट तुलना

get("/lotto").then().body("lotto.lottoId", equalTo(5)); 

ठीक है, तो वे पूर्णांक मूल्य 5 से तुलना करने के लिए एक Hamcrest मिलान का उपयोग कर रहे हैं।

लेकिन वे एक वर्ग कह रही है कि इतना तय है कि JSON पार्सर डिफ़ॉल्ट रूप से float और नहीं double, इसलिए बजाय 12.12 की तुलना की का उपयोग करता है मैं 12.12f से तुलना करना चाहिए:

get("/price").then().body("price", is(12.12f)); 

प्रतीक्षा है, तो कैसे 5 काम किया है ऊपर, जो int है और double नहीं है? क्या JSON पार्सर पूर्णांक और गैर-पूर्णांक मानों के लिए विभिन्न प्राइमेटिव का उपयोग करता है?

लेकिन यह अधिक भ्रमित हो जाता है। अच्छी तरह से ज्ञात प्रोग्रामर जानते हैं कि आपको फ्लोटिंग पॉइंट मानों की तुलना किसी भी तरह से तुलना नहीं करनी चाहिए (फ्लोटिंग-पॉइंट मानों को कैसे संग्रहीत किया जाता है, इसकी जटिलताओं के कारण)। इसके बजाय आपको Matchers.closeTo(double operand, double error) का उपयोग करना चाहिए जो त्रुटि का मार्जिन प्रदान करता है। ऐसा करने का यह सही तरीका है। लेकिन प्रतीक्षा करें --- भले ही मैं 12.12f में Matchers.closeTo (डबल ऑपरेंड, डबल त्रुटि) में पास करता हूं, फिर भी यह इसे double में परिवर्तित नहीं करेगा? क्या यह आरईएसटी आश्वासन के साथ काम करेगा?

उत्तर

1

मैं 100% यकीन है कि मैं यहाँ सही कर रहा हूँ नहीं कर रहा हूँ, लेकिन इस पोस्ट एक टिप्पणी के लिए बहुत लंबा हो गया ...

Hamcrest के लिये दस्तावेज पढ़ने से और REST Assured ऐसा लगता है equalTo केवल सच रिटर्न की तरह मामले हैं, जिनके Object.equals रिटर्न सच:

[equalTo] को एक मिलान के रूप में Object.equals (java.lang.Object) पर विधि को फोन करके निर्धारित जब जांच की वस्तु तार्किक निर्दिष्ट संकार्य के बराबर है से मेल खाता है, बनाता है जांच की वस्तु

इस प्रकार के बाद से आश्वस्त रहें चल तैरता के रूप में अंक मान का प्रतिनिधित्व करता है, और Double.equals केवल true लौटा सकते हैं या कि अन्य वस्तु एक Double है, यह आवश्यक एक float और नहीं उपयोग करने के लिए है एक double (के रूप में इनपुट में बॉक्सिंग हो जाएगी एक वस्तु)।

इसके अलावा, आप आश्वस्त रहें, डॉक्स में तैरता की धारा से संकेत मिलता है कि यह केवल चल बिन्दु मानों पर लागू लगता है:

चल बिन्दु संख्या एक जावा "फ्लोट" आदिम के साथ तुलना में किया जाना चाहिए।

मुझे लगता है इसका मतलब है कि पूर्णांक पूर्णांक के रूप में ठीक से प्रतिनिधित्व कर रहे हैं।

आप Matchers.closeTo बजाय equalTo या is (जो अपने आप कॉल equalTo) का उपयोग करने का फैसला किया है, तो यह कि यदि आप एक double या एक float का उपयोग कोई फर्क नहीं करना चाहिए (डॉक्स में अन्य उदाहरण भी इस सुझाव है कि लगता है)।

+0

आपका उत्तर वास्तव में मेरे प्रश्न का उत्तर देने के लिए निकटतम आया, हालांकि आपके कुछ उत्तर आधिकारिक नहीं थे। आपके द्वारा लाया जाने वाला सबसे महत्वपूर्ण बिंदु यह है कि यदि मैं 'Matcher.closeTo()' का उपयोग करता हूं (और यही वही है जो हमें किसी भी तरह से उपयोग करना चाहिए) इससे कोई फर्क नहीं पड़ता कि जेएसओएन पार्सर क्या कहता है। –

0

आप कई चीजों की तुलना बराबर के साथ कर सकते हैं।Matchers, यह भी परीक्षण कहने देगी किया जाता है:

assertThat(longValue, equalTo(10L)); 
assertThat(cadena, equalTo("Esta es una cadena")); 

वहाँ लंबी और स्ट्रिंग के लिए एक तुलना है, और निश्चित रूप से, आप closeto जैसे डबल्स खिलाड़ियों या BigDecimal के रूप में चीजों की तुलना करने के लिए है, एक बार देख ले here और there

तो वास्तव में, आश्चर्य की बात सामान्य है, लेकिन आप यह भी तुलना करने के लिए चुन सकते हैं या कर के बराबर होती है जब सुविधाजनक है

0

ऐसा लगता है कि दो चीजें एक साथ मिश्रण कर रहे हैं कर सकते हैं।

क्या JSON पार्सर पूर्णांक और गैर-पूर्णांक मानों के लिए विभिन्न प्राइमेटिव का उपयोग करता है?

मूल्य तुलना मचर ऑब्जेक्ट द्वारा की जाती है। दिए गए मैचर का किसी भी तरह से जेसन पार्सर पर कोई प्रभाव नहीं पड़ता है। चाहे आपने मैचर (5 पहले उदाहरण में) को कितना मूल्य दिया है और दिए गए जेसनपाथ द्वारा कौन सा मूल्य वापस आएगा, बराबर मैचर (org.hamcrest.core.IsEqual) ऑब्जेक्ट्स .equals() विधि का आविष्कार करके दोनों मूल्यों की तुलना करें। इसके अलावा जेसन पार्सर मूल्य वस्तुओं के साथ काम करता है न कि प्राइमेटिव के साथ।

तो ऊपर 5 काम कैसे किया गया, जो एक int और डबल नहीं है?

JsonPath lotto.lottoId मान लिया जाये कि पूर्णांक मान, इस प्रकार body("lotto.lottoId", equalTo(5)); सच

12.2' and 12.2f 'अपने उदाहरण में एक ही मूल्यों के रूप में इलाज कर रहे हैं (जाहिर है json मूल्य होने की 5 है) हो जाएगा। आपके उदाहरण में 'एफ' प्रत्यय करना अनावश्यक है और इसका कोई प्रभाव नहीं है। चूंकि विधि closeTo(double, double) ने तर्क प्रकारों को डबल के रूप में परिभाषित किया है, इसलिए पास किए गए फ्लोट मानों को दो प्रकार के रूप में प्रचारित किया जाएगा।

के बाद से आप जानते हैं कि आप json के मूल्य दोगुना होने जा रहा, तो तुम अभिव्यक्ति कर सकता अपने दावे के रूप में:

get("/price").then().body("price", closeTo(12.12, 0.01)); 

JSON पार्सर विन्यास के आधार पर, गैर पूर्णांक मान BigDecimal के रूप में पढ़ा जा सकता है, अगर ऐसा है मामला है, आप के रूप में

.get("/price").then().body("price", 
      closeTo(BigDecimal.valueOf(12.12), BigDecimal.valueOf(0.01))) 

आशा है कि यह मदद करता है closeTo() के विचरण का उपयोग कर सकते हैं।

0

अगर आप ध्यान से Hamcrest पढ़ा तो आप मिल जाएगा, यह स्पष्ट रूप से कहा गया है "जब जांच की वस्तु तार्किक निर्दिष्ट संकार्य के बराबर है" के लिए equalTo। तो जाहिर है इससे कोई फर्क नहीं पड़ता कि यह "5" या 5 है! Rest-Assured में एएनडी, यह उल्लेख किया गया है कि बराबर और हैइटम्स हैमक्रिस्ट मैचर्स हैं जिन्हें आपको मूल रूप से org.hamcrest.Matchers से आयात करना चाहिए। तो मुझे नहीं लगता कि कोई भ्रम होना चाहिए।

संबंधित मुद्दे