¿Cuál es la diferencia entre depuración y prueba?

10

Introducción a las pruebas de software (Ammann & Offutt) menciona en la p.32 un modelo de madurez de prueba de 5 niveles:

Nivel 0 No hay diferencia entre probar y depurar.

Nivel 1 El propósito de las pruebas es mostrar que el software funciona.

Nivel 2 El propósito de las pruebas es mostrar que el software no funciona.

Nivel 3 El propósito de las pruebas no es probar nada específico, sino reducir el riesgo de usar el software.

Level 4 Testing es una disciplina mental que ayuda a todos los profesionales de TI a desarrollar software de mayor calidad.

Aunque no entran en muchos más detalles. ¿Cuáles son las diferencias entre depuración y prueba?

Persépolis
fuente
1
¿Qué parte de la página de wikipedia sobre Depuración te confundió? en.wikipedia.org/wiki/Debugging Por favor, publique frases o citas específicas que le resulten confusas.
S.Lott
44
Tiempo promedio que un programador pasa las pruebas: 10 minutos. Tiempo promedio que un programador pasa depurando algo que debería haber probado: 2.5 horas.
Craige
1
¿Realmente se necesita formalizar las pruebas, cuando el 80% de todas las tiendas no tienen pruebas en funcionamiento?
Trabajo
@Craige: las pruebas suelen llevar mucho más de 10 minutos. Incluso podría llevar más tiempo que el tiempo total dedicado a la depuración. Sin embargo, el tiempo dedicado a las pruebas es proactivo (logrando una cobertura integral, aunque solo un pequeño porcentaje de las pruebas revelaría defectos), mientras que el tiempo dedicado a la depuración es reactivo (el defecto salta al programador en el momento más inconveniente, poniendo uno bajo presión para deshacerse del error, y termina introduciendo errores adicionales como parte de la solución.)
rwong

Respuestas:

20

Las pruebas están destinadas a encontrar defectos en el código, o desde un ángulo diferente, para demostrar a un nivel adecuado (nunca puede ser del 100%) que el programa hace lo que se supone que debe hacer. Puede ser manual o automatizado, y tiene muchos tipos diferentes, como pruebas de unidad, integración, sistema / aceptación, estrés, carga, remojo, etc.

La depuración es el proceso de encontrar y eliminar un error específico del programa. Siempre es un proceso manual, único, ya que todos los errores son diferentes.

Supongo que el autor quiere decir que, en el Nivel 0, solo se realizan pruebas manuales, de manera ad hoc, sin un plan de prueba ni nada para garantizar que el probador realmente probó a fondo la característica bajo prueba, y que las pruebas pueden ser repetido confiablemente.

Péter Török
fuente
Tenga en cuenta que, en este contexto, un error es una diferencia entre lo que el programa estaba destinado a hacer y lo que realmente hace.
1
Esa "prueba" es mi comprensión de una prueba de unidad. La depuración, especialmente si es su propio código, es solo prueba y error.
ott--
4

La depuración es un proceso manual paso a paso que está involucrado, no estructurado y no es confiable. Al probar a través de la depuración, crea escenarios que no son repetibles, por lo tanto, inútiles para las pruebas de regresión. Todos los niveles que no sean 0 (en su ejemplo) excluyen la depuración en mi opinión por este motivo exacto.

Otávio Décio
fuente
El Squeeze Saff es una técnica de depuración que es muy estructurado, muy fiable, no particularmente implicados y, posiblemente, al menos en parte automatizables. Lo logra al reconocer que, de hecho, no hay diferencia entre las pruebas y la depuración.
Jörg W Mittag
Si su depuración es "desestructurada, poco confiable y manual", ¡no lo está haciendo bien! O claramente usamos estas dos palabras para significar cosas diferentes.
MemeDeveloper
3

La depuración es un intento de solucionar problemas conocidos y desconocidos revisando metódicamente el código. Cuando está depurando, generalmente no está enfocado en el código en su conjunto, y casi siempre está trabajando en el backend, en el código real.

La prueba es un intento de crear un problema a través de varias formas de usar el código que luego se puede depurar. Casi siempre se realiza en el espacio de usuario, donde está ejecutando el código como lo ejecutaría un usuario final e intentando que se rompa.

