Pruebas unitarias y desarrollo impulsado por pruebas en Python

¿Cuáles son los diferentes tipos de pruebas de software?

Generalmente, podemos decir que existen cuatro tipos de pruebas de software:

  • Pruebas unitarias: céntrese en unidades o componentes específicos del software para determinar si cada unidad es completamente funcional.

  • Pruebas de integración: incluye pruebas combinadas de componentes o bloques de construcción individuales. Comprueba si existen defectos de interfaz entre las distintas funciones.

  • Prueba del sistema: la prueba del sistema es una prueba realizada en un sistema integrado completo para evaluar si el sistema cumple con sus requisitos específicos.

  • Prueba de aceptación: esta prueba se realiza antes de que el software se publique en el entorno de producción. Los usuarios probarán el sistema para determinar si la aplicación satisface sus necesidades comerciales

Especificación de prueba unitaria:

  • Prueba una sola función

  • Las pruebas deben escribirse para cada tipo de caso de prueba funcional (todos los casos de prueba positivos y negativos)

  • Debe ejecutarse en el entorno de desarrollo.

  • El tiempo de carga y ejecución no debería llevar más tiempo, porque los desarrolladores necesitan que se ejecuten de vez en cuando, por lo que debería ser lo suficientemente rápido.

  • Las pruebas deben realizarse automáticamente

¿Qué es el desarrollo basado en pruebas o TDD?

En este proceso, la unidad de prueba es el código real antes de escribirlo.

Ahora, debe preguntarse cómo escribir casos de prueba antes de escribir funciones reales. No es que tengamos que escribir todos los casos de prueba y luego escribir el código completo, sino comenzar a escribir casos de prueba para una de las funciones y luego escribir el código que hace que la prueba pase. De esta forma, nuestro código y pruebas seguirán creciendo. Los siguientes pasos son muy importantes en el método TDD:

1) Primero escriba una prueba unitaria fallida.

2) Luego, escriba suficiente código para que la prueba pase

3) Refactorizar el código de producción y prueba de la unidad para que quede limpio

4) Repita el proceso hasta completar la función

Para entenderlo con claridad, les daré un ejemplo.

Usaremos un ejemplo simple para entender el propósito. Nuestra función comprueba si el valor de entrada es par o impar. Como usaré el marco "pytest", primero debemos instalarlo. Personalmente, prefiero usar el marco "pytest" en lugar del "unittest" porque es fácil de usar y aprender, y ambos marcos tienen sus propias ventajas, así que elija según su caso de uso.

python -m pip install pytest
 
Por lo tanto, los siguientes son casos de prueba para nuestra función:
  • ¿Puedo llamar a evenOdd ()
  • Si paso un número par, debería devolver "número par"
  • Si paso un número impar, debería devolver "número impar"
  • Si paso algo que no sea un número entero, entonces debería lanzarse una excepción

Revisemos cada caso de prueba a la vez, por lo que ahora estamos probando si se puede llamar a la función "evenOdd ()". De acuerdo con los pasos escritos anteriormente, primero debemos escribir una prueba unitaria fallida. A continuación, lo llamo antes de definir la función.

 
#test_evenodd.py
import pytest

def test_call_evenOdd():
    evenOdd(1)

 

Podemos ejecutar la prueba anterior usando el comando "pytest" como se muestra a continuación:

En la carpeta "pytest_unittest", tengo muchos otros archivos de prueba, y cuando todas las pruebas pasen, mostrará un punto ".". Si la prueba falla, se escribirá "F" en la consola como se muestra en la captura de pantalla anterior. Como era de esperar, la prueba falla porque no tenemos la función evenOdd (). Ahora, ingresaremos al segundo paso, que es "escribir código suficiente para que la prueba pase".

 
#test_evenodd.py
import pytest

def evenOdd(value):
    return

def test_call_evenOdd():
    evenOdd(1)

 

El resultado de la prueba anterior es:

Mucha gente aprende Python y no sabe por dónde empezar.
Muchas personas aprenden Python y después de dominar la gramática básica, no saben dónde encontrar casos para comenzar.
Muchas personas que han realizado estudios de casos no saben cómo adquirir conocimientos más avanzados.
Entonces, para estos tres tipos de personas, les proporcionaré una buena plataforma de aprendizaje, ¡gratis para recibir tutoriales en video, libros electrónicos y el código fuente del curso!
Grupo QQ: 721195303

 

