2009-05-18 4 views
23

Ich habe einige C# Unit-Tests, die einige float/double-Operationen durchführen, und ich möchte Einheit testen sie. Assert.AreEqual ist aufgrund von Rundungsfehlern nicht ausreichend.Unit Tests Float-Operationen in Visual Studio 2008 Pro

Nehmen Sie die Einheitenumrechnung als Beispiel. 10,5 Meter zu Fuß hat einen Umrechnungsfaktor von 3,281, also bekomme ich 34,4505. Die Verwendung eines genaueren Umrechnungsfaktors gibt mir 34,4488189. Ich möchte das innerhalb von beispielsweise 0,1 testen (also würde 34,3488-34,5488 den Test bestehen).

ich konnte sicher manuell den Wert mit einer Toleranz in meinem Unit-Test testen, aber das ist sehr repetitiv und die Fehlermeldung sehr beschreibend wäre nicht (wieder ohne meine eigene Assert-Fehlernachricht schreiben):

Assert.IsTrue(Math.Abs(34.4488189 - value) < 0.1); 

Wie kann ich meine Float-Operationen innerhalb einer bestimmten Fehlertoleranz testen? Ich kann keine Assert-Klassen finden, die das tun, die mit VS kommen. Vermisse ich es oder muss ich mein eigenes rollen?

Gibt es Standardverfahren zum Testen von Floats/Doubles?

Antwort

38

Assert.AreEqual in MSTest hat Überlastungen, die eine Delta (Fehlertoleranz) Parameter akzeptieren:

public static void AreEqual (double expected, double actual, double delta) 

zum Beispiel:

Assert.AreEqual(34.4488189, value, 0.1); 

oder für die kleinstmögliche Toleranz:

Assert.AreEqual(34.4488189, value, double.Epsilon); 
+8

Hah! 18 Überladungen für AreEqual. Kein Wunder, dass ich es nicht verstanden habe. –

+0

Warnung, mit 'double.Epsilon' wird nicht tun, was Sie tun wollen. Epsilon ist der kleinste Wert für die doppelte Genauigkeit. Dies gilt nur, wenn Sie Werte vergleichen, die in der Größenordnung von 10^-324 liegen, was sehr unwahrscheinlich ist.Was Sie tun möchten, ist, doppelte Werte bis zur letzten Ziffer zu vergleichen, die sie darstellen können. Daher kann die Toleranz tausend sein, wenn Sie Werte vergleichen, die sich in den Billiarden befinden. Das Schlagwort ist "ULP" (Einheiten an letzter Stelle). siehe http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm –

3

Sie konnten einen Blick auf die NUnit Rahmen nehmen:

//Compare Float values 
Assert.AreEqual(float expected, float actual, float tolerance); 
Assert.AreEqual(float expected, float actual, float tolerance, string message); 

//Compare Double values 
Assert.AreEqual(double expected, double actual, double tolerance); 
Assert.AreEqual(double expected, double actual, double tolerance, string message) 

(Oben von this Artikel entnommen)

Mehr here aufgeführt.

0

ich auf meinem Handy bin so den Mangel an Code/Links vergeben.

Hier ist eine Frage zu Favoriten C# -Erweiterungen, in denen Menschen integrierten Typ wie Zeichenfolge erweitert haben. Sie könnten den Schwimmer-Typen mit einem Verfahren erweitern, wie dies funktionieren würde:

Myfloat.IsInTolerance(34.8f, 0.1f) 

..welche true zurück, wenn der Myfloat Schwimmer 0,1 auf beiden Seiten von 34,8 ist. Es könnte es weniger mühsam machen.

0

Schauen Sie sich die NUnit Equality Constraints an, sie sind flexibel! Hoffe es kann helfen!

Verwandte Themen