Satanicpuppy
fuente
1
Estoy de acuerdo, y me gustaría enfatizar su punto sobre "ejecutar el código como lo haría un usuario final" solo para resaltar el énfasis excesivo que las personas tienden a poner en pruebas automatizadas y TDD. Particularmente para aplicaciones basadas en la web: ¿qué es más informativo, código de prueba de código o personas que prueban páginas web?
MemeDeveloper
2

En términos simples, se dice que ha ocurrido un "error" cuando su programa, en ejecución, no se comporta como debería. Es decir, no produce la salida o los resultados esperados. Cualquier intento de encontrar el origen de este error, encontrar formas de corregir el comportamiento y realizar cambios en el código o la configuración para corregir el problema puede denominarse depuración.

La prueba es donde se asegura de que el programa o código funciona correctamente y de manera robusta en diferentes condiciones: "prueba" su código al proporcionar entradas, entradas correctas estándar, entradas intencionalmente incorrectas, valores límite, entorno cambiante (SO, archivo de configuración) . Esencialmente, podemos decir que intenta descubrir errores y eventualmente "depurarlos" en el proceso de prueba. Espero que ayude.

CABALLETE
fuente
1

No hay ninguno. Si lo haces bien:

Hit 'em High, Hit' em Low :

Pruebas de regresión y el apretón de Saff

Kent Beck, Instituto de los Tres Ríos

Resumen: Para aislar un defecto de manera efectiva, comience con una prueba a nivel del sistema y en línea y pode progresivamente hasta que tenga la prueba más pequeña posible que demuestre el defecto.

Jörg W Mittag
fuente
En algunos sistemas, Smalltalk, por ejemplo, no hay ninguna diferencia, porque puede realizar su ciclo de prueba de escritura / prueba de ejecución / código de escritura completamente dentro de su depurador.
Frank Shearar
@FrankShearar: Probablemente no sea accidental que el documento anterior haya sido escrito por un viejo Smalltalker. El ciclo TDD (que por supuesto también es de Kent Beck) es básicamente una descripción de cómo se ha escrito el código Smalltalk desde el principio de los tiempos: escriba algún código de ejemplo en el espacio de trabajo, deje que el depurador capture la excepción sin método, haga clic en crear método , escriba el código, reanude la ejecución (¡sí, para excepciones reanudables!), repita.
Jörg W Mittag
1

La prueba es un privilegio que disfruta antes de entregar al cliente.

Los errores son una pesadilla que soportas después de liberar al cliente.

sunwukung
fuente
jaja. La respuesta más realista / práctica ... si tan solo pudiera votar x 100.
MemeDeveloper
1

Otros han mencionado cuáles son las diferencias entre las pruebas y la depuración.

Me gustaría hacer hincapié en una parte común . Cuando un probador encuentra un defecto, debe aislarse. La depuración es una de las técnicas para aislar el problema y encontrar una causa raíz al analizar el estado de la aplicación y su código en tiempo de ejecución. De hecho, los diccionarios Oxford definen la depuración como "el proceso de identificación y eliminación de errores del hardware o software de la computadora".

Quien aislará (o depurará en particular) un defecto, ya sea un probador o un desarrollador, es una pregunta secundaria.

dzieciou
fuente
0

El modelo de madurez de prueba que ha enumerado son descripciones de la mentalidad del equipo de desarrollo.

Lo que la lista implica, sin decir explícitamente, es cómo el cambio en la mentalidad afecta la forma en que se realizan las pruebas.

A medida que un equipo de desarrollo avanza al siguiente nivel, el alcance de las pruebas se amplía.

En el Nivel 0, no se realizan pruebas, porque el equipo piensa que no es necesario.

En el Nivel 1, las pruebas se realizan para proporcionar una cobertura nominal de funcionalidades básicas.

En el Nivel 2, las pruebas se amplían para incluir todo en el Nivel 1 y agregan pruebas destructivas (un equipo de pruebas dedicado que tiene acceso a toda la información a la que tienen acceso los desarrolladores, incluidos el código fuente y los archivos binarios, e intenta encontrar errores que puedan ser activado desde un rol de usuario)