En la salida, podemos ver que la prueba ha pasado. Ahora, ingresaremos al tercer paso, que es "refactorizar las pruebas unitarias y el código de producción para hacerlo más ordenado". Entonces, ¿qué hay que refactorizar? En realidad no. Ahora pasemos al segundo caso de prueba. "Si paso un número par, debería devolver" par "" y el caso de prueba fallido se verá así:

 
#test_evenodd.py
import pytest

def evenOdd(value):
    return 

def test_call_evenOdd():
    evenOdd(1)

def test_check_even():
    retval = evenOdd(2) 
    assert retval=='even'

 

Ahora, escribiré suficiente código para pasar la prueba:

 
#test_evenodd.py
import pytest

def evenOdd(value):
    return 'even'

def test_call_evenOdd():
    evenOdd(1)

def test_check_even():
    retval = evenOdd(2)
    assert retval=='even'

 

Ahora podemos ver que la prueba ha pasado.

Ahora, verifiquemos si hay algo que deba ser refactorizado. Sí, podemos refactorizar la prueba porque copiamos la llamada a la función en los dos casos de prueba. Por tanto, el código refactorizado será:

 
#test_evenodd.py
import pytest

def evenOdd(value):
    return 'even'

def test_check_even():
    retval = evenOdd(2)
    assert retval=='even'

 

Ahora para el siguiente caso de prueba: si paso un número impar, debería devolver "número impar"

El caso de prueba fallido es el siguiente:

 
#test_evenodd.py
import pytest

def evenOdd(value):
    return 'even'

def test_check_even():
    retval = evenOdd(2)
    assert retval=='even'

def test_check_odd():
    retval = evenOdd(1)
    assert retval== 'odd'

 

Ahora necesitamos escribir código para que la prueba pase.

 
#test_evenodd.py
import pytest

def evenOdd(value):
    if value%2==0:
        return 'even'
    else:
        return 'odd'

def test_check_even():
    retval = evenOdd(2)
    assert retval=='even'

def test_check_odd():
    retval = evenOdd(1)
    assert retval== 'odd'
 

Aquí, no veo nada que pueda refactorizarse. Ahora pasemos al último caso de prueba: si paso un número entero que no sea un número entero, se debería generar una excepción.

El caso de prueba fallido es el siguiente:

 
#test_evenodd.py
import pytest

def evenOdd(value):
    if value%2==0:
        return 'even'
    else:
        return 'odd'

def test_check_even():
    retval = evenOdd(2)
    assert retval=='even'

def test_check_odd():
    retval = evenOdd(1)
    assert retval== 'odd'

def test_check_int():
    with pytest.raises(TypeError):
        evenOdd(1.5)
 

Ahora, generaré TypeError en la función de la siguiente manera:

#test_evenodd.py
import pytest

def evenOdd(value):
    if type(value)==int:
        if value%2==0:
            return 'even'
        else:
            return 'odd'
    else:
        raise TypeError


def test_check_even():
    retval = evenOdd(2)
    assert retval=='even'

def test_check_odd():
    retval = evenOdd(1)
    assert retval== 'odd'

def test_check_int():
    with pytest.raises(TypeError):
        evenOdd(1.5)

 

Y todas nuestras pruebas pasaron:

De esta forma, hemos logrado la función final. El propósito principal de escribir este artículo es guiarlo a través del viaje completo del método TDD. Ahora la pregunta es, ¿por qué deberíamos seguir el método TDD? Los beneficios de TDD se enumeran a continuación.

Beneficios del método TDD:

  • Brindarle retroalimentación instantánea sobre lo que se está desarrollando.

  • Con comentarios instantáneos, puede cambiar funciones con confianza o mejorar el código actual

  • Esto contribuye a la mantenibilidad y escalabilidad del proyecto o código.

  • Lo más importante es que registra el código, lo que ayuda a los desarrolladores a comprender cómo se comporta el código real.


Todavía quiero recomendar el grupo de aprendizaje de Python que construí por mí mismo : 721195303. Todos los estudiantes del grupo están aprendiendo Python. Si quieres aprender o estás aprendiendo Python, puedes unirte. Todos son parte del desarrollo de software y comparten productos de vez en cuando (solo relacionados con el desarrollo de software de Python), incluida una copia de los últimos materiales avanzados de Python y la enseñanza basada en cero compilada por mí en 2021. ¡Bienvenidos amigos que están avanzados e interesados ​​en Python a unirse!

Supongo que te gusta

Origin blog.csdn.net/aaahtml/article/details/114277809
Recomendado
Clasificación