¿Qué es una relación normal de "líneas de código funcionales" a "líneas de código de prueba"?

27

Soy bastante nuevo en el enfoque TDD y mis primeros experimentos dicen que escribir 1 línea de código funcional significa escribir alrededor de 2-3 líneas de código de prueba. Entonces, en caso de que escriba 1000 LOC, toda la base de código, incluidas las pruebas, será algo así como ~ 3500 LOC.

¿Se considera esto normal? ¿Cuál es la proporción en el código que escribes?

Andrey Agibalov
fuente
8
¡Sí, TDD viene con una etiqueta cara!
EL Yusubov
66
su número 2-3X es conservador en el mejor de los casos, en realidad está más cerca de 4-5X para cosas como C # / Java, Python / Ruby podría estar más cerca de 2-3X, con algo breve como Erlang estar más cerca de 1: 1. Depende de cuán dogmático seas sobre TDD, ¡cuanto más dogmático, mayores serán esas proporciones!
66
@tomwrong: En el libro de Kent, cita a Ward que debes escribir pruebas hasta que tu miedo se transforme en aburrimiento.
herby
44
@ElYusubov: No estoy de acuerdo con que sea "caro". Parece ser así para aquellos que todavía cuentan la cantidad de trabajo en LOC. Pero el precio no está en LOC, está en dinero y tiempo de comercialización. Y allí, TDD no es más costoso que cualquier otro proceso de desarrollo razonable.
herby
55
Chicos, ¿por qué comentan en lugar de publicar respuestas? Lo que escribes tiene sentido.
Andrey Agibalov

Respuestas:

18

1: 3 es normal con TDD.

Por mi experiencia, y también por otras citas que recuerdo.

herby
fuente
12
... ¿Qué citas?
TehShrike
... recuerda vagamente ... ya no recuerdo dónde estaba (tal vez en el TDD de Kent Beck por ejemplo, tal vez en algún lugar de c2.com). Sin embargo, recuerdo el significado de que tres veces más código de prueba que código de producción está bien.
herby
Wow, exactamente lo mismo en mi experiencia, también. (Estoy mirando los resultados de cloc en este momento y busqué en Google para encontrar cualquier publicación sobre esta relación)
Nikolay Tsenkov
9

Existen variaciones basadas en diferentes estilos de codificación e idiomas. Sin embargo, independientemente del idioma que use, la mayor variación es usted.

Robert Martin dijo una vez:

"A medida que las pruebas se vuelven más específicas, el código se vuelve más genérico".

Eso me hizo pensar. Pruebas más específicas significan más código de prueba. Más código de producción genérico significa menos código, por lo que las proporciones de prueba / código deberían aumentar a medida que el código evoluciona.

Pero espera, eso tampoco es bueno. En algunos casos particulares, por ejemplo, cuando define un cierto algoritmo, puede tener solo 6-10 líneas de código que contienen un par de "si", un tiempo y quizás 2-3 recursiones. Puedo decirte que ese código tendrá probablemente más de 100 líneas de código de prueba.

En un proyecto real, algo más grande que unos pocos algoritmos, la relación prueba / código debe estar entre 1: 1 y 2: 1. Si supera el 2: 1, es un olor que tiene pruebas que deben refactorizarse o eliminarse (o tal vez un código que es difícil de probar). Siempre debe invertir la misma cantidad de cuidado y refactorización en sus pruebas que en su código de producción.

De todos modos, la mejor respuesta a su pregunta tal vez sea "Complejidad ciclomática" . Cuanto mayor sea la complejidad ciclomática de su método, más exponencialmente tendrá que escribir para que cubra todos los casos.

Patkos Csaba
fuente
3

La proporción variará según el tamaño de sus métodos. El tamaño de sus métodos variará según el estilo de programación, el idioma y el dominio del problema.

Si sus métodos son cortos, entonces 3: 1 es razonable. Si sus métodos son largos, entonces 3: 1 está en el lado alto.

Entonces, para responder a su pregunta, depende. :-)

Jon Strayer
fuente
Depende de lo que quieras decir con "los métodos son largos". La imagen que creó en mi cabeza es que los métodos son innecesarios por mucho tiempo, hacen demasiado trabajo y tienen demasiadas responsabilidades (a menudo tienen demasiados parámetros). En ese caso, tal método necesita proporcionalmente más combinaciones a la cubierta por medio de pruebas, por lo que no creo que la relación iba a cambiar mucho ...
Herby
Suponga por un momento que puede configurar una prueba, llame al método a probar y verifique el resultado en tres líneas de código. Si el método que está probando es de una línea de largo (como sucede en Scala), entonces su ración de código de prueba a producción es 3: 1. Si el método tiene seis líneas, entonces es 1: 2. Seis líneas no son tan largas.
Jon Strayer
2

Para aplicaciones críticas de software, la proporción habitual es un día de prueba para cada 10 LoC funcionales.

Y esto no cuenta TDD, que no se trata de pruebas sino de especificaciones.

Mouviciel
fuente
1

El tamaño de mi código de prueba es aproximadamente la mitad de lo que es el código 'real' en general. Hacer lo contrario es indicativo de que sus pruebas son demasiado complejas y / o su código es demasiado difícil de probar y / o su código es demasiado denso / complejo.

O simplemente está probando demasiado y desperdiciando su tiempo en rendimientos decrecientes.

Consulte también "¿cuándo la prueba de la unidad es inapropiada o innecesaria?"

Telastyn
fuente
-1

Mi proporción es de alrededor de 2-1 a 10-1 (código para probar). Asegúrese de que las pruebas sean sobre valor / comportamiento y no implementación

Erez A. Korn
fuente