¿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.
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)
@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
@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? –