6.3. Prueba unitaria
Un caso de prueba expresa los requisitos para un programa, de una manera que se puede verificar automáticamente. Específicamente, una prueba
afirma algo sobre el estado del programa en un punto particular en su ejecución. Una prueba unitaria es
una automática
Procedimiento utilizado para validar que las unidades individuales de
código funcionan correctamente. Una función es una forma de una unidad.
Una colección de estas pruebas unitarias se llama suite de prueba .
Anteriormente hemos sugerido que es una buena idea escribir primero comentarios sobre lo que se supone que debe hacer su código,
antes de escribir el código. Es una idea aún mejor escribir algunos casos de prueba antes de escribir un programa.
Hay varias razones por las que es un buen hábito escribir casos de prueba.
Antes de escribir código, tenemos en mente lo que debería hacer,
pero esos pensamientos pueden ser un poco vagos. Escribir casos de
prueba nos obliga a ser más concretos sobre lo que debería suceder.
A medida que escribimos el
código, los casos de prueba pueden proporcionar comentarios
automatizados. En realidad, ha sido el beneficiario de tales comentarios
automatizados a través de casos de prueba a lo largo de este libro en
algunas de las ventanas de Activecode y casi todos los ejercicios.
Escribimos el código para esos casos de prueba, pero lo mantuvimos
oculto, para no confundirlo y también evitar regalar las respuestas.
Puede obtener algunos de los mismos beneficios al escribir sus propios
casos de prueba.
En proyectos de software
más grandes, el conjunto de casos de prueba se puede ejecutar cada vez
que se realiza un cambio en la base del código. Pruebas unitarias verifique que los pequeños bits de código se implementen correctamente.
Una forma de implementar pruebas unitarias en Python es con assert.
Siguiendo la palabra afirmar que habrá una expresión de Python.
Si esa expresión se evalúa al booleano False, entonces el intérprete aumentará un error de tiempo de ejecución.
Si la expresión evalúa a True, entonces nada sucede y la ejecución pasa a la siguiente línea de código.
Eche un vistazo a la forma en que Afirmar se usa en el siguiente código.
>>assert type(9//5) == int
>>assert type(9.0//5) == int
>>>
Error
AssertionError: en la línea 2
Descripción
Un
error de afirmación ocurre cuando Python encuentra una declaración de
afirmación. Python evalúa la expresión a la derecha de la palabra
afirmar; Si esa expresión es verdadera, todo está bien y el programa
continúa. Si la expresión es falsa, Python plantea un error y se
detiene.
Para arreglar
Verifique
la expresión a la derecha de afirmar. La expresión es falsa y deberá
determinar por qué es así. Es posible que simplemente desee imprimir las
partes individuales de la expresión para comprender por qué se está
evaluando a False.
Explicación:
En el código anterior,
establecemos explícitamente algunos supuestos naturales sobre cómo la
división truncada podría funcionar en Python.
Resulta que el segundo asumio está mal: 9.0//5 produce 2.0, un valor de punto flotante!
El intérprete de Python no
hace cumplir las restricciones sobre los tipos de datos de objetos que
pueden estar vinculados a particular
variables; Sin embargo, la comprobación de tipos podría alertarnos de
que algo ha salido mal en la ejecución de nuestro programa. Si somos
asumiendo eso x es una lista, pero en realidad es un entero, luego en algún momento más adelante en la ejecución del programa,
Probablemente habrá un error. Podemos agregar assert declaraciones que harán que un error se marque antes
que más tarde, lo que podría hacer que sea mucho más fácil depurar.
Comprueba tu comprensión
Cuando assert x==y se ejecuta e x e y tienen los mismos valores, ¿qué sucederá?
RESPUESTA: D
6.3.1. assert con for loops
¿Por qué alguna vez querrías
escribir una línea de código que nunca pueda calcular nada útil para ti,
pero a veces causa?
¿Un error de tiempo de ejecución? Por todas las razones que describimos
anteriormente sobre el valor de las pruebas automatizadas. Quieres una
prueba que
Alertará que usted de que alguna condición que asumió que era cierto no
es cierto. Es mucho mejor ser alertado para
ese hecho de inmediato que tener algún resultado inesperado mucho más
tarde en la ejecución de su programa, que tendrá
Problemas para trazar al lugar donde tuvo un error en su código.
¿Por qué no assert
imprime algo que dice que la prueba pasó? La razón es que no quieres
desordenar
Sube su ventana de salida con los resultados de las pruebas
automatizadas que pasan. Solo quieres saber cuándo una de tus pruebas
falla. En proyectos más grandes, se utilizan otros arneses de prueba en
lugar de assert, como el pitón unittest
módulo. Esos proporcionan algunas pruebas de resumen de salida que han
pasado, así como las que fallaron. En este libro de texto,
Simplemente usaremos simple assert declaraciones para pruebas automatizadas.
En el código a continuación, lst está vinculado a un objeto de lista. En pitón , no todos los elementos de una lista deben ser de la
mismo tipo. Podemos verificar que todos tengan el mismo tipo y obtener un error si no lo son. Observe que con lst2,
Una de las afirmaciones falla.
>>lst = ['a', 'b', 'c']
>>first_type = type(lst[0])
>>for item in lst:
>> assert type(item) == first_type
>>lst2 = ['a', 'b', 'c', 17]
>>first_type = type(lst2[0])
>>for item in lst2:
>> assert type(item) == first_type
>>>
Error
AssertionError: en la línea 9
Descripción
Un
error de afirmación ocurre cuando Python encuentra una declaración de
afirmación. Python evalúa la expresión a la derecha de la palabra
afirmar; Si esa expresión es verdadera, todo está bien y el programa
continúa. Si la expresión es falsa, Python plantea un error y se
detiene.
Para arreglar
Verifique
la expresión a la derecha de afirmar. La expresión es falsa y deberá
determinar por qué es así. Es posible que simplemente desee imprimir las
partes individuales de la expresión para comprender por qué se está
evaluando a False.
6.3.2. Pruebas de valor de retorno
Probar si una función devuelve el valor correcto es el caso de prueba más fácil de definir. Simplemente verifique si el
El resultado de invocar la función en una entrada particular produce la salida particular que espera. Echar un vistazo a
el siguiente código.
>>def square(x):
>>#raise x to the second power
>> return x*x
>>print('testing square function')
>>assert square(3) == 9
>>>
testing square function
Debido a que cada prueba verifica
si una función funciona correctamente en entradas específicas, los
casos de prueba nunca estarán completos: en
Principio, una función podría funcionar correctamente en todas las
entradas que se prueban en los casos de prueba, pero aún no funcionan
correctamente en otras entradas. Ahí es donde entra el arte de definir
los casos de prueba: intenta encontrar entradas específicas que
son representativos de todos los tipos importantes de entradas que
podrían pasar a la función.
Para el juego de Hangman, esta
función 'en blanco' toma una palabra y algunas letras que se han
adivinado, y devuelve una versión
de la palabra con _ para todas las letras que no se han adivinado. ¿Cuál
de las siguientes es la forma correcta de escribir?
una prueba para verificar que 'debajo' se mantendrá en blanco como 'u_d__' ¿Cuándo el usuario ha adivinado las letras D y usted hasta ahora?