En el nivel 3, además de todo en los niveles 1-2, se agregan pruebas no funcionales / pruebas basadas en la falta de corrección (como las características de rendimiento).

En el nivel 4, los objetivos de las pruebas de software son bien entendidos por todas las personas, incluido el personal de TI orientado al cliente. Por lo tanto, el personal de TI podrá proporcionar comentarios sobre qué escenarios probar, mejorando la cobertura de riesgos del Nivel 4.

(Descargo de responsabilidad: no tengo acceso al libro de texto, por lo tanto, mi terminología puede ser incorrecta).

rwong
fuente
0

Los errores son errores visibles. La depuración es el proceso iniciado después del diseño del caso de prueba. Es una tarea más difícil que la prueba, porque en el proceso de depuración necesitamos encontrar la fuente del error y eliminarlo, por lo que a veces la depuración frustra al usuario.

kumar gaurav jha
fuente
0

Hablando en términos cotidianos y prácticos, creo que depende totalmente del contexto .

En un equipo med-grande, que trabaja con estándares altos / muy altos (piense en sistemas bancarios, militares, a gran escala, de alto presupuesto o críticos para el negocio), entonces creo claramente que la "depuración" debería ser "el resultado de una prueba" , y claramente Cosas muy diferentes . Idealmente, las pruebas conducen a la depuración (en un entorno de preparación) y en la producción necesitamos cerca de cero.

Las pruebas son amplias, regulares y muy formalizadas, mientras que la depuración es un proceso particular que ocurre ocasionalmente cuando existe la necesidad de corregir una falla particular, lo cual no es obvio y requiere una investigación más profunda del funcionamiento del sistema y los resultados resultantes.

Aquí, en mi mente, las pruebas son algo esencial, mientras que la depuración es una herramienta específica necesaria solo cuando la resolución de una falla es opaca.

Entiendo totalmente la utilidad obvia en TDD para grandes equipos y / o sistemas que simplemente no pueden permitirse el lujo de "tener errores". También tiene mucho sentido para sistemas complejos (a menudo "back-end") o si hay una alta proporción de complejidad en el código en comparación con la salida. Entonces, "probar" tiene una posibilidad realista de informar cuándo y por qué ocurren las fallas. Los sistemas que realizan mucho trabajo complejo y que producen resultados claramente medibles son generalmente fácilmente comprobables, por lo que las pruebas son distintas de la depuración. En estos casos, las pruebas implican un método formalizado basado en procedimientos para confirmar o des-confirmar la coincidencia de expectativas y resultados reales. Las pruebas se realizan todo el tiempo y ocasionalmente nos informan sobre la necesidad de depurar.

Sería encantador si esta fuera una verdad omnipresente, me encantaría si mis ciclos de desarrollo estuvieran delimitados por una salida binaria claramente definida (rojo, verde) pero ...

En mi caso (lo cual es ciertamente particular: trabajar 98% solo en sistemas de administración corporativos centrados en datos y basados ​​en web pequeños, medianos y poco financiados) Realmente no puedo ver cómo TDD podría ayudarme. O mejor dicho, "depuración" y "prueba" son prácticamente lo mismo.

Principalmente, aunque el uso del término "prueba" implica / se relaciona estrechamente con la metodología de TDD.

Sé que esto es totalmente, totalmente no Zeitgeist "rehúye al no creyente, rehúye, rehúye", algo despreciablemente desagradable que decir. Pero pensando en mi contexto, con un sombrero práctico puesto, ni siquiera vagamente, en mi imaginación más salvaje, veo cómo TDD podría ayudarme a entregar más valor por dinero a mis clientes.

O más bien, estoy totalmente en desacuerdo con la suposición común de que "probar" es un proceso formal basado en código.

Mi objeción básica (aplicable en mi * contexto * particular ) es que ...

Si no puedo escribir código que funcione de manera confiable, entonces, ¿cómo diablos se supone que debo escribir código que funcione de manera confiable para probar dicho código presumiblemente por debajo del estándar?

