{"action":"created","issue":{"url":"https://api.github.com/repos/zestedesavoir/zds-site/issues/4018","repository_url":"https://api.github.com/repos/zestedesavoir/zds-site","labels_url":"https://api.github.com/repos/zestedesavoir/zds-site/issues/4018/labels{/name}","comments_url":"https://api.github.com/repos/zestedesavoir/zds-site/issues/4018/comments","events_url":"https://api.github.com/repos/zestedesavoir/zds-site/issues/4018/events","html_url":"https://github.com/zestedesavoir/zds-site/issues/4018","id":191908974,"number":4018,"title":"Tests super longs à se lancer; utiliser pytest ?","user":{"login":"gasche","id":426238,"avatar_url":"https://avatars.githubusercontent.com/u/426238?v=3","gravatar_id":"","url":"https://api.github.com/users/gasche","html_url":"https://github.com/gasche","followers_url":"https://api.github.com/users/gasche/followers","following_url":"https://api.github.com/users/gasche/following{/other_user}","gists_url":"https://api.github.com/users/gasche/gists{/gist_id}","starred_url":"https://api.github.com/users/gasche/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gasche/subscriptions","organizations_url":"https://api.github.com/users/gasche/orgs","repos_url":"https://api.github.com/users/gasche/repos","events_url":"https://api.github.com/users/gasche/events{/privacy}","received_events_url":"https://api.github.com/users/gasche/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":8,"created_at":"2016-11-28T02:54:23Z","updated_at":"2016-12-03T00:18:23Z","closed_at":null,"body":"## Le contexte\r\n\r\nSur ma machine un test de `zds/gallery/tests/tests_views.py`\r\néchoue. J'aimerais comprendre le problème mais pour cela j'ai besoin\r\nde pouvoir lancer les tests souvent pour voir ce qui se passe.\r\n\r\n(De manière générale c'est important que les tests soient facilement\r\nlançables et un peu adaptables/spécialisables/configurables par les\r\ncontributeurs infréquents qui ne comprennent pas la vue d'ensemble du\r\ncode du site ou Django.)\r\n\r\n## L'existant\r\n\r\nLes seuls conseils que je trouve en jouant avec \"make\" c'est `make\r\ntest`, qui lance `python manage.py test`. Ça ne dit pas comment faire\r\npour lancer juste un des tests possibles, mais j'ai cherché un peu et\r\non peut faire\r\n\r\n```\r\npython manage.py test zds.gallery.tests.tests_views\r\n```\r\n\r\n... sauf que c'est toujours super long. Du coup je mets l'option de verbosité `-v 3` et je vois\r\n\r\n```\r\nChecking '/home/gasche/Prog/zds-site' for fixtures...\r\nNo fixture 'initial_data' in '/home/gasche/Prog/zds-site'.\r\n[...]\r\nChecking '/home/gasche/Prog/zds-site' for fixtures...\r\nNo fixture 'initial_data' in '/home/gasche/Prog/zds-site'.\r\nRunning migrations:\r\n  Rendering model states... DONE (19.291s)\r\n  Applying contenttypes.0001_initial... OK (0.009s)\r\n  Applying auth.0001_initial... OK (0.036s)\r\n  Applying admin.0001_initial... OK (0.020s)\r\n  [...]\r\n  Applying utils.0003_auto_20150414_2256... OK (0.234s)\r\n  Applying utils.0004_auto_20151229_1904... OK (1.334s)\r\n  Applying utils.0005_commentvote... OK (1.322s)\r\n  Applying utils.0006_auto_20160509_1633... OK (0.416s)\r\n  Applying utils.0007_auto_20160511_2153... OK (0.412s)\r\n  Applying utils.0008_auto_20161112_1757... OK (1.745s)\r\n  Applying utils.0009_auto_20161113_2328... OK (0.255s)\r\nRunning post-migrate handlers for application auth\r\nAdding permission 'auth | permission | Can add permission'\r\nAdding permission 'auth | permission | Can change permission'\r\nAdding permission 'auth | permission | Can delete permission'\r\n[...]\r\ntest_fail_member_no_permission_can_edit_gallery (zds.gallery.tests.tests_views.EditGalleryTestView) ... ok\r\ntest_fail_member_read_permission_can_edit_gallery (zds.gallery.tests.tests_views.EditGalleryTestView) ... ok\r\n[...]\r\ntest_success_new_image_write_permission (zds.gallery.tests.tests_views.NewImageViewTest) ... ok\r\n\r\n----------------------------------------------------------------------\r\nRan 37 tests in 7.920s\r\n\r\nOK\r\nDestroying test database for alias 'default' (':memory:')...\r\n```\r\n\r\n19 secondes pour créer les modèles (je ne sais pas trop ce que c'est\r\net à la rigueur ça m'est égal), c'est super long! Au total le test\r\nprend 51 secondes, dont on dirait seulement 8 secondes en vrai tests\r\net tout le reste en migration de données. J'aimerais pouvoir itérer\r\nsur le code pour comprendre ce qui se passe (genre mettre des print de\r\ndébug à la sale etc.) et lancer le code rapidement, donc le test ne\r\ndevrait pas prendre plus de quelques secondes.\r\n\r\n## Recherche\r\n\r\nEn cherchant sur Google je trouve une discussion reliée sur\r\nStackOverflow:\r\n[Django Unit Testing taking a very long time to create test database](http://stackoverflow.com/questions/36487961/django-unit-testing-taking-a-very-long-time-to-create-test-database)\r\n\r\nIl y a deux réponses qui donnent des recommandations différentes. La\r\npremière conseille d'utiliser `pytest`, alors j'ai fait `pip install\r\npytest` (il me met pytest 3.0.4) et puis\r\n\r\n```\r\nDJANGO_SETTINGS_MODULE=zds.settings_test_local pytest --nomigrations zds/gallery/tests/tests_views.py\r\n```\r\n\r\net là c'est instantané en comparaison: le test tourne en\r\n6 secondes. (Sans l'option `--nomigrations` c'est à nouveau aussi\r\nlent.) D'après la réponse on peut aussi mettre ces options dans un\r\nfichier `pytest.ini` que je serais heureux de contribuer si ça vous\r\nsemblait être une bonne solution.\r\n\r\nLa deuxième solution proposée, qui est de la forme\r\n`MIGRATION_MODULES = DisableMigrations()`, ne marche pas sous ma\r\nmachine: si je rajoute ça dans les settings locaux ça échoue avec\r\nl'erreur suivante:\r\n\r\n```\r\nAttributeError: 'Settings' object has no attribute 'OAUTH2_PROVIDER_APPLICATION_MODEL'\r\n```\r\n\r\n## Et maintenant ?\r\n\r\nEst-ce qu'il y a une autre façon de rendre les tests moins\r\nhorriblement lents qui est moins invasive ? Est-ce que le fait de\r\nfaire tourner des migrations à chaque test local est essentiel ?\r\nSinon, est-ce que j'essaie de proposer une pull-request qui met\r\n`pytest` dans les dépendances et qui configure tout bien et utilise\r\n`pytest --nomigrations` à la place de `python manage.py test` dans les\r\ncibles de test du Makefile?"},"comment":{"url":"https://api.github.com/repos/zestedesavoir/zds-site/issues/comments/264597333","html_url":"https://github.com/zestedesavoir/zds-site/issues/4018#issuecomment-264597333","issue_url":"https://api.github.com/repos/zestedesavoir/zds-site/issues/4018","id":264597333,"user":{"login":"gasche","id":426238,"avatar_url":"https://avatars.githubusercontent.com/u/426238?v=3","gravatar_id":"","url":"https://api.github.com/users/gasche","html_url":"https://github.com/gasche","followers_url":"https://api.github.com/users/gasche/followers","following_url":"https://api.github.com/users/gasche/following{/other_user}","gists_url":"https://api.github.com/users/gasche/gists{/gist_id}","starred_url":"https://api.github.com/users/gasche/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gasche/subscriptions","organizations_url":"https://api.github.com/users/gasche/orgs","repos_url":"https://api.github.com/users/gasche/repos","events_url":"https://api.github.com/users/gasche/events{/privacy}","received_events_url":"https://api.github.com/users/gasche/received_events","type":"User","site_admin":false},"created_at":"2016-12-03T00:18:23Z","updated_at":"2016-12-03T00:18:23Z","body":"En fait j'ai commencé à préparer une pull-request pour `pytest` mais, alors que `pytest .../test_foo.py` marche pour pas mal de test, lancer tous les tests avec `pytest` échoue avant d'arriver aux tests (`--nomigrations` ou non); je ne suis pas allé plus loin pour l'instant."}}
{"actor":{"display_login":"gasche"}}