Escribí algunos algoritmos de clasificación para una tarea de clase y también escribí algunas pruebas para asegurarme de que los algoritmos se implementaron correctamente. Mis pruebas son solo como 10 líneas de largo y hay 3 de ellas, pero solo 1 línea cambia entre las 3, por lo que hay mucho código repetido. ¿Es mejor refactorizar este código en otro método que luego se llama desde cada prueba? ¿No necesitaría escribir otra prueba para probar la refactorización? Algunas de las variables pueden incluso moverse al nivel de la clase. ¿Deben las clases y métodos de prueba seguir las mismas reglas que las clases / métodos normales?
Aquí hay un ejemplo:
[TestMethod]
public void MergeSortAssertArrayIsSorted()
{
int[] a = new int[1000];
Random rand = new Random(DateTime.Now.Millisecond);
for(int i = 0; i < a.Length; i++)
{
a[i] = rand.Next(Int16.MaxValue);
}
int[] b = new int[1000];
a.CopyTo(b, 0);
List<int> temp = b.ToList();
temp.Sort();
b = temp.ToArray();
MergeSort merge = new MergeSort();
merge.mergeSort(a, 0, a.Length - 1);
CollectionAssert.AreEqual(a, b);
}
[TestMethod]
public void InsertionSortAssertArrayIsSorted()
{
int[] a = new int[1000];
Random rand = new Random(DateTime.Now.Millisecond);
for (int i = 0; i < a.Length; i++)
{
a[i] = rand.Next(Int16.MaxValue);
}
int[] b = new int[1000];
a.CopyTo(b, 0);
List<int> temp = b.ToList();
temp.Sort();
b = temp.ToArray();
InsertionSort merge = new InsertionSort();
merge.insertionSort(a);
CollectionAssert.AreEqual(a, b);
}
givenThereAreProductsSet(amount)
e incluso tan simple comoactWith(param)
. Me las arreglé para hacerlo con una aplicación fluida (pgivenThereAre(2).products()
. Ej. ) Una vez, pero me detuve rápidamente porque me pareció una exageración.Como ya dijo Oded, el código de prueba aún debe mantenerse. Agregaría que la repetición en el código de prueba hace que sea más difícil para los mantenedores comprender la estructura de las pruebas y agregar nuevas pruebas.
En las dos funciones que publicó, las siguientes líneas son absolutamente idénticas, excepto por una diferencia de espacio al comienzo del
for
ciclo:Este sería un candidato perfecto para pasar a algún tipo de función auxiliar, cuyo nombre indica que está inicializando datos.
fuente
No, no está bien. En su lugar, debe usar un TestDataBuilder . También debe tener cuidado con la legibilidad de sus pruebas: a? 1000? b? Si mañana uno tiene que trabajar en la implementación que está probando, las pruebas son una excelente manera de ingresar a la lógica: escriba sus pruebas para sus compañeros programadores, no para el compilador :)
Aquí está su implementación de pruebas, "renovada":
fuente
Incluso más que el código de producción, el código de prueba debe optimizarse para facilitar su lectura y mantenimiento, ya que debe mantenerse junto con el código que se está probando y también debe leerse como parte de la documentación. Considere cómo el código copiado puede dificultar el mantenimiento del código de prueba y cómo eso puede convertirse en un incentivo para no escribir pruebas para todo. Además, no olvide que cuando escribe una función para SECAR sus pruebas, también debe estar sujeta a pruebas.
fuente
Duplicar el código para las pruebas es una trampa fácil en la que caer. Claro que es conveniente, pero ¿qué sucede si comienzas a refactorizar tu código de implementación y todas tus pruebas comienzan a necesitar cambiar? Corre los mismos riesgos que corre si ha duplicado su código de implementación, ya que lo más probable es que también necesite cambiar su código de prueba en muchos lugares. Todo esto se suma a una gran cantidad de tiempo perdido y a un número cada vez mayor de puntos de falla que deben abordarse, lo que significa que el costo para mantener su software se vuelve innecesariamente alto y, por lo tanto, reduce el valor comercial general del software que usted trabajar en.
Considere también que lo que es fácil de hacer en las pruebas será más fácil de hacer en la implementación. Cuando tiene poco tiempo y mucho estrés, las personas tienden a confiar en los patrones de comportamiento aprendidos y generalmente intentan hacer lo que parece más fácil en ese momento. Entonces, si encuentra que corta y pega mucho código de prueba, es probable que haga lo mismo en su código de implementación, y este es un hábito que desea evitar al principio de su carrera, para ahorrarle mucho de dificultad más adelante cuando tenga que mantener el código anterior que ha escrito y que su empresa no pueda permitirse reescribir necesariamente.
Como han dicho otros, usted aplica el director DRY, y busca oportunidades para refactorizar cualquier duplicación probable a métodos auxiliares y clases auxiliares, y sí, incluso debería hacerlo en sus pruebas para maximizar la reutilización del código y guardar usted mismo enfrenta dificultades con el mantenimiento más adelante. Incluso puede encontrarse lentamente desarrollando una API de prueba que puede usar una y otra vez, posiblemente incluso en múltiples proyectos, ciertamente así es como me han sucedido las cosas en los últimos años.
fuente