2009-11-22 16 views
13

संक्षिप्त प्रश्न, Assert.AreEqual(1.0, double.NaN, 1.0) क्यों पास करता है? जबकि Assert.AreEqual(1.0, double.NaN) विफल रहता है।Assert.AreEqual (1.0, double.NaN, 1.0) क्यों पास करता है?

यह MSTest (Microsoft.VisualStudio.QualityTools.UnitTestFramework) में एक बग है या मैं कुछ यहाँ याद आ रही है?

सादर, Egil।


अद्यतन: शायद, जोड़ना चाहिए कि मेरे सवाल के पीछे कारण यह है कि मैं इकाई परीक्षण है कि दुर्भाग्य से कुछ रैखिक बीजीय मैट्रिक्स आपरेशन NaN या होने का परिणाम की वजह से पारित कर दिया का एक समूह है (+/-) इन्फिनिटी। यूनिट परीक्षण ठीक हैं, लेकिन Assert.AreEqual डेल्टा के साथ युगल पर वास्तविक या/और उम्मीद की जाती है जब NaN या अनंतता होती है, मुझे विश्वास था कि जिस कोड का मैं परीक्षण कर रहा था वह सही था।

+1

माइक्रोसॉफ्ट बग प्रविष्टि: https://connect.microsoft.com/VisualStudio/feedback/details/ 762286/यूनिट-टेस्ट-साथ-जोर-असमान-2-3-डबल-नैन -0-1-पास – jbe

+0

और बेवकूफों ने इसे "डिज़ाइन द्वारा" बंद कर दिया। –

+0

दिलचस्प, क्योंकि एमएस ने रिक्त किया और कहा कि यह अब तय है: http://connect.microsoft.com/VisualStudio/feedback/details/780654/assert-equal-and-double-nan – Pat

उत्तर

9

सावधान रहें। NaN अजीब है, कुछ डीबीएमएस में कुछ हद तक शून्य है, और आपको मूल्यों की तुलना नहीं करनी चाहिए (या तो सीधे, या Assert.AreEqual के साथ)। Double.NaN के लिये दस्तावेज से:

उपयोग IsNaN निर्धारित करने के लिए एक मूल्य कोई अंक नहीं है। यह संभव नहीं है निर्धारित करने के लिए कि क्या मान एक संख्या NaN के बराबर एक और मूल्य से तुलना करके नहीं है।

double zero = 0; 
Console.WriteLine((0/zero) == Double.NaN); // prints false 
Console.WriteLine(Double.IsNaN(0/zero)); // prints true 

तो आपको यह स्पष्ट के आंतरिक भागों में सहकर्मी होगा (डबल, डबल, डबल) को देखने के लिए क्या हो रहा है, लेकिन सामान्य तौर पर, आप पर NaN को अपरिभाषित व्यवहार रिश्तेदार के आधार रहे हैं।

+0

मेरे प्रश्न के पीछे की कहानी यूनिट परीक्षणों का एक समूह है जो दुर्भाग्यवश कुछ रैखिक बीजगणितीय मैट्रिक्स ऑपरेशन के परिणामस्वरूप NaN/(+/-) अनंतता के परिणामस्वरूप पारित हो गया है। यूनिट परीक्षण ठीक हैं, लेकिन Assert.AreEqual डेल्टा के साथ युगल पर वास्तविक या/और उम्मीद की जाती है जब NaN या अनंतता होती है, मुझे विश्वास था कि मेरा कोड वास्तव में काम करता है ... –

+1

मुझे वह मिलता है। इसके चेहरे पर, व्यवहार गलत है, और आप माइक्रोसॉफ्ट कनेक्ट पर एक मुद्दा दर्ज करने के लिए उचित होगा। यदि आप चाहें, तो एक प्रतीक सर्वर को हुक करें और देखें कि कैसे Assert.AreEqual (डबल, डबल) Assert से अलग है। AEEqual (डबल, डबल, डबल)। –