Para mí, nunca he visto ningún ejemplo ni argumento que (en mi contexto particular) me haya entusiasmado lo suficiente como para molestarme en pensar en escribir una sola prueba , podría estar escribiendo un código de prueba ridículamente insustancial en este momento, tal vez "¿mi repositorio devuelve un Usuario? entidad con Nombre == X, cuando lo pido exactamente, ¿y solo eso? ", pero probablemente haya más utilidad en mí al escribir esta transmisión, tal vez-el-internet-realmente-es-solo-puro-tonto-escupir- basura auto-gratificante-salvajemente-bajo-informada-sangrienta-hirviente-derrochadora-tonta, pero solo siento la necesidad de jugar al abogado del diablo aquí. (Espero que alguien me muestre la luz y me convierta, ¿tal vez esto termine dando a mis clientes una mejor relación calidad-precio?).

Podría decirse que "depurar" a veces es lo mismo que "probar". Con esto realmente quiero decir que en mi vida laboral diaria paso al menos un tercio de mi tiempo jugando con la versión local de mi sistema en diferentes navegadores, probando desesperadamente diferentes cosas extrañas en un intento de romper mi trabajo y luego investigando las razones por las cuales falló y corregirlos.

Estoy 100% de acuerdo con la utilidad obvia en el mantra TDD "rojo / verde / refactor", pero para mí (trabajando en un presupuesto bajo, tierra de desarrollo individual de RIA) realmente me encantaría que alguien me muestre cómo podría posiblemente , de manera lógica y vitalmente realista, obtengo cualquier valor adicional al escribir más ( al igual que un código de prueba potencialmente defectuoso ) que al interactuar realmente con el resultado completo (y esencialmente único) de mis esfuerzos que están esencialmente vinculados a la interacción humana real.

Para mí, cuando los desarrolladores hablan de "pruebas", generalmente implica TDD.

Intento codificar como si hubiera pruebas, creo que todos los patrones / prácticas y tendencias que todo este desarrollo centrado en las pruebas ha fomentado son fantásticos y hermosos, pero para mí en mi pequeño mundo "probar" no es escribir más código, en realidad es probarlo en el mundo real lo genera de una manera realista y aproximada, y eso es prácticamente lo mismo que la depuración, o más bien el cambio activo aquí es la "depuración" que es un resultado directo de la "prueba" no automatizada centrada en la producción humana. Esto contrasta con la visión generalmente aceptada de "probar" como algo automatizado y formal, y "depurar" como algo humano y ad-hoc o no estructurado.

Si el objetivo es realmente el valor por el dinero / esfuerzo, y está haciendo aplicaciones interactivas basadas en la web, entonces el resultado del esfuerzo son las páginas web y, esencialmente, cómo reaccionan a la aportación humana , por lo que la mejor manera de "probar" es probar esas páginas web, a través de la interacción humana real. Cuando esta interacción conduce a resultados inesperados o indeseables, se produce la "depuración". La depuración también está estrechamente relacionada con la idea de la inspección en tiempo real del estado del programa. Las pruebas generalmente se asocian con la automatización, que creo que a menudo es una asociación desafortunada.

Si el objetivo es realmente valioso para el esfuerzo, y las pruebas automatizadas son eficientes y altamente beneficiosas, mientras que la depuración es solo una salida de esas pruebas o un mal sustituto de las pruebas automáticas, entonces ¿por qué es el segundo sitio web más visitado del mundo (Facebook ) tan a menudo plagado de errores cegadoramente obvios (para los usuarios, pero claramente no para el equipo de prueba y el código de prueba)?

¿Tal vez es porque se están concentrando en las tranquilizadoras luces verdes y olvidando usar realmente los resultados de su trabajo?

¿Demasiados desarrolladores piensan que las pruebas son algo que haces con el código, y la depuración es algo que haces ocasionalmente con el IDE porque un icono se vuelve rojo y no puedes entender por qué? Creo que estas palabras tienen juicios de valor desafortunados asociados con ellas, que generalmente oscurecen la realidad práctica de lo que debemos enfocar para cerrar las brechas entre las expectativas y los productos.

MemeDeveloper
fuente
-3

Simplemente,

La prueba significa que encontrar las entradas que hacen que un software falle durante la depuración es el proceso de encontrar la falla de una falla determinada.

TRAX
fuente
Esto no parece ofrecer nada sustancial sobre los puntos hechos y explicados en las 10 respuestas anteriores
mosquito