2009-05-18 5 views
23

Tengo algunas pruebas de unidad C# que realizan algunas operaciones de flotación/doble y me gustaría probarlas en una unidad. Assert.AreEqual es insuficiente debido a errores de redondeo.Prueba unitaria de las operaciones de flotación en Visual Studio 2008 Pro

Conversión de unidad de toma como ejemplo. 10.5 metros a pies tiene un factor de conversión de 3.281, así que obtengo 34.4505. Utilizar un factor de conversión más preciso me da 34.4488189. Quiero probar esto dentro, digamos, 0.1 (entonces 34.3488-34.5488 pasaría la prueba).

pude cierta probar manualmente el valor con una tolerancia en mi prueba de la unidad, pero eso es muy repetitivo y el mensaje de fallo no sería muy descriptiva (de nuevo sin tener que escribir mi propio mensaje de fallo de aserción):

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

¿Cómo puedo probar la unidad de mis operaciones de flotación dentro de una cierta tolerancia de error? No puedo encontrar ninguna clase de Assert que haga esto que viene con VS. ¿Me estoy perdiendo o tengo que hacer mi propio?

¿Hay prácticas estándar en las pruebas de flotantes/dobles para tener en cuenta?

Respuesta

38

Assert.AreEqual en MSTest tiene sobrecargas que aceptan una delta (tolerancia de error) parámetro:

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

por ejemplo:

Assert.AreEqual(34.4488189, value, 0.1); 

o, para los más pequeños de tolerancia posible:

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

¡Hah! 18 sobrecargas para AreEqual. No es de extrañar que no lo haya captado. –

+0

advertencia, utilizando 'double.Epsilon' no hará lo que usted quiere que haga. Epsilon es el valor de precisión doble más pequeño. Esto solo aplica si está comparando valores que están en el orden de 10^-324, lo cual es muy poco probable.Lo que quiere hacer es comparar valores dobles hasta el último dígito que puedan representar. Por lo tanto, la tolerancia podría ser de mil si comparas valores que están en los cuatrillones. La palabra de moda es "ULP" (unidades en último lugar). ver http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm –

3

Usted puede echar un vistazo en el marco NUnit:

//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) 

(arriba, tomada desde this artículo)

Más enumeran here.

0

estoy en mi teléfono para que valga la falta de código/enlaces.

Aquí hay una pregunta acerca de las extensiones de C# favoritas donde las personas tienen un tipo de extensión extendida como cadena. Se podría extender el tipo float con un método que funcionaría así:

Myfloat.IsInTolerance(34.8f, 0.1f) 

..which regresarían cierto si el flotador Myfloat fue de 0,1 cada lado de 34.8. Podría hacerlo menos laborioso.

0

¡Observe las restricciones de igualdad de NUnit, son flexibles! Espero que pueda ayudar!

Cuestiones relacionadas