{"title":"Thématiques de tests avancées","version":"5.1","locale":"fr","docname":"topics/testing/advanced","url":"/fr/5.1/topics/testing/advanced/","canonical":"https://djangodocs.dev/fr/5.1/topics/testing/advanced/","summary":"La fabrique de requêtes Lien vers cette rubrique # class RequestFactory Lien vers cette définition # La classe RequestFactory partage la même API que le client de…","html":"<h1>Thématiques de tests avancées<a class=\"heading-anchor\" href=\"#advanced-testing-topics\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<section id=\"the-request-factory\">\n<h2>La fabrique de requêtes<a class=\"heading-anchor\" href=\"#the-request-factory\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.test.RequestFactory\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">RequestFactory</span></span><a class=\"heading-anchor\" href=\"#django.test.RequestFactory\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>La classe <a class=\"reference internal\" href=\"#django.test.RequestFactory\" title=\"django.test.RequestFactory\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RequestFactory</span></code></a> partage la même API que le client de test. Cependant, au lieu de se comporter comme un navigateur, <code class=\"docutils literal notranslate\"><span class=\"pre\">RequestFactory</span></code> offre une manière de générer une instance de requête pouvant être utilisée comme premier paramètre de n’importe quelle vue. Cela permet de tester une fonction de vue de la même façon que vous testeriez toute autre fonction, comme une boîte noire, avec des données connues en entrée et en testant un résultat spécifique.</p>\n<p>L’API de <a class=\"reference internal\" href=\"#django.test.RequestFactory\" title=\"django.test.RequestFactory\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RequestFactory</span></code></a> est un tout petit peu plus restreinte que celle du client de test :</p>\n<ul class=\"simple\">\n<li><p>Elle ne donne accès qu’aux méthodes HTTP <a class=\"reference internal\" href=\"/fr/5.1/topics/testing/tools/#django.test.Client.get\" title=\"django.test.Client.get\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get()</span></code></a>, <a class=\"reference internal\" href=\"/fr/5.1/topics/testing/tools/#django.test.Client.post\" title=\"django.test.Client.post\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">post()</span></code></a>, <a class=\"reference internal\" href=\"/fr/5.1/topics/testing/tools/#django.test.Client.put\" title=\"django.test.Client.put\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">put()</span></code></a>, <a class=\"reference internal\" href=\"/fr/5.1/topics/testing/tools/#django.test.Client.delete\" title=\"django.test.Client.delete\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">delete()</span></code></a>, <a class=\"reference internal\" href=\"/fr/5.1/topics/testing/tools/#django.test.Client.head\" title=\"django.test.Client.head\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">head()</span></code></a>, <a class=\"reference internal\" href=\"/fr/5.1/topics/testing/tools/#django.test.Client.options\" title=\"django.test.Client.options\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">options()</span></code></a> et <a class=\"reference internal\" href=\"/fr/5.1/topics/testing/tools/#django.test.Client.trace\" title=\"django.test.Client.trace\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">trace()</span></code></a>.</p></li>\n<li><p>Toutes ces méthodes acceptent les mêmes paramètres, <em>à l’exception</em> de <code class=\"docutils literal notranslate\"><span class=\"pre\">follow</span></code>. Comme il ne s’agit que d’une fabrique produisant des requêtes, le traitement de la réponse est de votre responsabilité.</p></li>\n<li><p>Elle ne gère pas les intergiciels. Les attributs de session et d’authentification doivent être fournis par le test lui-même, si nécessaire, pour que la vue fonctionne correctement.</p></li>\n</ul>\n<aside class=\"version-note version-changed\" data-version=\"5.1\">\n<p class=\"version-note-title\">Changed in Django 5.1</p><p>Le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">query_params</span></code> a été ajouté.</p>\n</aside>\n<section id=\"example\">\n<h3>Exemple<a class=\"heading-anchor\" href=\"#example\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>L’exemple suivant est un test unitaire utilisant la fabrique de requêtes :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">AnonymousUser</span><span class=\"p\">,</span> <span class=\"n\">User</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.test</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">RequestFactory</span><span class=\"p\">,</span> <span class=\"n\">TestCase</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.views</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">MyView</span><span class=\"p\">,</span> <span class=\"n\">my_view</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">SimpleTest</span><span class=\"p\">(</span><span class=\"n\">TestCase</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">setUp</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"c1\"># Every test needs access to the request factory.</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">factory</span> <span class=\"o\">=</span> <span class=\"n\">RequestFactory</span><span class=\"p\">()</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">user</span> <span class=\"o\">=</span> <span class=\"n\">User</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create_user</span><span class=\"p\">(</span>\n            <span class=\"n\">username</span><span class=\"o\">=</span><span class=\"s2\">&quot;jacob&quot;</span><span class=\"p\">,</span> <span class=\"n\">email</span><span class=\"o\">=</span><span class=\"s2\">&quot;jacob@…&quot;</span><span class=\"p\">,</span> <span class=\"n\">password</span><span class=\"o\">=</span><span class=\"s2\">&quot;top_secret&quot;</span>\n        <span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">test_details</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"c1\"># Create an instance of a GET request.</span>\n        <span class=\"n\">request</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">factory</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;/customer/details&quot;</span><span class=\"p\">)</span>\n\n        <span class=\"c1\"># Recall that middleware are not supported. You can simulate a</span>\n        <span class=\"c1\"># logged-in user by setting request.user manually.</span>\n        <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">user</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">user</span>\n\n        <span class=\"c1\"># Or you can simulate an anonymous user by setting request.user to</span>\n        <span class=\"c1\"># an AnonymousUser instance.</span>\n        <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">user</span> <span class=\"o\">=</span> <span class=\"n\">AnonymousUser</span><span class=\"p\">()</span>\n\n        <span class=\"c1\"># Test my_view() as if it were deployed at /customer/details</span>\n        <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"n\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">)</span>\n        <span class=\"c1\"># Use this syntax for class-based views.</span>\n        <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"n\">MyView</span><span class=\"o\">.</span><span class=\"n\">as_view</span><span class=\"p\">()(</span><span class=\"n\">request</span><span class=\"p\">)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assertEqual</span><span class=\"p\">(</span><span class=\"n\">response</span><span class=\"o\">.</span><span class=\"n\">status_code</span><span class=\"p\">,</span> <span class=\"mi\">200</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"asyncrequestfactory\">\n<h3>AsyncRequestFactory<a class=\"heading-anchor\" href=\"#asyncrequestfactory\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.test.AsyncRequestFactory\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">AsyncRequestFactory</span></span><a class=\"heading-anchor\" href=\"#django.test.AsyncRequestFactory\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">RequestFactory</span></code> crée des requêtes de type WSGI. Si vous souhaitez créer des requêtes de type ASGI, ayant aussi une portée <code class=\"docutils literal notranslate\"><span class=\"pre\">scope</span></code> ASGI correcte, vous pouvez utiliser <code class=\"docutils literal notranslate\"><span class=\"pre\">django.test.AsyncRequestFactory</span></code> à la place.</p>\n<p>L’API de cette classe est directement compatible avec <code class=\"docutils literal notranslate\"><span class=\"pre\">RequestFactory</span></code>, avec comme seule différence le renvoi d’instances <code class=\"docutils literal notranslate\"><span class=\"pre\">ASGIRequest</span></code> au lieu de <code class=\"docutils literal notranslate\"><span class=\"pre\">WSGIRequest</span></code>. Toutes ses méthodes restent des exécutables synchrones.</p>\n<p>Les paramètres mot-clé arbitraires dans <code class=\"docutils literal notranslate\"><span class=\"pre\">defaults</span></code> sont ajoutés directement dans la portée ASGI.</p>\n<aside class=\"version-note version-changed\" data-version=\"5.1\">\n<p class=\"version-note-title\">Changed in Django 5.1</p><p>Le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">query_params</span></code> a été ajouté.</p>\n</aside>\n</section>\n</section>\n<section id=\"testing-class-based-views\">\n<h2>Test des vues fondées sur les classes<a class=\"heading-anchor\" href=\"#testing-class-based-views\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Afin de tester les vues fondées sur des classes en dehors du cycle requête/réponse, vous devez vous assurer qu’elles sont configurées correctement en appelant <a class=\"reference internal\" href=\"/fr/5.1/ref/class-based-views/base/#django.views.generic.base.View.setup\" title=\"django.views.generic.base.View.setup\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">setup()</span></code></a> après leur instanciation.</p>\n<p>Par exemple, en partant de la vue classe suivante :</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">views.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.generic</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">TemplateView</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">HomeView</span><span class=\"p\">(</span><span class=\"n\">TemplateView</span><span class=\"p\">):</span>\n    <span class=\"n\">template_name</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;myapp/home.html&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">get_context_data</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"n\">kwargs</span><span class=\"p\">[</span><span class=\"s2\">&quot;environment&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;Production&quot;</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">get_context_data</span><span class=\"p\">(</span><span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">)</span>\n</code></pre></figure>\n<p>Vous pouvez directement tester la méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">get_context_data()</span></code> en commençant par créer une instance de la vue, puis en passant une requête à <code class=\"docutils literal notranslate\"><span class=\"pre\">setup()</span></code> avant de procéder au test du code :</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">tests.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.test</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">RequestFactory</span><span class=\"p\">,</span> <span class=\"n\">TestCase</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.views</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HomeView</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">HomePageTest</span><span class=\"p\">(</span><span class=\"n\">TestCase</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">test_environment_set_in_context</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"n\">request</span> <span class=\"o\">=</span> <span class=\"n\">RequestFactory</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;/&quot;</span><span class=\"p\">)</span>\n        <span class=\"n\">view</span> <span class=\"o\">=</span> <span class=\"n\">HomeView</span><span class=\"p\">()</span>\n        <span class=\"n\">view</span><span class=\"o\">.</span><span class=\"n\">setup</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">)</span>\n\n        <span class=\"n\">context</span> <span class=\"o\">=</span> <span class=\"n\">view</span><span class=\"o\">.</span><span class=\"n\">get_context_data</span><span class=\"p\">()</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assertIn</span><span class=\"p\">(</span><span class=\"s2\">&quot;environment&quot;</span><span class=\"p\">,</span> <span class=\"n\">context</span><span class=\"p\">)</span>\n</code></pre></figure>\n</section>\n<section id=\"tests-and-multiple-host-names\">\n<span id=\"topics-testing-advanced-multiple-hosts\"></span><h2>Tests avec plusieurs noms d’hôtes<a class=\"heading-anchor\" href=\"#tests-and-multiple-host-names\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Le réglage <a class=\"reference internal\" href=\"/fr/5.1/ref/settings/#std-setting-ALLOWED_HOSTS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">ALLOWED_HOSTS</span></code></a> est validé lors de l’exécution des tests. Cela permet au client de test de faire la différence entre les URL internes et externes.</p>\n<p>Les projets qui gèrent plusieurs domaines par site ou adaptent leur comportement en fonction de l’hôte de la requête et qui utilisent des noms d’hôte particuliers dans les tests doivent inclure ces noms d’hôte dans <a class=\"reference internal\" href=\"/fr/5.1/ref/settings/#std-setting-ALLOWED_HOSTS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">ALLOWED_HOSTS</span></code></a>.</p>\n<p>La première option pour accomplir cela est d’ajouter les hôtes dans le fichier des réglages. Par exemple, la suite de tests de docs.djangoproject.com contient ceci :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.test</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">TestCase</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">SearchFormTestCase</span><span class=\"p\">(</span><span class=\"n\">TestCase</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">test_empty_get</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">client</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span>\n            <span class=\"s2\">&quot;/en/dev/search/&quot;</span><span class=\"p\">,</span>\n            <span class=\"n\">headers</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s2\">&quot;host&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;docs.djangoproject.dev:8000&quot;</span><span class=\"p\">},</span>\n        <span class=\"p\">)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assertEqual</span><span class=\"p\">(</span><span class=\"n\">response</span><span class=\"o\">.</span><span class=\"n\">status_code</span><span class=\"p\">,</span> <span class=\"mi\">200</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>et le fichier des réglages contient une liste des domaines pris en charge par le projet :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">ALLOWED_HOSTS</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;www.djangoproject.dev&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;docs.djangoproject.dev&quot;</span><span class=\"p\">,</span> <span class=\"o\">...</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>Une autre option est d’ajouter les hôtes nécessaires dans <a class=\"reference internal\" href=\"/fr/5.1/ref/settings/#std-setting-ALLOWED_HOSTS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">ALLOWED_HOSTS</span></code></a> en utilisant <a class=\"reference internal\" href=\"/fr/5.1/topics/testing/tools/#django.test.override_settings\" title=\"django.test.override_settings\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">override_settings()</span></code></a> ou <a class=\"reference internal\" href=\"/fr/5.1/topics/testing/tools/#django.test.SimpleTestCase.modify_settings\" title=\"django.test.SimpleTestCase.modify_settings\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">modify_settings()</span></code></a>. Cette option peut être préférable pour les applications autonomes qui ne peuvent pas fournir leur propre fichier de réglages ou pour les projets dont la liste des domaines n’est pas figée (par ex. des sous-domaines dans un service partagé). Par exemple, il serait possible d’écrire un test pour le domaine <code class=\"docutils literal notranslate\"><span class=\"pre\">http://otherserver/</span></code> comme ceci :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.test</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">TestCase</span><span class=\"p\">,</span> <span class=\"n\">override_settings</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MultiDomainTestCase</span><span class=\"p\">(</span><span class=\"n\">TestCase</span><span class=\"p\">):</span>\n    <span class=\"nd\">@override_settings</span><span class=\"p\">(</span><span class=\"n\">ALLOWED_HOSTS</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;otherserver&quot;</span><span class=\"p\">])</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">test_other_domain</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"n\">response</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">client</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s2\">&quot;http://otherserver/foo/bar/&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>La désactivation du contrôle de <a class=\"reference internal\" href=\"/fr/5.1/ref/settings/#std-setting-ALLOWED_HOSTS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">ALLOWED_HOSTS</span></code></a> (<code class=\"docutils literal notranslate\"><span class=\"pre\">ALLOWED_HOSTS</span> <span class=\"pre\">=</span> <span class=\"pre\">['*']</span></code>) lors de l’exécution des tests empêche le client de test de produire un message d’erreur instructif si une redirection est appelée pour une URL externe.</p>\n</section>\n<section id=\"tests-and-multiple-databases\">\n<span id=\"topics-testing-advanced-multidb\"></span><h2>Tests avec plusieurs base de données<a class=\"heading-anchor\" href=\"#tests-and-multiple-databases\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"testing-primary-replica-configurations\">\n<span id=\"topics-testing-primaryreplica\"></span><h3>Test des configurations primaire/réplique<a class=\"heading-anchor\" href=\"#testing-primary-replica-configurations\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Si vous testez une configuration avec plusieurs bases de données impliquant une réplication primaire/réplique (désignée comme maître/esclave par certaines bases de données), cette stratégie de création de bases de données de test pose un problème. Lorsque les bases de données de test sont créées, la réplication n’a pas lieu et par conséquent, les données créées sur la base primaire ne seront pas visibles sur les répliques.</p>\n<p>Pour contourner ce problème, Django permet de définir une base de données comme un <em>miroir de test</em>. Considérez cet exemple (simplifié) de configuration de bases de données :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">DATABASES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;ENGINE&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.db.backends.mysql&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;NAME&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;myproject&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;HOST&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;dbprimary&quot;</span><span class=\"p\">,</span>\n        <span class=\"c1\"># ... plus some other settings</span>\n    <span class=\"p\">},</span>\n    <span class=\"s2\">&quot;replica&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;ENGINE&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.db.backends.mysql&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;NAME&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;myproject&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;HOST&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;dbreplica&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;TEST&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;MIRROR&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n        <span class=\"c1\"># ... plus some other settings</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>Dans cette configuration figurent deux serveurs de base de données : <code class=\"docutils literal notranslate\"><span class=\"pre\">dbprimary</span></code>, défini par l’alias de base de données <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">dbreplica</span></code>, défini par l’alias <code class=\"docutils literal notranslate\"><span class=\"pre\">replica</span></code>. Comme l’on peut s’y attendre, <code class=\"docutils literal notranslate\"><span class=\"pre\">dbreplica</span></code> a été configuré par l’administrateur de base de données comme réplique en lecture de <code class=\"docutils literal notranslate\"><span class=\"pre\">dbprimary</span></code>. En temps normal, toute écriture sur <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> apparaît aussi sur <code class=\"docutils literal notranslate\"><span class=\"pre\">replica</span></code>.</p>\n<p>Si Django avait créé deux bases de données de test indépendantes, cela casserait d’éventuels tests s’attendant à de la réplication. Cependant, la base de données <code class=\"docutils literal notranslate\"><span class=\"pre\">replica</span></code> a été configurée comme miroir de test (via le réglage de test <a class=\"reference internal\" href=\"/fr/5.1/ref/settings/#std-setting-TEST_MIRROR\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIRROR</span></code></a>), indiquant par là que lors des tests, <code class=\"docutils literal notranslate\"><span class=\"pre\">replica</span></code> doit être traité comme un miroir de <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code>.</p>\n<p>Au moment de la création de l’environnement de test, <em>aucune</em> base ne sera créée pour <code class=\"docutils literal notranslate\"><span class=\"pre\">replica</span></code>. Par contre, la connexion vers <code class=\"docutils literal notranslate\"><span class=\"pre\">replica</span></code> sera redirigée pour pointer vers <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code>. Par conséquent, les écritures sur <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> apparaîtront aussi sur <code class=\"docutils literal notranslate\"><span class=\"pre\">replica</span></code>, mais parce qu’il s’agit en réalité de la même base de données, car aucune réplication de données ne sera mise en place entre les deux bases de données. Comme cela dépend des transactions, les tests doivent utiliser <a class=\"reference internal\" href=\"/fr/5.1/topics/testing/tools/#django.test.TransactionTestCase\" title=\"django.test.TransactionTestCase\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TransactionTestCase</span></code></a> au lieu de <a class=\"reference internal\" href=\"/fr/5.1/topics/testing/tools/#django.test.TestCase\" title=\"django.test.TestCase\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TestCase</span></code></a>.</p>\n</section>\n<section id=\"controlling-creation-order-for-test-databases\">\n<span id=\"topics-testing-creation-dependencies\"></span><h3>Ordre de création des bases de données de test<a class=\"heading-anchor\" href=\"#controlling-creation-order-for-test-databases\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Par défaut, Django part du principe que toutes les bases de données dépendent de la base de données <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> et va par conséquent toujours créer celle-ci en premier. Cependant, pour toute autre base de données de votre configuration de test, il n’y a aucune garantie sur l’ordre de création des bases de données.</p>\n<p>Si votre configuration de base de données nécessite un ordre de création bien défini, vous pouvez indiquer les dépendances entre bases de données dans le réglage de test <a class=\"reference internal\" href=\"/fr/5.1/ref/settings/#std-setting-TEST_DEPENDENCIES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEPENDENCIES</span></code></a>. Considérez cet exemple (simplifié) de configuration de bases de données :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">DATABASES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"c1\"># ... db settings</span>\n        <span class=\"s2\">&quot;TEST&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;DEPENDENCIES&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;diamonds&quot;</span><span class=\"p\">],</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n    <span class=\"s2\">&quot;diamonds&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"c1\"># ... db settings</span>\n        <span class=\"s2\">&quot;TEST&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;DEPENDENCIES&quot;</span><span class=\"p\">:</span> <span class=\"p\">[],</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n    <span class=\"s2\">&quot;clubs&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"c1\"># ... db settings</span>\n        <span class=\"s2\">&quot;TEST&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;DEPENDENCIES&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;diamonds&quot;</span><span class=\"p\">],</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n    <span class=\"s2\">&quot;spades&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"c1\"># ... db settings</span>\n        <span class=\"s2\">&quot;TEST&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;DEPENDENCIES&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;diamonds&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;hearts&quot;</span><span class=\"p\">],</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n    <span class=\"s2\">&quot;hearts&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"c1\"># ... db settings</span>\n        <span class=\"s2\">&quot;TEST&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;DEPENDENCIES&quot;</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"s2\">&quot;diamonds&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;clubs&quot;</span><span class=\"p\">],</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>Avec cette configuration, la base de données <code class=\"docutils literal notranslate\"><span class=\"pre\">diamonds</span></code> sera créée en premier car c’est le seul alias de base de données sans dépendances. Les alias <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">clubs</span></code> seront ensuite créés (bien que l’ordre de création de ceux-ci ne soit pas défini), puis <code class=\"docutils literal notranslate\"><span class=\"pre\">hearts</span></code> et enfin, <code class=\"docutils literal notranslate\"><span class=\"pre\">spades</span></code>.</p>\n<p>Si la définition de <a class=\"reference internal\" href=\"/fr/5.1/ref/settings/#std-setting-TEST_DEPENDENCIES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEPENDENCIES</span></code></a> comporte des dépendances circulaires, une exception <a class=\"reference internal\" href=\"/fr/5.1/ref/exceptions/#django.core.exceptions.ImproperlyConfigured\" title=\"django.core.exceptions.ImproperlyConfigured\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">ImproperlyConfigured</span></code></a> sera générée.</p>\n</section>\n</section>\n<section id=\"advanced-features-of-transactiontestcase\">\n<h2>Fonctionnalités avancées de <code class=\"docutils literal notranslate\"><span class=\"pre\">TransactionTestCase</span></code><a class=\"heading-anchor\" href=\"#advanced-features-of-transactiontestcase\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.test.TransactionTestCase.available_apps\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">TransactionTestCase.</span></span><span class=\"sig-name descname\"><span class=\"pre\">available_apps</span></span><a class=\"heading-anchor\" href=\"#django.test.TransactionTestCase.available_apps\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p>Cet attribut est une API privée. Il peut être modifié ou supprimé dans une version future sans période d’obsolescence, par exemple pour s’adapter à des modifications du processus de chargement des applications.</p>\n<p>Il est utilisé pour optimiser la suite de tests de Django lui-même qui contient des centaines de modèles mais sans relations entre les modèles des différentes applications de test.</p>\n</aside>\n<p>Par défaut, <code class=\"docutils literal notranslate\"><span class=\"pre\">available_apps</span></code> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>. Après chaque test, Django appelle <a class=\"reference internal\" href=\"/fr/5.1/ref/django-admin/#django-admin-flush\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">flush</span></code></a> pour réinitialiser l’état de la base de données. Toutes les tables sont ainsi vidées et le signal <a class=\"reference internal\" href=\"/fr/5.1/ref/signals/#django.db.models.signals.post_migrate\" title=\"django.db.models.signals.post_migrate\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">post_migrate</span></code></a> est émis, ce qui recrée un type de contenu et quatre permissions pour chaque modèle. Cette opération s’alourdit proportionnellement au nombre de modèles.</p>\n<p>En définissant <code class=\"docutils literal notranslate\"><span class=\"pre\">available_apps</span></code> à une liste d’applications, Django se comporte comme si seuls les modèles de ces applications étaient disponibles. Le comportement de <code class=\"docutils literal notranslate\"><span class=\"pre\">TransactionTestCase</span></code> est modifié comme suit :</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/fr/5.1/ref/signals/#django.db.models.signals.post_migrate\" title=\"django.db.models.signals.post_migrate\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">post_migrate</span></code></a> est émis avant chaque test pour créer les types de contenu et les permissions de chaque modèle des applications disponibles, dans le cas où ils manqueraient.</p></li>\n<li><p>Après chaque test, Django ne vide que les tables correspondants aux modèles des applications disponibles. Cependant, au niveau de la base de données, il est possible que les troncatures s’appliquent en cascade à des modèles liés dans des applications non disponibles. De plus, <a class=\"reference internal\" href=\"/fr/5.1/ref/signals/#django.db.models.signals.post_migrate\" title=\"django.db.models.signals.post_migrate\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">post_migrate</span></code></a> n’est pas émis ; il sera émis par le prochain test  <code class=\"docutils literal notranslate\"><span class=\"pre\">TransactionTestCase</span></code>, après que l’ensemble d’applications adéquat a été sélectionné.</p></li>\n</ul>\n<p>Comme la base de données n’est pas complètement vidée, si un test crée des instances de modèles non inclus dans <code class=\"docutils literal notranslate\"><span class=\"pre\">available_apps</span></code>, ces instances vont rester et pourraient être la cause d’échecs de tests non liés. Restez prudent avec les tests employant des sessions ; le moteur de sessions par défaut les stocke dans la base de données.</p>\n<p>Comme <a class=\"reference internal\" href=\"/fr/5.1/ref/signals/#django.db.models.signals.post_migrate\" title=\"django.db.models.signals.post_migrate\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">post_migrate</span></code></a> n’est pas émis après la réinitialisation de la base de données, son état après un <code class=\"docutils literal notranslate\"><span class=\"pre\">TransactionTestCase</span></code> n’est pas le même qu’après un <code class=\"docutils literal notranslate\"><span class=\"pre\">TestCase</span></code>: les lignes créées par les récepteurs de <a class=\"reference internal\" href=\"/fr/5.1/ref/signals/#django.db.models.signals.post_migrate\" title=\"django.db.models.signals.post_migrate\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">post_migrate</span></code></a> sont manquantes. Mais sachant <a class=\"reference internal\" href=\"/fr/5.1/topics/testing/overview/#order-of-tests\"><span class=\"std std-ref\">l’ordre dans lequel les tests sont exécutés</span></a>, ce n’est pas un problème, dans la mesure où soit tous les tests <code class=\"docutils literal notranslate\"><span class=\"pre\">TransactionTestCase</span></code> d’une suite de tests déclarent <code class=\"docutils literal notranslate\"><span class=\"pre\">available_apps</span></code>, soit aucun.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">available_apps</span></code> est obligatoire dans la propre suite de tests de Django.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.test.TransactionTestCase.reset_sequences\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">TransactionTestCase.</span></span><span class=\"sig-name descname\"><span class=\"pre\">reset_sequences</span></span><a class=\"heading-anchor\" href=\"#django.test.TransactionTestCase.reset_sequences\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>En définissant <code class=\"docutils literal notranslate\"><span class=\"pre\">reset_sequences</span> <span class=\"pre\">=</span> <span class=\"pre\">True</span></code> d’une classe <code class=\"docutils literal notranslate\"><span class=\"pre\">TransactionTestCase</span></code>, vous vous assurez que les séquences sont toujours réinitialisées avant le lancement du test :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">TestsThatDependsOnPrimaryKeySequences</span><span class=\"p\">(</span><span class=\"n\">TransactionTestCase</span><span class=\"p\">):</span>\n    <span class=\"n\">reset_sequences</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">test_animal_pk</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"n\">lion</span> <span class=\"o\">=</span> <span class=\"n\">Animal</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;lion&quot;</span><span class=\"p\">,</span> <span class=\"n\">sound</span><span class=\"o\">=</span><span class=\"s2\">&quot;roar&quot;</span><span class=\"p\">)</span>\n        <span class=\"c1\"># lion.pk is guaranteed to always be 1</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assertEqual</span><span class=\"p\">(</span><span class=\"n\">lion</span><span class=\"o\">.</span><span class=\"n\">pk</span><span class=\"p\">,</span> <span class=\"mi\">1</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>À l’exception des cas où vous testez explicitement les numéros de séquence de clés primaires, il est recommandé de ne pas tester des valeurs de clés primaires figées.</p>\n<p>L’utilisation de <code class=\"docutils literal notranslate\"><span class=\"pre\">reset_sequences</span> <span class=\"pre\">=</span> <span class=\"pre\">True</span></code> ralentit les tests, car la réinitialisation des clés primaires est une opération de base de données relativement coûteuse.</p>\n</dd></dl>\n\n</section>\n<section id=\"enforce-running-test-classes-sequentially\">\n<span id=\"topics-testing-enforce-run-sequentially\"></span><h2>Exécution séquentielle forcée des classes de tests<a class=\"heading-anchor\" href=\"#enforce-running-test-classes-sequentially\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Si vous avez des classes de tests qui ne peuvent pas fonctionner en parallèle (par exemple si elles partagent une ressource commune), vous pouvez utiliser <code class=\"docutils literal notranslate\"><span class=\"pre\">django.test.testcases.SerializeMixin</span></code> pour les exécuter de manière séquentielle. Cette classe mixin utilise un fichier verrou <code class=\"docutils literal notranslate\"><span class=\"pre\">lockfile</span></code> du système de fichiers.</p>\n<p>Par exemple, vous pouvez utiliser <code class=\"docutils literal notranslate\"><span class=\"pre\">__file__</span></code> pour déterminer que toutes les classes de tests du même fichier héritant de <code class=\"docutils literal notranslate\"><span class=\"pre\">SerializeMixin</span></code> seront exécutées les unes à la suite des autres</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">os</span>\n\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.test</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">TestCase</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.test.testcases</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">SerializeMixin</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ImageTestCaseMixin</span><span class=\"p\">(</span><span class=\"n\">SerializeMixin</span><span class=\"p\">):</span>\n    <span class=\"n\">lockfile</span> <span class=\"o\">=</span> <span class=\"vm\">__file__</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">setUp</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">filename</span> <span class=\"o\">=</span> <span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">path</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"n\">temp_storage_dir</span><span class=\"p\">,</span> <span class=\"s2\">&quot;my_file.png&quot;</span><span class=\"p\">)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">file</span> <span class=\"o\">=</span> <span class=\"n\">create_file</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">filename</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">RemoveImageTests</span><span class=\"p\">(</span><span class=\"n\">ImageTestCaseMixin</span><span class=\"p\">,</span> <span class=\"n\">TestCase</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">test_remove_image</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">remove</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">filename</span><span class=\"p\">)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assertFalse</span><span class=\"p\">(</span><span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">path</span><span class=\"o\">.</span><span class=\"n\">exists</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">filename</span><span class=\"p\">))</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ResizeImageTests</span><span class=\"p\">(</span><span class=\"n\">ImageTestCaseMixin</span><span class=\"p\">,</span> <span class=\"n\">TestCase</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">test_resize_image</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"n\">resize_image</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">file</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"mi\">48</span><span class=\"p\">,</span> <span class=\"mi\">48</span><span class=\"p\">))</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">assertEqual</span><span class=\"p\">(</span><span class=\"n\">get_image_size</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">file</span><span class=\"p\">),</span> <span class=\"p\">(</span><span class=\"mi\">48</span><span class=\"p\">,</span> <span class=\"mi\">48</span><span class=\"p\">))</span>\n</code></pre></div>\n</section>\n<section id=\"using-the-django-test-runner-to-test-reusable-applications\">\n<span id=\"testing-reusable-applications\"></span><h2>Utilisation du lanceur de tests de Django pour tester des applications réutilisables<a class=\"heading-anchor\" href=\"#using-the-django-test-runner-to-test-reusable-applications\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Si vous écrivez une <a class=\"reference internal\" href=\"/fr/5.1/intro/reusable-apps/\"><span class=\"doc\">application réutilisable</span></a>, il peut être intéressant d’utiliser le lanceur de tests de Django pour lancer votre propre suite de tests et bénéficier ainsi de l’infrastructure de tests de Django.</p>\n<p>Une pratique courante est de placer un répertoire <em>tests</em> en parallèle de votre code d’application, avec la structure suivante :</p>\n<div class=\"code-block\" data-language=\"text\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Text code\"><code>runtests.py\npolls/\n    __init__.py\n    models.py\n    ...\ntests/\n    __init__.py\n    models.py\n    test_settings.py\n    tests.py\n</code></pre></div>\n<p>Examinons ce qui se trouve dans certains de ces fichiers :</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">runtests.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"ch\">#!/usr/bin/env python</span>\n<span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">os</span>\n<span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">sys</span>\n\n<span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">django</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.conf</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">settings</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.test.utils</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">get_runner</span>\n\n<span class=\"k\">if</span> <span class=\"vm\">__name__</span> <span class=\"o\">==</span> <span class=\"s2\">&quot;__main__&quot;</span><span class=\"p\">:</span>\n    <span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">environ</span><span class=\"p\">[</span><span class=\"s2\">&quot;DJANGO_SETTINGS_MODULE&quot;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;tests.test_settings&quot;</span>\n    <span class=\"n\">django</span><span class=\"o\">.</span><span class=\"n\">setup</span><span class=\"p\">()</span>\n    <span class=\"n\">TestRunner</span> <span class=\"o\">=</span> <span class=\"n\">get_runner</span><span class=\"p\">(</span><span class=\"n\">settings</span><span class=\"p\">)</span>\n    <span class=\"n\">test_runner</span> <span class=\"o\">=</span> <span class=\"n\">TestRunner</span><span class=\"p\">()</span>\n    <span class=\"n\">failures</span> <span class=\"o\">=</span> <span class=\"n\">test_runner</span><span class=\"o\">.</span><span class=\"n\">run_tests</span><span class=\"p\">([</span><span class=\"s2\">&quot;tests&quot;</span><span class=\"p\">])</span>\n    <span class=\"n\">sys</span><span class=\"o\">.</span><span class=\"n\">exit</span><span class=\"p\">(</span><span class=\"nb\">bool</span><span class=\"p\">(</span><span class=\"n\">failures</span><span class=\"p\">))</span>\n</code></pre></figure>\n<p>Il s’agit ici du script invoqué pour lancer la suite de tests. Il met en place l’environnement Django, crée la base de données de tests et lance les tests.</p>\n<p>Par souci de clarté, cet exemple ne contient que le strict minimum nécessaire à l’utilisation du lanceur de tests de Django. On peut cependant imaginer ajouter des options en ligne de commande pour le contrôle de la verbosité, pour passer des étiquettes de tests spécifiques à lancer, etc.</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">tests/test_settings.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"n\">SECRET_KEY</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;fake-key&quot;</span>\n<span class=\"n\">INSTALLED_APPS</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"s2\">&quot;tests&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n</code></pre></figure>\n<p>Ce fichier contient les <a class=\"reference internal\" href=\"/fr/5.1/topics/settings/\"><span class=\"doc\">réglages Django</span></a> indispensables pour lancer les tests de votre application.</p>\n<p>Encore une fois, il s’agit d’un exemple minimal ; les tests peuvent exiger des réglages supplémentaires pour fonctionner.</p>\n<p>Comme le paquet <em>tests</em> est inclus dans <a class=\"reference internal\" href=\"/fr/5.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> au moment de lancer les tests, il est possible de définir des modèles uniquement pour les tests dans le fichier <code class=\"docutils literal notranslate\"><span class=\"pre\">models.py</span></code>.</p>\n</section>\n<section id=\"using-different-testing-frameworks\">\n<span id=\"other-testing-frameworks\"></span><h2>Utilisation d’autres infrastructures de test<a class=\"heading-anchor\" href=\"#using-different-testing-frameworks\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Il est clair que <a class=\"reference external\" href=\"https://docs.python.org/3/library/unittest.html#module-unittest\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">unittest</span></code></a> n’est pas la seule infrastructure de test de Python. Même si Django ne fournit pas de prise en charge explicite d’autres systèmes de test, il offre une manière d’invoquer des tests construits pour un autre système comme s’il s’agissait de tests Django normaux.</p>\n<p>Lorsque vous lancez <code class=\"docutils literal notranslate\"><span class=\"pre\">./manage.py</span> <span class=\"pre\">test</span></code>, Django consulte le réglage <a class=\"reference internal\" href=\"/fr/5.1/ref/settings/#std-setting-TEST_RUNNER\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TEST_RUNNER</span></code></a> pour déterminer ce qu’il doit faire. Par défaut, <a class=\"reference internal\" href=\"/fr/5.1/ref/settings/#std-setting-TEST_RUNNER\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TEST_RUNNER</span></code></a> contient <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.test.runner.DiscoverRunner'</span></code>. Cette classe définit le comportement de test par défaut de Django. Ce comportement implique :</p>\n<ol class=\"arabic simple\">\n<li><p>Une préparation générale avant les tests.</p></li>\n<li><p>La recherche de tests dans tout fichier au-dessous du répertoire actuel dont le nom correspond au motif <code class=\"docutils literal notranslate\"><span class=\"pre\">test*.py</span></code>.</p></li>\n<li><p>La création des bases de données de test.</p></li>\n<li><p>Le lancement de <code class=\"docutils literal notranslate\"><span class=\"pre\">migrate</span></code> pour installer les modèles et les données initiales dans les bases de données de test.</p></li>\n<li><p>L’exécution des <a class=\"reference internal\" href=\"/fr/5.1/topics/checks/\"><span class=\"doc\">vérifications systèmes</span></a>.</p></li>\n<li><p>L’exécution des tests découverts.</p></li>\n<li><p>La suppression des bases de données de test.</p></li>\n<li><p>Une finalisation générale après les tests.</p></li>\n</ol>\n<p>Si vous définissez votre propre classe de lanceur de tests et que vous indiquez cette classe dans <a class=\"reference internal\" href=\"/fr/5.1/ref/settings/#std-setting-TEST_RUNNER\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TEST_RUNNER</span></code></a>, Django se servira de votre lanceur de tests lors de chaque appel à <code class=\"docutils literal notranslate\"><span class=\"pre\">./manage.py</span> <span class=\"pre\">test</span></code>. De cette façon, il est possible d’utiliser n’importe quel système de test pouvant être lancé à partir de code Python ou de modifier le processus d’exécution des tests Django pour adapter les tests à d’éventuels besoins spécifiques.</p>\n<section id=\"defining-a-test-runner\">\n<span id=\"topics-testing-test-runner\"></span><h3>Définition d’un lanceur de tests<a class=\"heading-anchor\" href=\"#defining-a-test-runner\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Un lanceur de tests est une classe définissant une méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">run_tests()</span></code>. Django fournit une classe <code class=\"docutils literal notranslate\"><span class=\"pre\">DiscoverRunner</span></code> définissant le comportement de test par défaut de Django. Cette classe définit le point d’entrée <code class=\"docutils literal notranslate\"><span class=\"pre\">run_tests()</span></code> ainsi qu’une sélection d’autres méthodes utilisées par <code class=\"docutils literal notranslate\"><span class=\"pre\">run_tests()</span></code> pour préparer, exécuter et clore la suite de tests.</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.test.runner.DiscoverRunner\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">DiscoverRunner</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">pattern</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">'test*.py'</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">top_level</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">verbosity</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">1</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">interactive</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">True</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">failfast</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">keepdb</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">reverse</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">debug_mode</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">debug_sql</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">parallel</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">0</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">tags</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">exclude_tags</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">test_name_patterns</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">pdb</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">buffer</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">enable_faulthandler</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">True</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">timing</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">True</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">shuffle</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">logger</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">durations</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.test.runner.DiscoverRunner\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\"><span class=\"pre\">DiscoverRunner</span></code> recherche des tests dans tout fichier correspondant au motif <code class=\"docutils literal notranslate\"><span class=\"pre\">pattern</span></code>.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">top_level</span></code> peut être utilisé pour indiquer le répertoire contenant les modules Python de premier niveau. Django peut généralement le découvrir automatiquement, ce qui fait que cette option n’est pas absolument nécessaire. Lorsqu’elle est définie, elle devrait en principe correspondre au répertoire contenant le fichier <code class=\"docutils literal notranslate\"><span class=\"pre\">manage.py</span></code>.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">verbosity</span></code> détermine la quantité de notifications et d’informations de débogage qui s’afficheront sur la console ; <code class=\"docutils literal notranslate\"><span class=\"pre\">0</span></code> n’affiche rien, <code class=\"docutils literal notranslate\"><span class=\"pre\">1</span></code> correspond à l’affichage normal et <code class=\"docutils literal notranslate\"><span class=\"pre\">2</span></code> à l’affichage verbeux.</p>\n<p>Si <code class=\"docutils literal notranslate\"><span class=\"pre\">interactive</span></code> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, la suite de tests a le droit de poser des questions à l’utilisateur durant son exécution. Par exemple, elle pourrait demander la permission de supprimer une base de données de test existante. Si <code class=\"docutils literal notranslate\"><span class=\"pre\">interactive</span></code> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>, la suite de tests doit pouvoir s’exécuter sans aucune intervention manuelle de l’utilisateur.</p>\n<p>Si <code class=\"docutils literal notranslate\"><span class=\"pre\">failfast</span></code> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, la suite de tests s’arrête immédiatement après le premier échec de test.</p>\n<p>Si <code class=\"docutils literal notranslate\"><span class=\"pre\">keepdb</span></code> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, la suite de tests va utiliser la base de données existante ou en créer une si c’est nécessaire. Si la valeur est <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>, une nouvelle base de données est toujours créée, demandant à l’utilisateur de supprimer une éventuelle base existante de même nom.</p>\n<p>Si <code class=\"docutils literal notranslate\"><span class=\"pre\">reverse</span></code> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, les cas de tests sont exécutés dans l’ordre inverse. Cela peut être utile pour déboguer des tests qui ne sont pas isolés correctement et génèrent des effets de bord. Le <a class=\"reference internal\" href=\"/fr/5.1/topics/testing/overview/#order-of-tests\"><span class=\"std std-ref\">groupement par classe de test</span></a> est conservé lors de l’utilisation de cette option. Celle-ci peut être utilisée conjointement avec <code class=\"docutils literal notranslate\"><span class=\"pre\">--shuffle</span></code> pour inverser l’ordre d’une graine aléatoire particulière.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">debug_mode</span></code> indique la valeur que doit prendre le réglage <a class=\"reference internal\" href=\"/fr/5.1/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a> avant d’exécuter les tests.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">parallel</span></code> indique le nombre de processus. Si <code class=\"docutils literal notranslate\"><span class=\"pre\">parallel</span></code> est plus grand que <code class=\"docutils literal notranslate\"><span class=\"pre\">1</span></code>, la suite de tests s’exécutera dans des processus en parallèle. S’il y a moins de classes de cas de test que de processus configurés, Django se charge de réduire le nombre de processus en conséquence. Chaque processus reçoit sa propre base de données. Cette option nécessite la présence du paquet tiers <code class=\"docutils literal notranslate\"><span class=\"pre\">tblib</span></code> pour afficher correctement les traces d’erreurs.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">tags</span></code> peut être utilisé pour définir un jeu <a class=\"reference internal\" href=\"/fr/5.1/topics/testing/tools/#topics-tagging-tests\"><span class=\"std std-ref\">d’étiquettes pour le filtrage des tests</span></a>. Peut être combiné avec <code class=\"docutils literal notranslate\"><span class=\"pre\">exclude_tags</span></code>.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">exclude_tags</span></code> peut être utilisé pour définir un jeu <a class=\"reference internal\" href=\"/fr/5.1/topics/testing/tools/#topics-tagging-tests\"><span class=\"std std-ref\">d’étiquettes pour l’exclusion de tests</span></a>. Peut être combiné avec <code class=\"docutils literal notranslate\"><span class=\"pre\">tags</span></code>.</p>\n<p>Si <code class=\"docutils literal notranslate\"><span class=\"pre\">debug_sql</span></code> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, les tests en échec affichent les requêtes SQL journalisées vers <a class=\"reference internal\" href=\"/fr/5.1/ref/logging/#django-db-logger\"><span class=\"std std-ref\">django.db.backends</span></a> en plus de la pile d’appels. Si <code class=\"docutils literal notranslate\"><span class=\"pre\">verbosity</span></code> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">2</span></code>, les requêtes de tous les tests sont affichées.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">test_name_patterns</span></code> peut être utilisé pour définir un ensemble de motifs pour filtrer les méthodes et classes de test par leur nom.</p>\n<p>Si <code class=\"docutils literal notranslate\"><span class=\"pre\">pdb</span></code> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, un débogueur (<code class=\"docutils literal notranslate\"><span class=\"pre\">pdb</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">ipdb</span></code>) sera déclenché lors de chaque erreur ou échec de test.</p>\n<p>Si <code class=\"docutils literal notranslate\"><span class=\"pre\">buffer</span></code> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, la sortie des tests réussis sera omise.</p>\n<p>Si <code class=\"docutils literal notranslate\"><span class=\"pre\">enable_faulthandler</span></code> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, <a class=\"reference external\" href=\"https://docs.python.org/3/library/faulthandler.html#module-faulthandler\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">faulthandler</span></code></a> sera activé.</p>\n<p>Si <code class=\"docutils literal notranslate\"><span class=\"pre\">timing</span></code> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, la mesure temporelle des tests sera affichée, y compris la mise en place de la base de données et le temps total d’exécution.</p>\n<p>Si <code class=\"docutils literal notranslate\"><span class=\"pre\">shuffle</span></code> est un nombre entier, les cas de test seront mélangés aléatoirement avant leur exécution, en utilisant le nombre entier comme facteur aléatoire. Si <code class=\"docutils literal notranslate\"><span class=\"pre\">shuffle</span></code> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>, ce facteur sera généré aléatoirement. Dans les deux cas, le facteur sera journalisé et défini dans <code class=\"docutils literal notranslate\"><span class=\"pre\">self.shuffle_seed</span></code> avant de lancer les tests. Cette option peut être utilisée pour aider à détecter les tests qui ne sont pas proprement isolés. Le <a class=\"reference internal\" href=\"/fr/5.1/topics/testing/overview/#order-of-tests\"><span class=\"std std-ref\">groupement par classe de test</span></a> est conservé avec cette option.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">logger</span></code> peut être utilisé pour passer un <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.html#logger\" title=\"(disponible dans Python v3.14)\"><span class=\"xref std std-ref\">objet Logger</span></a> Python. Si indiqué, ce journaliseur sera utilisé pour journaliser les messages au lieu de les afficher dans la console. Cet objet journaliseur respectera son niveau de journalisation plutôt que le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">verbosity</span></code>.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">durations</span></code> affiche une liste des N cas de tests les plus lents. En définissant cette option à <code class=\"docutils literal notranslate\"><span class=\"pre\">0</span></code>, la durée de tous les tests sera affichée. Nécessite Python 3.12+.</p>\n<p>Il est possible que de temps à autre, Django étende les capacités du lanceur de tests en ajoutant de nouveaux paramètres. La déclaration <code class=\"docutils literal notranslate\"><span class=\"pre\">**kwargs</span></code> permet cette extension. Si vous héritez de <code class=\"docutils literal notranslate\"><span class=\"pre\">DiscoverRunner</span></code> ou que vous écrivez votre propre lanceur de tests, vérifiez qu’il accepte <code class=\"docutils literal notranslate\"><span class=\"pre\">**kwargs</span></code>.</p>\n<p>Votre lanceur de tests peut aussi définir des options supplémentaires en ligne de commande. Créez ou surchargez une méthode de classe <code class=\"docutils literal notranslate\"><span class=\"pre\">add_arguments(cls,</span> <span class=\"pre\">parser)</span></code> et ajoutez des paramètres personnalisés en appelant <code class=\"docutils literal notranslate\"><span class=\"pre\">parser.add_argument()</span></code> dans cette méthode, afin que la commande <a class=\"reference internal\" href=\"/fr/5.1/ref/django-admin/#django-admin-test\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">test</span></code></a> puisse exploiter ces paramètres.</p>\n<aside class=\"version-note version-added\" data-version=\"5.0\">\n<p class=\"version-note-title\">New in Django 5.0</p><p>Le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">durations</span></code> a été ajouté.</p>\n</aside>\n</dd></dl>\n\n<section id=\"attributes\">\n<h4>Attributs<a class=\"heading-anchor\" href=\"#attributes\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.test.runner.DiscoverRunner.test_suite\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">DiscoverRunner.</span></span><span class=\"sig-name descname\"><span class=\"pre\">test_suite</span></span><a class=\"heading-anchor\" href=\"#django.test.runner.DiscoverRunner.test_suite\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>La classe utilisée pour construire la suite de tests. Par défaut, il s’agit de <code class=\"docutils literal notranslate\"><span class=\"pre\">unittest.TestSuite</span></code>. Il est possible de surcharger cette valeur si vous souhaitez implémenter une logique différente pour collecter les tests.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.test.runner.DiscoverRunner.test_runner\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">DiscoverRunner.</span></span><span class=\"sig-name descname\"><span class=\"pre\">test_runner</span></span><a class=\"heading-anchor\" href=\"#django.test.runner.DiscoverRunner.test_runner\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Cette classe est celle du lanceur de tests de bas niveau utilisé pour exécuter les tests individuels et mettre en forme les résultats. Par défaut, il s’agit de <code class=\"docutils literal notranslate\"><span class=\"pre\">unittest.TextTestRunner</span></code>. Malgré la malencontreuse similitude des conventions de nommage, il ne s’agit pas du même type de classe que <code class=\"docutils literal notranslate\"><span class=\"pre\">DiscoverRunner</span></code>, qui prend en charge un plus grand spectre de responsabilités. Vous pouvez surcharger cet attribut pour modifier la façon dont les tests sont exécutés et leurs résultats affichés.</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.test.runner.DiscoverRunner.test_loader\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">DiscoverRunner.</span></span><span class=\"sig-name descname\"><span class=\"pre\">test_loader</span></span><a class=\"heading-anchor\" href=\"#django.test.runner.DiscoverRunner.test_loader\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Il s’agit de la classe qui charge les tests, que ce soit à partir de classes <code class=\"docutils literal notranslate\"><span class=\"pre\">TestCase</span></code>, de modules ou d’autres façons, et qui les consolide en suites de tests que le lanceur pourra exécuter. Par défaut, c’est <code class=\"docutils literal notranslate\"><span class=\"pre\">unittest.defaultTestLoader</span></code>. Vous pouvez surcharger cet attribut si vos tests doivent être chargés de manière inhabituelle.</p>\n</dd></dl>\n\n</section>\n<section id=\"methods\">\n<h4>Méthodes<a class=\"heading-anchor\" href=\"#methods\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.test.runner.DiscoverRunner.run_tests\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">DiscoverRunner.</span></span><span class=\"sig-name descname\"><span class=\"pre\">run_tests</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">test_labels</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.test.runner.DiscoverRunner.run_tests\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Lance la suite de tests.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">test_labels</span></code> permet d’indiquer les tests à exécuter et accepte plusieurs formats (voir <a class=\"reference internal\" href=\"#django.test.runner.DiscoverRunner.build_suite\" title=\"django.test.runner.DiscoverRunner.build_suite\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">DiscoverRunner.build_suite()</span></code></a> pour la liste des formats pris en charge).</p>\n<p>Cette méthode doit renvoyer le nombre de tests ayant échoué.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.test.runner.DiscoverRunner.add_arguments\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">classmethod</span></span><span class=\"w\"> </span></em><span class=\"sig-prename descclassname\"><span class=\"pre\">DiscoverRunner.</span></span><span class=\"sig-name descname\"><span class=\"pre\">add_arguments</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">parser</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.test.runner.DiscoverRunner.add_arguments\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Surchargez cette méthode de classe pour ajouter des paramètres personnalisés acceptés par la commande d’administration <a class=\"reference internal\" href=\"/fr/5.1/ref/django-admin/#django-admin-test\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">test</span></code></a>. Voir <a class=\"reference external\" href=\"https://docs.python.org/3/library/argparse.html#argparse.ArgumentParser.add_argument\" title=\"(disponible dans Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">argparse.ArgumentParser.add_argument()</span></code></a> pour plus de détails au sujet de l’ajout de paramètres de ligne de commande.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.test.runner.DiscoverRunner.setup_test_environment\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">DiscoverRunner.</span></span><span class=\"sig-name descname\"><span class=\"pre\">setup_test_environment</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.test.runner.DiscoverRunner.setup_test_environment\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Met en place l’environnement de test en appelant <a class=\"reference internal\" href=\"#django.test.utils.setup_test_environment\" title=\"django.test.utils.setup_test_environment\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">setup_test_environment()</span></code></a> et en définissant <a class=\"reference internal\" href=\"/fr/5.1/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a> à <code class=\"docutils literal notranslate\"><span class=\"pre\">self.debug_mode</span></code> (<code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> par défaut).</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.test.runner.DiscoverRunner.build_suite\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">DiscoverRunner.</span></span><span class=\"sig-name descname\"><span class=\"pre\">build_suite</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">test_labels</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.test.runner.DiscoverRunner.build_suite\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Construit une suite de tests correspondant aux noms de test indiqués.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">test_labels</span></code> est une liste de chaînes décrivant les tests à exécuter. Un nom de test peut apparaître sous quatre formes :</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">chemin.vers.module_test.TestCase.methode_test</span></code> – Lance une seule méthode de test dans une classe de cas de test.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">chemin.vers.module_test.TestCase</span></code> – Lance toutes les méthodes de test d’un cas de test.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">chemin.vers.module</span></code> – Recherche et lance tous les tests d’un paquet ou module Python donné.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">chemin/vers/répertoire</span></code> – Recherche et lance tous les tests dans la sous-arborescence du répertoire donné.</p></li>\n</ul>\n<p>Si <code class=\"docutils literal notranslate\"><span class=\"pre\">test_labels</span></code> contient la valeur <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>, le lanceur de tests recherche des tests dans tous les fichiers au-dessous du répertoire actuel dont le nom correspond à son motif <code class=\"docutils literal notranslate\"><span class=\"pre\">pattern</span></code> (voir ci-dessus).</p>\n<p>Renvoie une instance <code class=\"docutils literal notranslate\"><span class=\"pre\">TestSuite</span></code> prête à être exécutée.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.test.runner.DiscoverRunner.setup_databases\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">DiscoverRunner.</span></span><span class=\"sig-name descname\"><span class=\"pre\">setup_databases</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.test.runner.DiscoverRunner.setup_databases\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Crée les bases de données de test en appelant <a class=\"reference internal\" href=\"#django.test.utils.setup_databases\" title=\"django.test.utils.setup_databases\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">setup_databases()</span></code></a>.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.test.runner.DiscoverRunner.run_checks\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">DiscoverRunner.</span></span><span class=\"sig-name descname\"><span class=\"pre\">run_checks</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">databases</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.test.runner.DiscoverRunner.run_checks\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Lance les <a class=\"reference internal\" href=\"/fr/5.1/topics/checks/\"><span class=\"doc\">vérifications systèmes</span></a> pour les bases <code class=\"docutils literal notranslate\"><span class=\"pre\">databases</span></code> de test.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.test.runner.DiscoverRunner.run_suite\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">DiscoverRunner.</span></span><span class=\"sig-name descname\"><span class=\"pre\">run_suite</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">suite</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.test.runner.DiscoverRunner.run_suite\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Lance la suite de tests.</p>\n<p>Renvoie le résultat produit par l’exécution de la suite de tests.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.test.runner.DiscoverRunner.get_test_runner_kwargs\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">DiscoverRunner.</span></span><span class=\"sig-name descname\"><span class=\"pre\">get_test_runner_kwargs</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.test.runner.DiscoverRunner.get_test_runner_kwargs\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Renvoie les paramètres nommés pour l’instanciation de  <code class=\"docutils literal notranslate\"><span class=\"pre\">DiscoverRunner.test_runner</span></code>.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.test.runner.DiscoverRunner.teardown_databases\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">DiscoverRunner.</span></span><span class=\"sig-name descname\"><span class=\"pre\">teardown_databases</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">old_config</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.test.runner.DiscoverRunner.teardown_databases\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Supprime les bases de données de test, rétablissant la situation d’avant-test en appelant <a class=\"reference internal\" href=\"#django.test.utils.teardown_databases\" title=\"django.test.utils.teardown_databases\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">teardown_databases()</span></code></a>.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.test.runner.DiscoverRunner.teardown_test_environment\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">DiscoverRunner.</span></span><span class=\"sig-name descname\"><span class=\"pre\">teardown_test_environment</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.test.runner.DiscoverRunner.teardown_test_environment\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Rétablit l’environnement à son état d’avant les tests.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.test.runner.DiscoverRunner.suite_result\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">DiscoverRunner.</span></span><span class=\"sig-name descname\"><span class=\"pre\">suite_result</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">suite</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">result</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.test.runner.DiscoverRunner.suite_result\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Calcule et renvoie un code de retour basé sur une suite de tests et des résultats de ces tests.</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.test.runner.DiscoverRunner.log\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">DiscoverRunner.</span></span><span class=\"sig-name descname\"><span class=\"pre\">log</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">msg</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">level</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.test.runner.DiscoverRunner.log\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Quand le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">logger</span></code> est défini, journalise le message au <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.html#levels\">niveau de journalisation</a> donné (nombre entier), par ex. <code class=\"docutils literal notranslate\"><span class=\"pre\">logging.DEBUG</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">logging.INFO</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">logging.WARNING</span></code>. Sinon, le message est affiché dans la console en respectant le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">verbosity</span></code> en cours. Par exemple, aucun message ne sera affiché si <code class=\"docutils literal notranslate\"><span class=\"pre\">verbosity</span></code> vaut 0, les niveaux <code class=\"docutils literal notranslate\"><span class=\"pre\">INFO</span></code> et supérieurs seront affichés si <code class=\"docutils literal notranslate\"><span class=\"pre\">verbosity</span></code> vaut au moins 1, et les niveaux <code class=\"docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code> seront affichés si <code class=\"docutils literal notranslate\"><span class=\"pre\">verbosity</span></code> vaut au moins 2. La valeur par défaut de <code class=\"docutils literal notranslate\"><span class=\"pre\">level</span></code> est <code class=\"docutils literal notranslate\"><span class=\"pre\">logging.INFO</span></code>.</p>\n</dd></dl>\n\n</section>\n</section>\n<section id=\"testing-utilities\">\n<h3>Utilitaires de test<a class=\"heading-anchor\" href=\"#testing-utilities\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<section id=\"module-django.test.utils\">\n<span id=\"django-test-utils\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">django.test.utils</span></code><a class=\"heading-anchor\" href=\"#module-django.test.utils\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Pour aider à la création de votre propre lanceur de tests, Django fournit un certain nombre de méthodes utilitaires dans le module <code class=\"docutils literal notranslate\"><span class=\"pre\">django.test.utils</span></code>.</p>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.test.utils.setup_test_environment\">\n<span class=\"sig-name descname\"><span class=\"pre\">setup_test_environment</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">debug</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.test.utils.setup_test_environment\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Effectue la mise en place générale avant les tests, comme l’installation des adaptations du système de rendu des gabarits et la mise en place de la boîte de messagerie factice.</p>\n<p>Si <code class=\"docutils literal notranslate\"><span class=\"pre\">debug</span></code> ne vaut pas <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>, le réglage <a class=\"reference internal\" href=\"/fr/5.1/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a> est mis à jour avec cette valeur.</p>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.test.utils.teardown_test_environment\">\n<span class=\"sig-name descname\"><span class=\"pre\">teardown_test_environment</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.test.utils.teardown_test_environment\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Effectue la finalisation générale après les tests, comme la suppression des adaptations du système des gabarits et le rétablissement des services de messagerie par défaut.</p>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.test.utils.setup_databases\">\n<span class=\"sig-name descname\"><span class=\"pre\">setup_databases</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">verbosity</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">interactive</span></span></em>, <em class=\"sig-param\"><span class=\"keyword-only-separator o\"><abbr title=\"Keyword-only parameters separator (PEP 3102)\"><span class=\"pre\">*</span></abbr></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">time_keeper</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">keepdb</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">debug_sql</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">parallel</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">0</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">aliases</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">serialized_aliases</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">kwargs</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.test.utils.setup_databases\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Crée les bases de données de test.</p>\n<p>Renvoie une structure de données fournissant suffisamment de détails pour annuler les changements effectués. Ces données sont ensuite transmises à la fonction <a class=\"reference internal\" href=\"#django.test.utils.teardown_databases\" title=\"django.test.utils.teardown_databases\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">teardown_databases()</span></code></a> lors de la finalisation des tests.</p>\n<p>Le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">aliases</span></code> détermine pour quels alias de <a class=\"reference internal\" href=\"/fr/5.1/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a> les bases de données de test doivent être préparées. S’il n’est pas présent, sa valeur par défaut contient tous les alias de <a class=\"reference internal\" href=\"/fr/5.1/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a>.</p>\n<p>Le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">serialized_aliases</span></code> détermine le sous-ensemble des <code class=\"docutils literal notranslate\"><span class=\"pre\">aliases</span></code> de bases de données de test qui devraient avoir leur état sérialisé pour permettre l’utilisation de la fonctionnalité <a class=\"reference internal\" href=\"/fr/5.1/topics/testing/overview/#test-case-serialized-rollback\"><span class=\"std std-ref\">serialized_rollback</span></a>. Si non défini, la valeur par défaut est <code class=\"docutils literal notranslate\"><span class=\"pre\">aliases</span></code>.</p>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.test.utils.teardown_databases\">\n<span class=\"sig-name descname\"><span class=\"pre\">teardown_databases</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">old_config</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">parallel</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">0</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">keepdb</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.test.utils.teardown_databases\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Supprime les bases de données de test, rétablissant la situation d’avant-test.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">old_config</span></code> est une structure de données définissant les modifications de la configuration des bases de données qui doivent être annulées. C’est la valeur de renvoi de la méthode <a class=\"reference internal\" href=\"#django.test.utils.setup_databases\" title=\"django.test.utils.setup_databases\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">setup_databases()</span></code></a>.</p>\n</dd></dl>\n\n</section>\n<section id=\"django-db-connection-creation\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.connection.creation</span></code><a class=\"heading-anchor\" href=\"#django-db-connection-creation\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Le module de création du moteur de base de données propose également quelques utilitaires pouvant être utiles durant les tests.</p>\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.db.connection.creation.create_test_db\">\n<span class=\"sig-name descname\"><span class=\"pre\">create_test_db</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">verbosity</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">1</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">autoclobber</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">serialize</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">True</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">keepdb</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.connection.creation.create_test_db\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Crée une nouvelle base de données de test et exécute <code class=\"docutils literal notranslate\"><span class=\"pre\">migrate</span></code> sur cette base.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">verbosity</span></code> a le même effet que dans <code class=\"docutils literal notranslate\"><span class=\"pre\">run_tests()</span></code>.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">autoclobber</span></code> décrit le comportement adopté si une base de données de même nom que la base de données de test existe déjà :</p>\n<ul class=\"simple\">\n<li><p>Si <code class=\"docutils literal notranslate\"><span class=\"pre\">autoclobber</span></code> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>, l’utilisateur devra confirmer la suppression de la base de données existante. <code class=\"docutils literal notranslate\"><span class=\"pre\">sys.exit</span></code> est appelée si l’utilisateur refuse.</p></li>\n<li><p>Si <code class=\"docutils literal notranslate\"><span class=\"pre\">autoclobber</span></code> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, la base de données est supprimée sans rien demander à l’utilisateur.</p></li>\n</ul>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">serialize</span></code> détermine si Django sérialise la base de données en une chaîne JSON en mémoire avant de lancer les tests (utilisé pour restaurer l’état de la base de données entre les tests s’il n’y a pas de transactions). Vous pouvez le définir à <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> pour accélérer nettement le temps de création si aucune de vos classes de test ne comporte <a class=\"reference internal\" href=\"/fr/5.1/topics/testing/overview/#test-case-serialized-rollback\"><span class=\"std std-ref\">serialized_rollback=True</span></a>.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">keepdb</span></code> détermine si la session de test doit utiliser une base de données existante ou si elle doit en créer une nouvelle. Si <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, une éventuelle base de données existante est utilisée, sinon une nouvelle base est créée. Si <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>, une nouvelle base de données sera créée dans tous les cas, en demandant à l’utilisateur s’il doit supprimer la base existante, s’il y en a une.</p>\n<p>Renvoie le nom de la base de données de test qui a été créée.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">create_test_db()</span></code> présente un effet de bord : la valeur de <a class=\"reference internal\" href=\"/fr/5.1/ref/settings/#std-setting-NAME\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">NAME</span></code></a> dans <a class=\"reference internal\" href=\"/fr/5.1/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a> est mise à jour pour correspondre au nom de la base de données de test.</p>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.db.connection.creation.destroy_test_db\">\n<span class=\"sig-name descname\"><span class=\"pre\">destroy_test_db</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">old_database_name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">verbosity</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">1</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">keepdb</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">False</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.connection.creation.destroy_test_db\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Supprime la base de données dont le nom correspond à la valeur de <a class=\"reference internal\" href=\"/fr/5.1/ref/settings/#std-setting-NAME\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">NAME</span></code></a> dans <a class=\"reference internal\" href=\"/fr/5.1/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a> et met à jour <a class=\"reference internal\" href=\"/fr/5.1/ref/settings/#std-setting-NAME\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">NAME</span></code></a> avec la valeur contenue dans <code class=\"docutils literal notranslate\"><span class=\"pre\">old_database_name</span></code>.</p>\n<p>Le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">verbosity</span></code> a le même effet que pour <a class=\"reference internal\" href=\"#django.test.runner.DiscoverRunner\" title=\"django.test.runner.DiscoverRunner\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DiscoverRunner</span></code></a>.</p>\n<p>Si le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">keepdb</span></code> vaut <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, la connexion à la base de données sera fermée, mais la base de données ne sera pas détruite.</p>\n</dd></dl>\n\n<dl class=\"py function\">\n<dt class=\"sig sig-object py\" id=\"django.db.connection.creation.serialize_db_to_string\">\n<span class=\"sig-name descname\"><span class=\"pre\">serialize_db_to_string</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.connection.creation.serialize_db_to_string\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Sérialise la base de données en une chaîne JSON en mémoire pouvant être utilisée pour restaurer l’état de la base de données entre les tests si le moteur ne gère par les transactions ou si votre suite de tests contient des tests avec la propriété <a class=\"reference internal\" href=\"/fr/5.1/topics/testing/overview/#test-case-serialized-rollback\"><span class=\"std std-ref\">serialized_rollback=True</span></a>.</p>\n<p>Cette fonction ne devrait être appelée qu’après la création de toutes les bases de données de test car le processus de sérialisation pourrait aboutir à des requêtes appliquées sur des bases de données « non test », en fonction de votre <a class=\"reference internal\" href=\"/fr/5.1/topics/db/multi-db/#topics-db-multi-db-routing\"><span class=\"std std-ref\">configuration de routage</span></a>.</p>\n</dd></dl>\n\n</section>\n</section>\n</section>\n<section id=\"integration-with-coverage-py\">\n<span id=\"topics-testing-code-coverage\"></span><h2>Intégration avec <code class=\"docutils literal notranslate\"><span class=\"pre\">coverage.py</span></code><a class=\"heading-anchor\" href=\"#integration-with-coverage-py\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>La couverture de code représente la quantité de code source mis à l’épreuve par les tests. Elle montre quelles sont les parties de code que les tests éprouvent et les parties qui ne le sont pas. C’est un aspect important du test des applications, c’est pourquoi il est fortement recommandé de contrôler la couverture de vos tests.</p>\n<p>Django peut facilement s’intégrer à <a class=\"reference external\" href=\"https://coverage.readthedocs.io/\">coverage.py</a>, un outil de mesure de couverture du code de programmes Python. Premièrement, installez <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/coverage/\">coverage</a>. Puis, lancez la commande suivante à partir du répertoire de votre projet contenant <code class=\"docutils literal notranslate\"><span class=\"pre\">manage.py</span></code>:</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>coverage<span class=\"w\"> </span>run<span class=\"w\"> </span>--source<span class=\"o\">=</span><span class=\"s1\">&#39;.&#39;</span><span class=\"w\"> </span>manage.py<span class=\"w\"> </span><span class=\"nb\">test</span><span class=\"w\"> </span>myapp\n</code></pre></div>\n<p>Cela va lancer les tests et collecter les données de couverture des fichiers exécutés dans votre projet. Vous pouvez afficher un rapport de ces données en saisissant la commande suivante :</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>coverage<span class=\"w\"> </span>report\n</code></pre></div>\n<p>Notez que du code Django a été exécuté lors de l’exécution des tests, mais il ne figure pas dans le rapport à cause de l’option <code class=\"docutils literal notranslate\"><span class=\"pre\">source</span></code> indiquée dans la commande précédente.</p>\n<p>Pour davantage d’options comme les listings HTML annotés détaillant les lignes manquantes, consultez la documentation de <a class=\"reference external\" href=\"https://coverage.readthedocs.io/\">coverage.py</a>.</p>\n</section>","rootId":"advanced-testing-topics","toc":[{"title":"La fabrique de requêtes","anchor":"the-request-factory","children":[{"title":"Exemple","anchor":"example","children":[]},{"title":"AsyncRequestFactory","anchor":"asyncrequestfactory","children":[]}]},{"title":"Test des vues fondées sur les classes","anchor":"testing-class-based-views","children":[]},{"title":"Tests avec plusieurs noms d’hôtes","anchor":"tests-and-multiple-host-names","children":[]},{"title":"Tests avec plusieurs base de données","anchor":"tests-and-multiple-databases","children":[{"title":"Test des configurations primaire/réplique","anchor":"testing-primary-replica-configurations","children":[]},{"title":"Ordre de création des bases de données de test","anchor":"controlling-creation-order-for-test-databases","children":[]}]},{"title":"Fonctionnalités avancées de TransactionTestCase","anchor":"advanced-features-of-transactiontestcase","children":[]},{"title":"Exécution séquentielle forcée des classes de tests","anchor":"enforce-running-test-classes-sequentially","children":[]},{"title":"Utilisation du lanceur de tests de Django pour tester des applications réutilisables","anchor":"using-the-django-test-runner-to-test-reusable-applications","children":[]},{"title":"Utilisation d’autres infrastructures de test","anchor":"using-different-testing-frameworks","children":[{"title":"Définition d’un lanceur de tests","anchor":"defining-a-test-runner","children":[{"title":"Attributs","anchor":"attributes","children":[]},{"title":"Méthodes","anchor":"methods","children":[]}]},{"title":"Utilitaires de test","anchor":"testing-utilities","children":[{"title":"django.test.utils","anchor":"module-django.test.utils","children":[]},{"title":"django.db.connection.creation","anchor":"django-db-connection-creation","children":[]}]}]},{"title":"Intégration avec coverage.py","anchor":"integration-with-coverage-py","children":[]}],"breadcrumbs":[{"docname":"topics/index","title":"Utilisation de Django","url":"/fr/5.1/topics/"},{"docname":"topics/testing/index","title":"Les tests dans Django","url":"/fr/5.1/topics/testing/"}],"prev":{"docname":"topics/testing/tools","title":"Outils de test","url":"/fr/5.1/topics/testing/tools/"},"next":{"docname":"topics/auth/index","title":"Authentification des utilisateurs dans Django","url":"/fr/5.1/topics/auth/"},"formats":{"html":"/fr/5.1/topics/testing/advanced/","markdown":"/fr/5.1/topics/testing/advanced.md","json":"/fr/5.1/topics/testing/advanced.json"},"source":"https://github.com/django/django/blob/stable/5.1.x/docs/topics/testing/advanced.txt","official":"https://docs.djangoproject.com/fr/5.1/topics/testing/advanced/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}