regex - simplificar - ¿Cómo pruebas las expresiones regulares de tu unidad?
probar expresiones regulares (9)
Considere escribir las pruebas primero, y solo escribir la mayor cantidad posible de expresiones regulares para aprobar cada prueba. Si necesita expandir su expresión regular, hágalo agregando pruebas fallidas.
Soy nuevo en TDD, y considero que RegExp es un caso bastante particular. ¿Hay alguna forma especial de probarlos en una unidad, o puedo simplemente tratarlos como funciones regulares?
Crearía un conjunto de valores de entrada con valores de salida esperados, muy similar a cualquier otro caso de prueba.
Además, puedo recomendar a fondo la herramienta gratuita Regex Tool Expresso . Es un fantástico editor / depurador de expresiones regulares que me ha salvado días de dolor en el pasado.
Creo que una simple prueba de salida de entrada es suficiente. A medida que pasa el tiempo y se producen algunos casos en los que falla su expresión regular, no olvide agregar estos casos también durante la reparación.
Me gusta probar la expresión regular contra una expresión regular opuesta, ejecutaré ambas contra la prueba posible y me aseguraré de que la intersección esté vacía.
No puedo creer que nadie haya publicado esta increíble herramienta:
refiddle.com
Le permite probar sus expresiones regulares. Usted define un texto que contiene cadenas que debe coincidir, y las cadenas no deberían coincidir, y si todo es verde, está bien. Por ejemplo, aquí hay uno que hice para que coincida con las babosas: http://refiddle.com/by/callum-locke/slug-matcher
Presumiblemente, sus expresiones regulares están contenidas dentro de un método de una clase. Por ejemplo:
public bool ValidateEmailAddress( string emailAddr )
{
// Validate the email address using regular expression.
return RegExProvider.Match( this.ValidEmailRegEx, emailAddr );
}
Ahora puede escribir pruebas para este método. Supongo que el punto es que la expresión regular es un detalle de implementación: su prueba necesita probar la interfaz, que en este caso es solo el método de validar el correo electrónico.
Siempre debe probar sus expresiones regulares, al igual que cualquier otro fragmento de código. Son la función más simple que toma una cadena y devuelve un bool, o devuelve una matriz de valores.
Aquí hay algunas sugerencias sobre qué pensar cuando se trata de diseñar pruebas unitarias para regexen. Estas no son recetas difíciles y rápidas para el diseño de pruebas unitarias, sino algunas pautas para darle forma a su pensamiento. Como siempre, sopese las necesidades de su prueba con el costo de la falla, equilibrado con el tiempo requerido para implementarlas todas. (¡Encuentro que ''implementar'' la prueba es la parte fácil!: -])
Puntos a considerar:
- Piense en cada grupo (los paréntesis) como un corsé.
- Piensa en cada | como una condición. Asegúrese de probar cada rama.
- Piensa en cada modificador (*, +,?) Como una ruta diferente.
- (nota al margen de lo anterior: recuerde la diferencia entre *, +,? y * ?, + ?, y ??.)
- para / d, / s, / w y sus negaciones, pruebe varias en cada rango.
- Para * y +, debe probar "sin valor", "uno de" y "uno o más" para cada uno.
- Para caracteres importantes de "control" (p. Ej., Cadenas en la expresión regular que buscas) prueba para ver qué sucede si se muestran en lugares incorrectos. Esto puede sorprenderte
- Si tiene datos del mundo real, use todo lo que pueda.
- Si no lo hace, asegúrese de probar tanto los formularios simples como los complejos que deberían ser válidos.
- Asegúrese de probar qué hacen los caracteres de control de expresiones regulares cuando se insertan.
- Asegúrese de verificar que la cadena vacía esté aceptada / rechazada correctamente.
- Asegúrese de verificar que una cadena de cada uno de los diferentes caracteres de espacio sea aceptada o rechazada correctamente.
- Asegúrese de que se realiza un manejo correcto de la insensibilidad de mayúsculas y minúsculas (la marca i). Esto me ha mordido más veces que casi cualquier otra cosa en el análisis de texto (que no sean espacios).
- Si tiene las opciones x, m o s, asegúrese de entender lo que hacen y probarlo (el comportamiento aquí puede ser diferente)
Para una expresión regular que devuelva listas, también recuerde:
- Verifique que los datos que espera sean devueltos, en el orden correcto, en los campos correctos.
- Verifique que las pequeñas modificaciones no devuelvan datos correctos.
- Verifique que los grupos mixtos anónimos y los grupos con nombre se analicen correctamente (por ejemplo,
(?<name> thing1 ( thing2) )
); este comportamiento puede ser diferente en función del motor de expresiones regulares que esté utilizando. - Una vez más, da muchas pruebas del mundo real.
Si usa funciones avanzadas, como grupos que no realizan rastreos, asegúrese de comprender completamente cómo funciona la característica y, utilizando las pautas anteriores, cree cadenas de ejemplos que funcionen a favor y en contra de cada una de ellas.
Dependiendo de la implementación de su biblioteca regex, la forma en que se capturan los grupos también puede ser diferente. Perl 5 tiene un orden de ''orden de paren abierto'', C # lo tiene parcialmente, excepto para grupos con nombre, etc. Asegúrese de experimentar con su sabor para saber exactamente lo que hace.
Luego, integrelas directamente con sus otras pruebas unitarias, ya sea en su propio módulo o junto con el módulo que contiene la expresión regular. Para expresiones regexen particularmente desagradables, es posible que necesite muchas pruebas para verificar que el patrón y todas las características que utiliza sean correctos. Si la expresión regular constituye una gran parte (o casi la totalidad) del trabajo que está haciendo el método, utilizaré los consejos anteriores para configurar entradas para probar esa función y no la expresión regular directamente. De esta forma, si luego decide que la expresión regular no es el camino a seguir, o si desea dividirla, puede capturar el comportamiento que la expresión regular proporcionó sin cambiar la interfaz, es decir, el método que invoca la expresión regular.
Siempre que sepa cómo se supone que una característica de expresiones regulares funciona en su sabor de expresiones regulares, debería poder desarrollar casos de prueba decentes para ello. Solo asegúrate de que realmente, realmente, realmente entiendas cómo funciona la función.
Siempre los pruebo como hago con cualquier otra función. Asegúrate de que coincidan con las cosas que crees que deben coincidir y que no coinciden con las cosas que no deberían.
Solo arroje un montón de valores, verificando que obtenga el resultado correcto (ya sea coincidencia / no coincidencia o un valor de reemplazo particular, etc.).
Es importante destacar que, si hay casos de esquina que te preguntan si funcionarán o no, captúralos en una prueba unitaria y explica en un comentario por qué funcionan. De esta forma, alguien más que quiera cambiar la expresión regular podrá verificar si la caja de la esquina aún funciona, y les dará una pista sobre cómo solucionarla si se rompe.