2010-12-20 10 views
8

Es una práctica común para los nombres de los métodos de prueba en JUnit con "prueba". Pero en los últimos años, algunas personas cambiaron esto al prefijo "debería".Prefijo para los métodos de prueba en la Unidad: "prueba" vs "debería"

Si quiero probar la creación del cliente en una base de datos, normalmente nombraría el método "testCustomerCreation". Sin embargo, algunas personas llamarían "shouldCreateCustomer".

Esto es un gusto personal cuando soy la única persona en el proyecto o cuando todos los demás en el proyecto están de acuerdo conmigo. Pero cuando/donde este no es el caso, comienzan a aparecer algunas divergencias o mezclas inconsistentes.

Leí en alguna parte un artículo de un tipo que llamó a sus métodos como "testShouldCreateCustomer", y por esta razón decidió soltar el prefijo "prueba". Pero, de hecho, no estaba prefijando con "prueba", estaba usando "testShould" y cambió a "should". Obviamente, esto no me convenció.

Personalmente estoy muy inclinado a adherirme al prefijo "prueba" porque los nombres de los métodos normalmente comienzan con verbos en forma de infinitivo ("obtener", "establecer", "agregar", "eliminar", "borrar", " enviar "," recibir "," abrir "," cerrar "," leer "," escribir "," crear "," enumerar "," explotar "," imprimir ", etc., por lo que es" prueba "). Entonces, prefijar el nombre de un método con "debería" hace que suene realmente muy extraño para mí, se ve mal.

Entonces, ¿cuál es la verdadera razón para usar "debería" en lugar de "probar"? ¿Cuáles son las grandes ventajas y desventajas?

+7

Pasé menos tiempo preocupándome por los prefijos tontos y más tiempo preocupándome porque el resto del nombre de la prueba sea descriptivo. – cdhowie

Respuesta

18

La convención 'Should' está alineada con el estilo de prueba behaviour driven development.

yo personalmente prefiero realmente escribir pruebas en este estilo, ya que le anima a escribir pruebas que leen como especificaciones, y más en línea con el comportamiento de la clase o del sistema que se está probando.

Siempre que sea posible, a veces voy un paso más allá y dar la clase de prueba aún más contexto utilizando su nombre:

class ANewlyCreatedAccount { 
    shouldHaveAZeroBalance() {} 
    shouldCalculateItsOwnInterest() {} 
} 

Al nombrar a sus clases y pensando en ellos en este estilo de especificación, esto le puede dar una mucha guía en que prueba escribir, y en cuyo orden debe escribir las pruebas y hacerlas verdes.

Sí, 'should' vs 'test' es solo un prefijo y es importante ser consistente, pero esta pregunta también es sobre el estilo y la mentalidad de cómo probar el código y elegir qué pruebas escribir. BDD tiene un montón de valor, así que sugiero leer más y probarlo.

+2

+1 por mencionar que se trata de comportamiento en lugar de métodos de prueba – tddmonkey

+0

Ok, me estás convenciendo. Pero, esto significa que todas las personas que simplemente nombran métodos de prueba que ni siquiera se parecen a la especificación de nada (como "shouldSaveUserToDatabaseWhenPasswordIsChanged"), son personas que simplemente no saben lo que están haciendo. Si el método de prueba en particular no tiene nada que ver con BDD (como una prueba que protege contra un error que se produjo en una combinación muy peculiar de condiciones), ¿debería incluirse el prefijo "debería"? –

3

La consistencia es más importante que la correcta en la nomenclatura. Si hay alguna pregunta sobre un proyecto, el miembro técnico responsable del proyecto debe describir las prácticas de codificación formalmente para que problemas como este no destruyan el valioso tiempo del proyecto.

+2

"La consistencia es más importante que la corrección": historia del software ERP de 1,5 millones de líneas de mi empresa en una frase. – corsiKa

+1

en _naming_ issues. Hay ciertas cosas que vale la pena pasar el tiempo discutiendo y encontrando las mejores prácticas. Discutir sobre la colocación del aparato ortopédico, el esquema de uso de mayúsculas y los prefijos de prueba no se incluyen en ese grupo. Los consejos sobregeneralizados y mal aplicados pueden ser más un problema de su software. – codelark

3

En el JUnit original, los métodos de prueba tenían que comenzar test. Muchos marcos para otros idiomas copiaron esta convención. A pesar de que ya no es el caso en JUnit, y aunque otros marcos pueden ser diferentes, creo que la mayoría de los programadores todavía están bastante familiarizados con los métodos nombrados, por ejemplo. testX como pruebas unitarias, por lo que creo que es bueno apegarse a la convención test por ese motivo.

5

Diría que el prefijo 'prueba' es simplemente un remanente de los días de preanotación cuando era necesario. Sugeriría que simplemente use nombres significativos para sus casos de prueba (y eso puede significar con o sin 'prueba').

Prefiero ponerle nombre al método de prueba para que quede claro lo que se está probando. es decir,

checkNullParameter() 
runSimpleQuery() 
runQueryWithBadParam() 

Todos los casos de prueba se encuentran en un directorio de prueba de todos modos y todas las pruebas reales se anotan, por lo que el prefijo 'prueba' es bastante redundante.

+2

runQueryWithBadParam() - Sin embargo, no está diciendo lo que espera aquí. Personalmente, preferiría ver shouldThrowBadParamExceptionOnBadParam(). También debería animarte a describir tus expectativas ...... –

+1

La anotación (expected = BadParamException) debe ser lo suficientemente clara para el caso simple. En otros casos, dejo que el código muestre lo que espero, ya que puede haber varias afirmaciones hechas con respecto a múltiples parámetros incorrectos. Por ejemplo, nulo, o un valor fuera de rango, ambos pueden estar contenidos dentro del mismo caso de prueba (parámetro incorrecto). Las afirmaciones en sí dicen lo que estoy esperando y deben ser claras para cualquiera que lea el código. – Robin

+0

@Benjamin: ¿Qué pasa con testQueryWithBadParam()? @Robin: estoy parcialmente de acuerdo. A veces, "verificar" o "verificar" es mejor que "prueba", pero "runSimpleQuery" no es exactamente lo que haces. Simplemente no lo ejecuta, ejecuta y afirma que se ejecutó correctamente, por lo que sería como "testSimpleQueryRun". Igualmente tendríamos "testQueryWithBadParam". Sé que de esta manera es muy probable que cada método tenga la prueba de prefijo, pero no sería simplemente un prefijo, sino que formará parte de la descripción de lo que hace el método. –

2

Prefiero el sufijo test. Es posible que tenga un método con un prefijo should en su proyecto, p. shouldBuy y su prueba se llamaría testShouldBuy porque shouldShouldBuy se vería muy extraño.

También uso el MoreUnit plugin para Eclipse, que crea automáticamente un método de prueba con el prefijo test cuando pulso Ctrl+U o saltar al método de ensayo cuando pulso Ctrl+J. (Aunque puede configurar el prefijo que usa.) Si no es coherente con su nombre, las herramientas automatizadas como MoreUnit no podrán ayudarlo con sus pruebas.

+5

Después de todo, se debe evitar dar un nombre a un método de prueba según el método probado, ya que esto lleva a un infierno de refactorización, por lo que este argumento no es realmente válido. –