Résolue

SetUp(self) ou setUpTestdata(cls)

# Tests unitaires # Performances

salut,
on utilise dans les tests la méthode setUp pour "factoriser" le code et le rendre dispo pour toutes les méthodes de tests. Je viens de lire qu'il existe une méthode de classe, qui permettrait de gagner en performance du fait qu'elle ne serait éxecutée qu'une seule fois avant tous les tests alors que la 1ere est exécutée avant chaque test. Dans les exemples que Thibault nous montre dans les vidéos, les données créées ne sont pas amenées à être modifiées par les tests, peut-on utiliser la méthode setUpTestData alors?
Merci.
Ali

Gabriel Trouvé

Mentor

Bonjour

Tu peux très bien utilise setUpTestData.

La méthode setUpTestData est une méthode de classe qui est exécutée une seule fois avant l'exécution de tous les tests de la classe. Du coup tu as des données de test qui restent constantes tout au long de l'exécution des tests de cette classe.

Pour ton cas tu pourrais vite de mettre à pytest avec les fixtures et ses scopes (je te laisse regarder ^^).

salut Gabriel, merci pour ta réponse. Quel est l'intérêt de pytest par rapport à tescase qui est déjà intégré à Django?

Gabriel Trouvé

Mentor

pytest-django est plus intuitif et plus "léger" d'utilisation je trouve. Alors je fais tout en fonctions.

J'aime beaucoup la façon de faire pytest avec un fichier avec des fixtures :

@pytest.fixture
def presentation():
    return CompanyPresentation.objects.create(title="presentation", text="super texte !")


@pytest.fixture
def user_1():
    return CustomUser.objects.create_user(email="[email protected]", username="gabigab117", first_name="Trouvé",
                                          last_name="Gabriel", password="12345678")


@pytest.fixture
def company_1():
    return Company.objects.create(name='pygabdev', phone="0144865112", email="[email protected]")


@pytest.fixture
def company_2():
    return Company.objects.create(name='pyeldev', phone="0144865113", email="[email protected]")

fixtures que tu utilises dans tes tests :

import pytest
from pytest_django.asserts import assertRedirects
from django.test import Client
from django.urls import reverse
from django.utils.encoding import force_bytes
from django.utils.http import urlsafe_base64_encode

from account.models import CustomUser, Company
from account.verification import email_verification_token


@pytest.mark.django_db
def test_signup_post_with_activation(client: Client, mailoutbox, presentation):
    # Given a user wants to create an account
    data = {"email": "[email protected]", "username": "test", "last_name": "Trouvé", "first_name": "Patrick",
            "password1": "Roger_12345678", "password2": "Roger_12345678"}
    client.post(reverse("account:signup"), data=data)
    # print(response.context['form'].errors)
    user = CustomUser.objects.get(email="[email protected]")
    # When user submits the form,
    # Then his account is not active and an email is sent
    assert user.is_active is False
    assert len(mailoutbox) == 1

    # When user wants to activate his account
    uidb64 = urlsafe_base64_encode(force_bytes(user.pk))
    token = email_verification_token.make_token(user)
    url = reverse("account:activate", kwargs={"uidb64": uidb64, "token": token})
    r = client.get(url)
    user.refresh_from_db()
    # Then his account is active
    assert user.is_active
    assertRedirects(r, reverse("index"), 302)


@pytest.mark.django_db
def test_add_company_view(client: Client, user_1):
    # Given user who add a company
    client.force_login(user_1)
    # When user submits the form,
    data = {"address_1": "adresse", "city": "Ons en Bray", "zip_code": "60650", "country": "fr",
            "name": "py", "phone": "0344785145", "email": "[email protected]", "website": "www.g.com"}
    client.post(reverse("account:add-company"), data)
    company = Company.objects.get(name="py")
    # Then a company with address is created, and user has admin status perm
    assert company.companyaddress.city == "Ons en Bray"
    assert user_1.has_perm("account.company_admin_status")


@pytest.mark.django_db
def test_select_company_view(client: Client, user_1, company_1: Company, company_2):
    # Given user who select a company
    company_1.users.add(user_1)
    client.force_login(user_1)
    r = client.get(reverse("account:select-company"))
    # in the list of choices there are only the companies of which the user is a part
    assert "pygabdev" in str(r.content)
    assert "pyeldev" not in str(r.content)
    # When user submits the form
    r = client.post(reverse("account:select-company"), data={"company": company_1.id})
    # Then the session has a key "company" with the name and id of company instance
    assert client.session["company"] == f"{company_1.name} id {company_1.identification}"
    assertRedirects(r, reverse("account:select-company"), 302)

Hey Gabriel, un grand merci pour ces infos, je vais étudier tranquillement et tester les 2 sur la base du cours de Thibault pour comparer ;-)
Bon we.

De rie nc'est normal.

https://www.docstring.fr/formations/les-tests-unitaires-avec-python/

ça permet d'avoir une vue d'ensemble sur les tests.

Et pour finir je t'invite à regarder cet article : https://djangostars.com/blog/django-pytest-testing/

Bonne journée à toi

Inscris-toi

(c'est gratuit !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.