Crea una cuenta o inicia sesión

¡Continúa aprendiendo sin ningún costo! Únete y comienza a potenciar tu carrera

Aprende todo un fin de semana sin pagar una suscripción 🔥

Aprende todo un fin de semana sin pagar una suscripción 🔥

Regístrate

Comienza en:

0D
15H
22M
52S

Escribiendo nuestro primer test

3/17
Recursos

Aportes 18

Preguntas 10

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

o inicia sesión.

Probablemente no tenga mucha experiencia profesional pues apenas llevo 10 meses que trabajo como desarrollador backend y uso django en mi día a día. Pero algo que les puedo decir es que a veces hay que probar funciones más complejas, por ejemplo funciones que hacen peticiones a una api externa o algo. Hay un aporte de una persona super bueno sobre los mocks: https://platzi.com/blog/tests-python-usando-mock/

Esto ayuda mucho a probar la lógica de la función

Créditos a la persona que hizo la publicación

Viendo las opciones que hay para hacer asserts con TestCase, en el caso del ejemplo también se podría haber usado directamente AssertFalse

self.assertFalse(future_question.was_published_recently())

Da exactamente el mismo resultado que obtuvo el profesor.

El comando python manage.py test por defecto va a hacer:

  1. Busca todos los archivos cuyo nombre tengan la forma test*.py
  2. En esos archivos, busca todos los TestCase, que son las clases que heredan de django.test.TestCase
  3. De esos TestCase, busca todos los métodos cuyo nombre comience con test

Como referencia, ver documentacion de Django sobre tests

Aporte de la doc de Django

It’s a good idea to run your tests with Python warnings enabled: python -Wa manage. py test. The -Wa flag tells Python to display deprecation warnings. Django, like many other Python libraries, uses these warnings to flag when features are going away. It also might flag areas in your code that aren’t strictly wrong but could benefit from a better implementation.

Con assertIs, assertEqual, assertFalse dan el mismo resultado.

Veo dos veces al profesor!. Sé que es el mejor y todo pero sucedió algo ahí 😁 (El fondo es OBS)

# Run all the tests in the animals.tests module
$ ./manage.py test animals.tests

# Run all the tests found within the 'animals' package
$ ./manage.py test animals

# Run just one test case
$ ./manage.py test animals.tests.AnimalTestCase

# Run just one test method
$ ./manage.py test animals.tests.AnimalTestCase.test_animals_can_speak

Un video muy útil de pytest.
PyConAr 2020 - Unit Testing: Qué Testear y cómo Testear con PyTest
https://www.youtube.com/watch?v=E4Yc8dhM638

RESUMEN DE LA CLASE:
Crear un test no tiene nada de complicado, todo esto ya lo hemos aprendido.
Simplemente se crea una clase cuyo valor será el nombre que nosotros vayamos a tomar sobre ese aspecto de la aplicación sobre el que haremos los tests (en este caso Question_models)
Esta clase hereda el TestCase indicando que es una batería (un conjunto de tests) sobre el modelo y cada método de está clase será un test que probará una funcionalidad en particular de ese modelo

Al dejar

	from premiosplatziapp.polls.models import Question

Tal como lo coloca el editor, da error al ejecutar el test.

System check identified no issues (0 silenced).
E
ImportError: Failed to import test module: polls.tests

Se corrige al dejar el import como lo hace el profesor.

	from .models import Question

Siempre programen primero en los test.
Es una lata, y se siente que no se avanza, pero profesionalmente dejan una marca muy buena, y lo otro es que van a la fija.

Ahora, si sus jefes inmediatos no lo permiten por tiempo, cúrense en salud y déjenlo anotado por algún lado.

Primer test en nuestro proyecto

python3 manage.py shell
import datetime

from django.test import TestCase
from django.utils import timezone

from .models import Question

# Create your tests here
class QuestionModelTests(TestCase):

    def test_was_publish_recently_with_future_questions(self):
        """was_published_recently returns False for question whose pub_date is in the future"""
        time = timezone.now() + datetime.timedelta(days=30)
        future_question = Question(
            question_text="¿Quien es el mejor Couse Director de platzi?", pub_date=time)
        self.assertIs(future_question.was_published_recently(), False)

En la función del test definimos el código que se debe ejecutar para hacer la prueba, en este caso está comprendido en la sentencia def, para hacer la comprobación usamos el método self.assertIs({tu resultado},{lo que esperas})

Luego, corremos la prueba con python3 manage.py test polls

🚀💚 Todos mis apuntes en mi GitHib

Este modulo de Django está escrito sobre Pytest, verdad? Su estructura y sintaxis es muy parecida.

AssertFalse funciona tambien

Super útil, encontré un error en mi función was_published_recently , escribí mal “timezone.now” en lugar de “timezone.now()”, ayuda a debugar el proyecto entero. Tratare de implementar este concepto en otros proyectos con otros lenguajes.

Se pueden testear muchas cosas en Django pero lo más común son los models y views

Una batería de test no es nada más que un conjunto de tests que se corresponden a un aspecto particular de nuestra aplicación

Escribiendo nuestro primer test

Analicemos que, una de nuestras funciones del proyecto regresa preguntas recientes, pero si creamos preguntas que son hechas en el futuro, se toman como recientes y esto no debe ser así.

>>> import datetime
>>> from django.utils import timezone
>>> from polls.models import Question
>>> q = Question(question_text='¿Quién es el mejor Course Director de Platzi?', pub_date=timezone.now() + datetime.timedelta(days=30))
>>> timezone.now() + datetime.timedelta(days=30)
datetime.datetime(2022, 7, 28, 2, 42, 20, 144852, tzinfo=datetime.timezone.utc)
>>> q.was_published_recently()
True
>>>

Lo más común es hacer tests sobre modelos y/o vistas en Django.

Test creado:

import datetime

from django.test import TestCase
from django.utils import timezone

from .models import Question

# * Lo más común es hacer tests sobre modelos y/o vistas en Django


class QuestionModelTests(TestCase):

    def test_was_published_recently_with_future_questions(self):
        """was_published_recently returns False for questions whose pub_date is in the future"""
        time = timezone.now() + datetime.timedelta(days=30)
        future_question = Question(
            question_text="¿Quién es el mejor Course Director de Platzi?", pub_date=time)
        self.assertIs(future_question.was_published_recently(), False)

Resultado:

(venv) λ py manage.py test polls
Found 1 test(s).
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
F
======================================================================
FAIL: test_was_published_recently_with_future_questions (polls.tests.QuestionModelTests)
was_published_recently returns False for questions whose pub_date is in the future
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Users\migue\Desktop\Desktop_files\CURSOS\platzi\curso_basico_django\premiosplatziapp\polls\tests.py", line 18, in test_was_publis
hed_recently_with_future_questions
    self.assertIs(future_question.was_published_recently(), False)
AssertionError: True is not False

----------------------------------------------------------------------
Ran 1 test in 0.002s

FAILED (failures=1)
Destroying test database for alias 'default'...

La prueba falló pero es lo que queríamos.