2012-05-26 16 views
13

Soy un nuevo código artesanal. Me gustaría asegurarme de no dejar piedra sin remover.¿Cómo generar una buena cobertura de código de lógica de coma flotante?

¿Hay algo específico que pueda hacer más allá de especificar contratos de código para guiar a Pex, por lo que produce una buena cobertura en código numéricamente intensivo?

Intente buscar http://research.microsoft.com/en-us/projects/pex/pexconcepts.pdf para la palabra clave 'flotante' para obtener información general.

limitaciones aritméticas más números de coma flotante se aproximan mediante traducción a números racionales y técnicas de búsqueda heurística se utilizan fuera del Z3 para encontrar soluciones aproximadas para las restricciones de punto flotante.

... y además ...

razonamiento simbólico. Pex usa un solucionador de restricciones automático para determinar qué valores son relevantes para la prueba y el código bajo prueba. Sin embargo, las habilidades del solucionador de restricciones son, y siempre serán, limitadas. En particular, Z3 no puede razonar con precisión sobre la aritmética de coma flotante.

Como alternativa, ¿conoce una herramienta en .NET que sea más adecuada para la tarea de encontrar anomalías numéricas en .NET? Soy consciente de http://fscheck.codeplex.com/ pero no realiza un razonamiento simbólico.

+2

Evita los condicionales relacionados con '==' para 'float's. Use '<' or '>' en su lugar. Si tiene que usar '==', utilice la expresión 'Math.Abs ​​(value-target)

+0

@JesseChisholm Conozco las herramientas de análisis estático que le permiten encontrar esos errores de codificación. No estoy seguro de cómo esto ayuda con la pregunta. – GregC

+0

@GregC, no estoy seguro de entender lo que estás preguntando. Desea saber (A) si los enunciados condicionales que contienen números de coma flotante usan una tolerancia épsilon o (B) si sus algoritmos son numéricamente estables o (C) simplemente una recomendación para una herramienta de cobertura de códigos. ¿O algo mas? –

Respuesta

1

¿Es lo que quieres una buena cobertura? No es probable que una prueba que ejecute cada rama en un código signifique que es correcta; a menudo se trata más de casos de esquina y usted, como desarrollador, está mejor ubicado para saber qué son estos casos de esquina. También parece que funciona diciendo 'aquí hay una combinación de entrada interesante', mientras que lo más probable es que especifiques el comportamiento del sistema que quieres ver: si primero has escrito el código incorrecto, entonces el interesante las entradas pueden ser completamente irrelevantes para el código correcto.

Quizás esta no es la respuesta que está buscando, pero yo diría que la mejor manera de hacerlo es a mano. Escriba una especificación antes de comenzar la codificación y conviértala en una gran cantidad de casos de prueba cuando sepa/mientras escribe la API para su clase/subsistema.

Como empiezas a completar la API/escribir el código, es probable que recojas los trozos y piezas adicionales que necesitas hacer + averigua cuáles son las partes difíciles: si tienes condicionales, etc., eso es algo que sientes que alguien que refactorice su código podría equivocarse y luego escribir un caso de prueba que los cubra. A veces escribo intencionadamente un código incorrecto en estos puntos, obtengo una prueba que falla y luego lo corrijo solo para asegurarme de que la prueba esté verificando el camino correcto a través del código.

Luego intente y piense en cualquier valor extraño que no haya cubierto - entradas negativas, nulos, etc. A menudo, estos casos serán inválidos y no desea atender/tengo que pensar - en estos casos lo haré en general, escriba algunas pruebas para decir que deben arrojar excepciones, lo que básicamente impide que las personas hagan un uso indebido del código en casos en los que aún no lo haya hecho correctamente/con datos no válidos.

Usted mencionó anteriormente que está trabajando con código numéricamente intensivo - puede valer la pena probar un nivel anterior para poder probar los comportamientos en el sistema que está buscando en lugar de solo la cantidad de números - suponiendo que el código no es puramente numérico, esto te ayudará a establecer algunas condiciones reales de ejecución y también asegurará que, sea lo que sea que el bit de crujido de números realmente está haciendo, interactúe con el resto del programa de la manera que lo necesites; si es algo algorítmico, probablemente estés mejor. escribir un lenguaje de prueba de aceptación para ayudar a caracterizar cuáles son los resultados deseados en diferentes situaciones; esto le da una idea clara de lo que está tratando de lograr, también le permite arrojar grandes cantidades de datos (reales) a través de un sistema que probablemente sea mejor que una entrada generada por computadora. El otro beneficio de esto es que si se da cuenta de que el algoritmo necesita una reescritura drástica para cumplir con un nuevo requisito, entonces todo lo que tiene que hacer es agregar el nuevo caso de prueba y luego reescribir/refactorizar; si tus pruebas solo miraran los detalles del algoritmo y asumieran los efectos en el mundo exterior, entonces tendrías un dolor de cabeza considerable tratando de descubrir cómo el algoritmo influye actualmente en el comportamiento, qué partes eran correctas y cuáles no y luego intentabas migrar una carga de pruebas unitarias a una nueva API/algoritmo.

+0

Por supuesto, eso es exactamente lo que se hace ahora. Lo que estoy diciendo es que preferiría examinar un conjunto de datos de prueba generados por computadora que tener que adivinar de antemano qué problemas podrían traer los datos del campo. Si estudias Análisis numérico, esto podría tener sentido para ti. Estoy específicamente interesado en encontrar datos razonablemente formados que causen errores numéricos, como desbordamiento y desbordamiento. Tales problemas a menudo son computacionalmente complejos, y es mejor dejarlos en manos de una máquina para encontrarlos. – GregC

+0

Aquí hay un ejemplo de una exploración que se simplificaría con la ayuda de un buscador de problemas automatizado: http://www.mathworks.com/matlabcentral/newsreader/view_thread/278975 – GregC

+0

No pude ver cuál era la solución al problema de ese tipo. - ¿Fue algo que pudieron haber encontrado los datos de prueba generados?Debe haber un espacio de búsqueda muy grande para los números de punto flotante; parece decir en ese pdf que pex no puede razonar precisamente sobre ellos. ¡Problema interesante, lo siento, no podría ser de más ayuda! –

Cuestiones relacionadas