5

MSTest Assert.AreEqual<double>(expected, actual, delta) विधि के लिए निम्न सूत्र का उपयोग करता है:

if (Math.Abs(expected - actual) > delta) 
    Assert.HandleFail("Assert.AreEqual", ...) 

आपरेशन double.NaN > delta, जो इस मामले में सच रिटर्न को कम कर देता है। या अपरिभाषित।

6

जवाब आउट-ऑफ-तिथि है। अगर बग तय किया गया है, कब, और किस विधानसभा के किस संस्करण में?

यह सही है, यह माइक्रोसॉफ्ट के साथ VS2013 में तय किया गया था। VisualStudio.QualityTools.UnitTestFramework.dll असेंबली, संस्करण 10.0.0.0। विरासत जीएसी, सी: \ विंडोज \ असेंबली में मौजूद है, इसमें 10.1.0.0 संस्करण भी है।

यहाँ एक DLL नरक कहानी नहीं है, 10.1.0.0 संस्करण VS2010 में प्रयोग किया जाता था। इसमें बग था, ठीक से Double.NaN की जांच नहीं कर रहा था। माइक्रोसॉफ्ट ने गलती की, उन्होंने 10.1.0.0 तय किया लेकिन संस्करण संख्या को नहीं बदला। तो VS2013 स्थापित करने के बाद VS2010 स्थापित करने वाले किसी भी व्यक्ति को चोट पहुंचने वाली है, यह डीएलएल को बग्गी संस्करण के साथ ओवरराइट करने जा रहा है।

डीएलएल नरक को उजागर करना इतना आसान नहीं है, लेकिन यह connect article से दिखाई देता है और जिस तरह से यह मेरी मशीन पर काम करता है, जिसने ग्राहक की शिकायत से विफलता मोड की पहचान की। और एक फिक्स प्रदान किया, एक अद्यतन में वितरित। नहीं स्पष्ट है जो जुलाई 2014 के बाद अब आप v10.0.0.0 इस्तेमाल करेंगे, MSTest.exe परीक्षण धावक और QTAgents एक <bindingRedirect> कि 10.1.0.0 से 10.0.0.0 पर रीडायरेक्ट (लिखने में कोई त्रुटि नहीं के साथ एक .config फ़ाइल है)। वर्तमान में नवीनतम अपडेट प्राप्त करना सुनिश्चित करें, सहायता 4 देखें। अगर आप सुनिश्चित नहीं हैं कि आपने कौन सा अपडेट इंस्टॉल किया है।

रिकॉर्ड के लिए, तय कोड Double.NaN के लिए विशिष्ट चेकों का अधिग्रहण किया है, यह इस तरह दिखता है:

public static void AreEqual(double expected, double actual, double delta, string message, params object[] parameters) 
{ 
    if ((double.IsNaN(expected) || double.IsNaN(actual)) || double.IsNaN(delta)) 
    { 
     string str = (string) FrameworkMessages.AreEqualDeltaFailMsg((message == null) ? string.Empty : ReplaceNulls(message), expected.ToString(CultureInfo.CurrentCulture.NumberFormat), actual.ToString(CultureInfo.CurrentCulture.NumberFormat), delta.ToString(CultureInfo.CurrentCulture.NumberFormat)); 
     HandleFail("Assert.AreEqual", str, parameters); 
    } 
    if (Math.Abs((double) (expected - actual)) > delta) 
    { 
     string str2 = (string) FrameworkMessages.AreEqualDeltaFailMsg((message == null) ? string.Empty : ReplaceNulls(message), expected.ToString(CultureInfo.CurrentCulture.NumberFormat), actual.ToString(CultureInfo.CurrentCulture.NumberFormat), delta.ToString(CultureInfo.CurrentCulture.NumberFormat)); 
     HandleFail("Assert.AreEqual", str2, parameters); 
    } 
} 
+1

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

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