Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: Flacky test causé par un mot de passe aléatoire non valide #1621

Draft
wants to merge 8 commits into
base: master
Choose a base branch
from

Conversation

Guilouf
Copy link
Collaborator

@Guilouf Guilouf commented Dec 31, 2024

Quoi ?

Les tests échouaient parfois de manière inexpliquée sur la CI, comme ici: https://github.com/gip-inclusion/le-marche/actions/runs/12300147620/job/34327607329

Un autre test échoué est https://github.com/gip-inclusion/le-marche/actions/runs/12548544358/job/34987960701, cette fois à cause des factory avec du Fuzzing. La région était générée aléatoirement, matchant aléatoirement le périmètre créé dans le setup. Par ailleurs, la factory générait des données un peu absurde car le département Morbihan pouvait se trouver dans la région Occitanie sans problèmes.

Des tests interdépendants ont été trouvés en changeant l'ordre d’exécution avec --shuffle ou --reverse. Par exemple,
pythonb test --reverse lemarche.tenders.tests.test_commands.TestSendAuthorListOfSuperSiaesEmails échoue avec l'option reverse.

Pourquoi ?

Un mot de passe aléatoire était généré dans les tests, mais dans certains cas il ne respectait pas les caractéristiques requises par le validateur.

Le fait de dépendre des données contenues dans les migrations peut être problématique pour certains tests, notamment les TransactionTestCase et ceux qui en héritent car la base est purgée à la fin du test.

Pareil, avec des factory ou des objets nommés après des séquences d'id, les séquences ne sont pas toujours prédictibles et il ne faut pas compter dessus. (test_list_tenders_content)

Comment ?

Ce mot de passe à été remplacé par un mot de passe fixe respectant le validateur. Si le validateur doit être testé ce n'est pas au niveau des tests fonctionnels.

Remarques

Un test qui avait été commenté comme cassé était en fait fonctionnel, il a été de-commenté

Voici le script utilisé pour tester la validité du mot de passe aléatoire:

class A(StaticLiveServerTestCase):
    def test_bidon(self):
        from django.contrib.auth import password_validation
        import secrets
        import string
        # c*[gkp`0=
        for i in range(0, 30):
            password = "".join(secrets.choice(string.ascii_letters + string.digits + string.punctuation) for i in range(9))
            print("MOT DE PASSE: ", password)
            password_validation.validate_password(password)
  • Les dictionnaires définis en constantes ont été déplacés dans le setup plutot que de faire des .copy() partout
  • Test accélérés en enlevant le time.sleep()

Les test avec du Fuzzing sont utiles, mais pas pas forcément à leur place dans une CI destinée à valider les changements de code. Par ailleurs ici ils ne sont pas déterministes, donc impossible à reproduire. S'il y avait une seed réutilisable on pourrait détecter facilement les erreurs.

Une manière de détecter des tests interdépendants est l'option --shuffle, avec une seed qui permet d'avoir des résultats reproductibles.

@Guilouf Guilouf added the bug Something isn't working label Dec 31, 2024
@Guilouf Guilouf self-assigned this Dec 31, 2024
@Guilouf Guilouf force-pushed the guilouf/flacky-tests branch from 2c1c67f to 8ce9c81 Compare January 2, 2025 14:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant