{"title":"Avancerade testämnen","version":"6.1","locale":"sv","docname":"topics/testing/advanced","url":"/sv/6.1/topics/testing/advanced/","canonical":"https://djangodocs.dev/sv/6.1/topics/testing/advanced/","summary":"Förfrågningsfabriken Link to this heading # class RequestFactory Link to this definition # Klassen:~django.test.RequestFactory delar samma API som testklienten. Men…","html":"<h1>Avancerade testämnen<a class=\"heading-anchor\" href=\"#advanced-testing-topics\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<section id=\"the-request-factory\">\n<h2>Förfrågningsfabriken<a class=\"heading-anchor\" href=\"#the-request-factory\"><span class=\"visually-hidden\">Link to this heading</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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Klassen:~django.test.RequestFactory delar samma API som testklienten. Men istället för att bete sig som en webbläsare ger RequestFactory ett sätt att generera en begärandeinstans som kan användas som det första argumentet för alla vyer. Detta innebär att du kan testa en vyfunktion på samma sätt som du skulle testa vilken annan funktion som helst - som en svart låda, med exakt kända ingångar, och testa för specifika utgångar.</p>\n<p>API:et för <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> är en något begränsad delmängd av testklientens API:</p>\n<ul class=\"simple\">\n<li><p>It only has access to the HTTP methods <a class=\"reference internal\" href=\"/sv/6.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>,\n<a class=\"reference internal\" href=\"/sv/6.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=\"/sv/6.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>,\n<a class=\"reference internal\" href=\"/sv/6.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=\"/sv/6.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>,\n<a class=\"reference internal\" href=\"/sv/6.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>, and <a class=\"reference internal\" href=\"/sv/6.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>Dessa metoder accepterar alla samma argument <em>undantaget</em> för <code class=\"docutils literal notranslate\"><span class=\"pre\">follow</span></code>. Eftersom detta bara är en fabrik för att producera förfrågningar är det upp till dig att hantera svaret.</p></li>\n<li><p>Den stöder inte middleware. Sessions- och autentiseringsattribut måste tillhandahållas av testet självt om det krävs för att vyn ska fungera korrekt.</p></li>\n</ul>\n<section id=\"example\">\n<h3>Exempel<a class=\"heading-anchor\" href=\"#example\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Följande är ett enhetstest som använder request factory:</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\">Link to this heading</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\">Link to this definition</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> skapar WSGI-liknande förfrågningar. Om du vill skapa ASGI-liknande förfrågningar, inklusive att ha ett korrekt ASGI <code class=\"docutils literal notranslate\"><span class=\"pre\">scope</span></code>, kan du istället använda <code class=\"docutils literal notranslate\"><span class=\"pre\">django.test.AsyncRequestFactory</span></code>.</p>\n<p>Den här klassen är direkt API-kompatibel med <code class=\"docutils literal notranslate\"><span class=\"pre\">RequestFactory</span></code>, med den enda skillnaden att den returnerar <code class=\"docutils literal notranslate\"><span class=\"pre\">ASGIRequest</span></code>-instanser i stället för <code class=\"docutils literal notranslate\"><span class=\"pre\">WSGIRequest</span></code>-instanser. Alla dess metoder är fortfarande synkrona callables.</p>\n<p>Godtyckliga nyckelordsargument i <code class=\"docutils literal notranslate\"><span class=\"pre\">defaults</span></code> läggs till direkt i ASGI-omfånget.</p>\n</section>\n</section>\n<section id=\"testing-class-based-views\">\n<h2>Testning av klassbaserade vyer<a class=\"heading-anchor\" href=\"#testing-class-based-views\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>För att kunna testa klassbaserade vyer utanför request/response-cykeln måste du se till att de är korrekt konfigurerade genom att anropa <a class=\"reference internal\" href=\"/sv/6.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> efter instantiering.</p>\n<p>Anta till exempel följande klassbaserade vy:</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\">Vyer.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>Du kan testa metoden <code class=\"docutils literal notranslate\"><span class=\"pre\">get_context_data()</span></code> direkt genom att först instansiera vyn och sedan skicka en <code class=\"docutils literal notranslate\"><span class=\"pre\">request</span></code> till <code class=\"docutils literal notranslate\"><span class=\"pre\">setup()</span></code>, innan du fortsätter med testkoden:</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>Tester och flera värdnamn<a class=\"heading-anchor\" href=\"#tests-and-multiple-host-names\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Inställningen <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-ALLOWED_HOSTS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">ALLOWED_HOSTS</span></code></a> valideras när tester körs. Detta gör att testklienten kan skilja mellan interna och externa webbadresser.</p>\n<p>Projekt som stöder multitenancy eller på annat sätt ändrar affärslogik baserat på begärans värd och använder anpassade värdnamn i tester måste inkludera dessa värdar i <a class=\"reference internal\" href=\"/sv/6.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>Det första alternativet är att lägga till värdarna i din inställningsfil. Till exempel innehåller testsviten för docs.djangoproject.com följande:</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>och inställningsfilen innehåller en lista över de domäner som stöds av projektet:</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>Another option is to add the required hosts to <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-ALLOWED_HOSTS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">ALLOWED_HOSTS</span></code></a> using\n<a class=\"reference internal\" href=\"/sv/6.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> or\n<a class=\"reference internal\" href=\"/sv/6.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>. This option may be\npreferable in standalone apps that can’t package their own settings file or\nfor projects where the list of domains is not static (e.g., subdomains for\nmultitenancy). For example, you could write a test for the domain\n<code class=\"docutils literal notranslate\"><span class=\"pre\">http://otherserver/</span></code> as follows:</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>Om du avaktiverar <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-ALLOWED_HOSTS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">ALLOWED_HOSTS</span></code></a>-kontrollen (<code class=\"docutils literal notranslate\"><span class=\"pre\">ALLOWED_HOSTS</span> <span class=\"pre\">=</span> <span class=\"pre\">['*']</span></code>) när du kör tester förhindrar du att testklienten ger ett användbart felmeddelande om du följer en omdirigering till en extern URL.</p>\n</section>\n<section id=\"tests-and-multiple-databases\">\n<span id=\"topics-testing-advanced-multidb\"></span><h2>Tester och flera databaser<a class=\"heading-anchor\" href=\"#tests-and-multiple-databases\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"testing-primary-replica-configurations\">\n<span id=\"topics-testing-primaryreplica\"></span><h3>Test av primär/replikakonfigurationer<a class=\"heading-anchor\" href=\"#testing-primary-replica-configurations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Om du testar en konfiguration med flera databaser med replikering av primär/replika (kallas master/slave av vissa databaser), utgör denna strategi för att skapa testdatabaser ett problem. När testdatabaserna skapas kommer det inte att finnas någon replikering, och som ett resultat kommer data som skapats på den primära inte att ses på repliken.</p>\n<p>För att kompensera för detta tillåter Django dig att definiera att en databas är en <em>testspegel</em>. Tänk på följande (förenklade) exempel på databaskonfiguration:</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>I den här installationen har vi två databasservrar: <code class=\"docutils literal notranslate\"><span class=\"pre\">dbprimary</span></code>, som beskrivs av databasaliaset <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code>, och <code class=\"docutils literal notranslate\"><span class=\"pre\">dbreplica</span></code> som beskrivs av aliaset <code class=\"docutils literal notranslate\"><span class=\"pre\">replica</span></code>. Som du kanske förväntar dig har <code class=\"docutils literal notranslate\"><span class=\"pre\">dbreplica</span></code> konfigurerats av databasadministratören som en läskopia av <code class=\"docutils literal notranslate\"><span class=\"pre\">dbprimary</span></code>, så under normal aktivitet kommer alla skrivningar till <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> att visas på <code class=\"docutils literal notranslate\"><span class=\"pre\">replica</span></code>.</p>\n<p>Om Django skapade två oberoende testdatabaser skulle detta bryta alla tester som förväntade sig att replikering skulle ske. Databasen <code class=\"docutils literal notranslate\"><span class=\"pre\">replica</span></code> har dock konfigurerats som en testspegel (med hjälp av testinställningen <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-TEST_MIRROR\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MIRROR</span></code></a>), vilket indikerar att <code class=\"docutils literal notranslate\"><span class=\"pre\">replica</span></code> under testning bör behandlas som en spegel av <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code>.</p>\n<p>När testmiljön är konfigurerad kommer en testversion av <code class=\"docutils literal notranslate\"><span class=\"pre\">replica</span></code> <em>inte</em> att skapas. Istället kommer anslutningen till <code class=\"docutils literal notranslate\"><span class=\"pre\">replica</span></code> att omdirigeras så att den pekar på <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code>. Som ett resultat kommer skrivningar till <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> att visas på <code class=\"docutils literal notranslate\"><span class=\"pre\">replica</span></code> - men eftersom de faktiskt är samma databas, inte för att det finns datareplikering mellan de två databaserna. Eftersom detta är beroende av transaktioner måste testerna använda <a class=\"reference internal\" href=\"/sv/6.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> istället för <a class=\"reference internal\" href=\"/sv/6.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>Kontroll av skapandeordning för testdatabaser<a class=\"heading-anchor\" href=\"#controlling-creation-order-for-test-databases\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Som standard kommer Django att anta att alla databaser är beroende av <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code>-databasen och därför alltid skapa <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code>-databasen först. Det finns dock inga garantier för i vilken ordning andra databaser i din testkonfiguration skapas.</p>\n<p>Om din databaskonfiguration kräver en viss skapandeordning kan du ange vilka beroenden som finns med hjälp av testinställningen <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-TEST_DEPENDENCIES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEPENDENCIES</span></code></a>. Tänk på följande (förenklade) exempel på databaskonfiguration:</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>I den här konfigurationen kommer databasen <code class=\"docutils literal notranslate\"><span class=\"pre\">diamonds</span></code> att skapas först, eftersom det är det enda databasaliaset utan beroenden. Aliasen <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">clubs</span></code> skapas därefter (även om ordningen för skapandet av detta par inte är garanterad), sedan <code class=\"docutils literal notranslate\"><span class=\"pre\">hearts</span></code> och slutligen <code class=\"docutils literal notranslate\"><span class=\"pre\">spades</span></code>.</p>\n<p>Om det finns några cirkulära beroenden i <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-TEST_DEPENDENCIES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEPENDENCIES</span></code></a>-definitionen, kommer ett <a class=\"reference internal\" href=\"/sv/6.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>-undantag att uppstå.</p>\n</section>\n</section>\n<section id=\"advanced-features-of-transactiontestcase\">\n<h2>Avancerade funktioner i <code class=\"docutils literal notranslate\"><span class=\"pre\">TransactionTestCase</span></code><a class=\"heading-anchor\" href=\"#advanced-features-of-transactiontestcase\"><span class=\"visually-hidden\">Link to this heading</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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Varning</p>\n<p>Detta attribut är ett privat API. Det kan komma att ändras eller tas bort i framtiden utan en avvecklingsperiod, t.ex. för att tillgodose förändringar i applikationsladdning.</p>\n<p>Den används för att optimera Djangos egen testsvit, som innehåller hundratals modeller men inga relationer mellan modeller i olika applikationer.</p>\n</aside>\n<p>Som standard är <code class=\"docutils literal notranslate\"><span class=\"pre\">available_apps</span></code> inställd på <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>. Efter varje test anropar Django <a class=\"reference internal\" href=\"/sv/6.1/ref/django-admin/#django-admin-flush\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">flush</span></code></a> för att återställa databastillståndet. Detta tömmer alla tabeller och sänder ut <a class=\"reference internal\" href=\"/sv/6.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>-signalen, som återskapar en innehållstyp och fyra behörigheter för varje modell. Denna operation blir dyr proportionellt mot antalet modeller.</p>\n<p>Om du ställer in <code class=\"docutils literal notranslate\"><span class=\"pre\">available_apps</span></code> till en lista över applikationer instrueras Django att bete sig som om endast modellerna från dessa applikationer var tillgängliga. Beteendet för <code class=\"docutils literal notranslate\"><span class=\"pre\">TransactionTestCase</span></code> ändras enligt följande:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/sv/6.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> avfyras före varje test för att skapa innehållstyper och behörigheter för varje modell i tillgängliga appar, ifall de saknas.</p></li>\n<li><p>Efter varje test tömmer Django endast tabeller som motsvarar modeller i tillgängliga appar. På databasnivå kan trunkering dock kaskadera till relaterade modeller i otillgängliga appar. Dessutom <a class=\"reference internal\" href=\"/sv/6.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> avfyras inte; det kommer att avfyras av nästa <code class=\"docutils literal notranslate\"><span class=\"pre\">TransactionTestCase</span></code>, efter att rätt uppsättning applikationer har valts.</p></li>\n</ul>\n<p>Eftersom databasen inte är helt tömd, om ett test skapar instanser av modeller som inte ingår i <code class=\"docutils literal notranslate\"><span class=\"pre\">available_apps</span></code>, kommer de att läcka och de kan orsaka att orelaterade tester misslyckas. Var försiktig med tester som använder sessioner; standardsessionsmotorn lagrar dem i databasen.</p>\n<p>Eftersom <a class=\"reference internal\" href=\"/sv/6.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> inte skickas ut efter rensning av databasen, är dess tillstånd efter ett <code class=\"docutils literal notranslate\"><span class=\"pre\">TransactionTestCase</span></code> inte detsamma som efter ett <code class=\"docutils literal notranslate\"><span class=\"pre\">TestCase</span></code>: det saknar de rader som skapats av lyssnare till <a class=\"reference internal\" href=\"/sv/6.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>. Med tanke på <a class=\"reference internal\" href=\"/sv/6.1/topics/testing/overview/#order-of-tests\"><span class=\"std std-ref\">ordningen i vilken tester utförs</span></a> är detta inte ett problem, förutsatt att antingen alla <code class=\"docutils literal notranslate\"><span class=\"pre\">TransactionTestCase</span></code> i en given testsvit deklarerar <code class=\"docutils literal notranslate\"><span class=\"pre\">available_apps</span></code>, eller ingen av dem.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">available_apps</span></code> är obligatoriskt i Djangos egen testsvit.</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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Om du ställer in <code class=\"docutils literal notranslate\"><span class=\"pre\">reset_sequences</span> <span class=\"pre\">=</span> <span class=\"pre\">True</span></code> på ett <code class=\"docutils literal notranslate\"><span class=\"pre\">TransactionTestCase</span></code> ser du till att sekvenserna alltid återställs innan testet körs:</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>Unless you are explicitly testing primary keys sequence numbers, it is\nrecommended that you do not hardcode primary key values in tests.</p>\n<p>Om du använder <code class=\"docutils literal notranslate\"><span class=\"pre\">reset_sequences</span> <span class=\"pre\">=</span> <span class=\"pre\">True</span></code> kommer testet att gå långsammare, eftersom återställningen av primärnyckeln är en relativt dyr databasoperation.</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>Genomför sekventiell körning av testklasser<a class=\"heading-anchor\" href=\"#enforce-running-test-classes-sequentially\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Om du har testklasser som inte kan köras parallellt (t.ex. för att de delar en gemensam resurs) kan du använda <code class=\"docutils literal notranslate\"><span class=\"pre\">django.test.testcases.SerializeMixin</span></code> för att köra dem sekventiellt. Denna mixin använder ett filsystem <code class=\"docutils literal notranslate\"><span class=\"pre\">lockfile</span></code>.</p>\n<p>Du kan t.ex. använda <code class=\"docutils literal notranslate\"><span class=\"pre\">__file__</span></code> för att bestämma att alla testklasser i samma fil som ärver från <code class=\"docutils literal notranslate\"><span class=\"pre\">SerializeMixin</span></code> ska köras sekventiellt:</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>Använda Django Test Runner för att testa återanvändbara applikationer<a class=\"heading-anchor\" href=\"#using-the-django-test-runner-to-test-reusable-applications\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Om du skriver en <a class=\"reference internal\" href=\"/sv/6.1/intro/reusable-apps/\"><span class=\"doc\">återanvändbar applikation</span></a> kanske du vill använda Django test runner för att köra din egen testsvit och därmed dra nytta av Djangos testinfrastruktur.</p>\n<p>En vanlig metod är en <em>tests</em>-katalog bredvid applikationskoden, med följande struktur:</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>Låt oss ta en titt på några av dessa filer:</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>Detta är det skript som du anropar för att köra testsviten. Det ställer in Django-miljön, skapar testdatabasen och kör testerna.</p>\n<p>För tydlighetens skull innehåller detta exempel endast det absolut nödvändiga för att använda Djangos testlöpare. Du kanske vill lägga till kommandoradsalternativ för att kontrollera ordrikedom, skicka in specifika testetiketter som ska köras 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\">tester/tester_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>Den här filen innehåller de <a class=\"reference internal\" href=\"/sv/6.1/topics/settings/\"><span class=\"doc\">Django-inställningar</span></a> som krävs för att köra appens tester.</p>\n<p>Även detta är ett minimalt exempel; dina tester kan kräva ytterligare inställningar för att köras.</p>\n<p>Eftersom paketet <em>tests</em> ingår i <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> när du kör dina tester, kan du definiera modeller som endast gäller tester i dess fil <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>Användning av olika testramverk<a class=\"heading-anchor\" href=\"#using-different-testing-frameworks\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Det är uppenbart att <a class=\"reference external\" href=\"https://docs.python.org/3/library/unittest.html#module-unittest\" title=\"(in Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">unittest</span></code></a> inte är det enda testramverket i Python. Även om Django inte ger uttryckligt stöd för alternativa ramverk, ger det ett sätt att anropa tester som är konstruerade för ett alternativt ramverk som om de vore vanliga Django-tester.</p>\n<p>När du kör <code class=\"docutils literal notranslate\"><span class=\"pre\">./manage.py</span> <span class=\"pre\">test</span></code> tittar Django på inställningen <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-TEST_RUNNER\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TEST_RUNNER</span></code></a> för att avgöra vad som ska göras. Som standard pekar <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-TEST_RUNNER\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TEST_RUNNER</span></code></a> på <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.test.runner.DiscoverRunner'</span></code>. Den här klassen definierar Djangos standardtestbeteende. Detta beteende innebär:</p>\n<ol class=\"arabic simple\">\n<li><p>Utföra global förtestinställning.</p></li>\n<li><p>Letar efter tester i alla filer under den aktuella katalogen vars namn matchar mönstret <code class=\"docutils literal notranslate\"><span class=\"pre\">test*.py</span></code>.</p></li>\n<li><p>Skapa testdatabaserna.</p></li>\n<li><p>Kör <code class=\"docutils literal notranslate\"><span class=\"pre\">migrate</span></code> för att installera modeller och initialdata i testdatabaserna.</p></li>\n<li><p>Kör <a class=\"reference internal\" href=\"/sv/6.1/topics/checks/\"><span class=\"doc\">systemkontroller</span></a>.</p></li>\n<li><p>Kör de tester som hittades.</p></li>\n<li><p>Förstöring av testdatabaserna.</p></li>\n<li><p>Utföra global nedmontering efter test.</p></li>\n</ol>\n<p>Om du definierar din egen testlöparklass och pekar <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-TEST_RUNNER\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TEST_RUNNER</span></code></a> på den klassen, kommer Django att köra din testlöpare när du kör <code class=\"docutils literal notranslate\"><span class=\"pre\">./manage.py</span> <span class=\"pre\">test</span></code>. På så sätt är det möjligt att använda valfritt testramverk som kan köras från Python-kod, eller att modifiera Djangos testkörningsprocess för att uppfylla de testkrav du kan ha.</p>\n<section id=\"defining-a-test-runner\">\n<span id=\"topics-testing-test-runner\"></span><h3>Definiera en testlöpare<a class=\"heading-anchor\" href=\"#defining-a-test-runner\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>En testlöpare är en klass som definierar en metod <code class=\"docutils literal notranslate\"><span class=\"pre\">run_tests()</span></code>. Django levereras med en <code class=\"docutils literal notranslate\"><span class=\"pre\">DiscoverRunner</span></code>-klass som definierar standardtestbeteendet för Django. Denna klass definierar ingångspunkten <code class=\"docutils literal notranslate\"><span class=\"pre\">run_tests()</span></code>, plus ett urval av andra metoder som används av <code class=\"docutils literal notranslate\"><span class=\"pre\">run_tests()</span></code> för att ställa in, köra och riva ner testsviten.</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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\"><span class=\"pre\">DiscoverRunner</span></code> kommer att söka efter tester i alla filer som matchar <code class=\"docutils literal notranslate\"><span class=\"pre\">mönstret</span></code>.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">top_level</span></code> kan användas för att ange den katalog som innehåller dina Python-moduler på högsta nivå. Vanligtvis kan Django räkna ut detta automatiskt, så det är inte nödvändigt att ange detta alternativ. Om det anges bör det i allmänhet vara den katalog som innehåller din <code class=\"docutils literal notranslate\"><span class=\"pre\">manage.py</span></code>-fil.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">verbosity</span></code> bestämmer hur mycket meddelande- och felsökningsinformation som ska skrivas ut till konsolen; <code class=\"docutils literal notranslate\"><span class=\"pre\">0</span></code> är ingen utdata, <code class=\"docutils literal notranslate\"><span class=\"pre\">1</span></code> är normal utdata och <code class=\"docutils literal notranslate\"><span class=\"pre\">2</span></code> är verbose utdata.</p>\n<p>Om <code class=\"docutils literal notranslate\"><span class=\"pre\">interactive</span></code> är <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> har testsviten behörighet att be användaren om instruktioner när testsviten körs. Ett exempel på detta beteende är att be om tillstånd att ta bort en befintlig testdatabas. Om <code class=\"docutils literal notranslate\"><span class=\"pre\">interactive</span></code> är <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> måste testsviten kunna köras utan någon manuell inblandning.</p>\n<p>Om <code class=\"docutils literal notranslate\"><span class=\"pre\">failfast</span></code> är <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> kommer testsviten att sluta köras efter att det första testfelet har upptäckts.</p>\n<p>Om <code class=\"docutils literal notranslate\"><span class=\"pre\">keepdb</span></code> är <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> kommer testsviten att använda den befintliga databasen, eller skapa en om det behövs. Om <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> kommer en ny databas att skapas och användaren uppmanas att ta bort den befintliga databasen, om en sådan finns.</p>\n<p>Om <code class=\"docutils literal notranslate\"><span class=\"pre\">reverse</span></code> är <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> kommer testfallen att exekveras i motsatt ordning. Detta kan vara användbart för att felsöka tester som inte är ordentligt isolerade och som har bieffekter. <a class=\"reference internal\" href=\"/sv/6.1/topics/testing/overview/#order-of-tests\"><span class=\"std std-ref\">Gruppering efter testklass</span></a> bevaras när detta alternativ används. Det här alternativet kan användas tillsammans med <code class=\"docutils literal notranslate\"><span class=\"pre\">--shuffle</span></code> för att vända ordningen för ett visst slumpmässigt frö.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">debug_mode</span></code> anger vad inställningen <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a> ska vara inställd på innan tester körs.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">parallel</span></code> specifies the number of processes. If <code class=\"docutils literal notranslate\"><span class=\"pre\">parallel</span></code> is greater\nthan <code class=\"docutils literal notranslate\"><span class=\"pre\">1</span></code>, the test suite will run in <code class=\"docutils literal notranslate\"><span class=\"pre\">parallel</span></code> processes. If there are\nfewer test case classes than configured processes, Django will reduce the\nnumber of processes accordingly. Each process gets its own database. This\noption requires the third-party <code class=\"docutils literal notranslate\"><span class=\"pre\">tblib</span></code> package to display tracebacks\ncorrectly.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">tags</span></code> kan användas för att ange en uppsättning <a class=\"reference internal\" href=\"/sv/6.1/topics/testing/tools/#topics-tagging-tests\"><span class=\"std std-ref\">tags för filtrering av tester</span></a>. Kan kombineras med <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> kan användas för att ange en uppsättning <a class=\"reference internal\" href=\"/sv/6.1/topics/testing/tools/#topics-tagging-tests\"><span class=\"std std-ref\">taggar för att utesluta tester</span></a>. Kan kombineras med <code class=\"docutils literal notranslate\"><span class=\"pre\">tags</span></code>.</p>\n<p>Om <code class=\"docutils literal notranslate\"><span class=\"pre\">debug_sql</span></code> är <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, kommer misslyckade testfall att mata ut SQL-frågor som loggas till <a class=\"reference internal\" href=\"/sv/6.1/ref/logging/#django-db-logger\"><span class=\"std std-ref\">django.db.backends logger</span></a> samt spårningen. Om <code class=\"docutils literal notranslate\"><span class=\"pre\">verbosity</span></code> är <code class=\"docutils literal notranslate\"><span class=\"pre\">2</span></code>, kommer frågor i alla tester att matas ut.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">test_name_patterns</span></code> kan användas för att ange en uppsättning mönster för att filtrera testmetoder och klasser efter deras namn.</p>\n<p>Om <code class=\"docutils literal notranslate\"><span class=\"pre\">pdb</span></code> är <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> kommer en debugger (<code class=\"docutils literal notranslate\"><span class=\"pre\">pdb</span></code> eller <code class=\"docutils literal notranslate\"><span class=\"pre\">ipdb</span></code>) att startas vid varje fel eller misslyckande i testet.</p>\n<p>Om <code class=\"docutils literal notranslate\"><span class=\"pre\">buffer</span></code> är <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, kommer utdata från godkända tester att kasseras.</p>\n<p>If <code class=\"docutils literal notranslate\"><span class=\"pre\">enable_faulthandler</span></code> is <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=\"(in Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">faulthandler</span></code></a> will be\nenabled.</p>\n<p>Om <code class=\"docutils literal notranslate\"><span class=\"pre\">timing</span></code> är <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> visas testtider, inklusive databasinstallation och total körtid.</p>\n<p>Om <code class=\"docutils literal notranslate\"><span class=\"pre\">shuffle</span></code> är ett heltal kommer testfallen att blandas i en slumpmässig ordning före exekvering, med heltalet som slumpmässigt frö. Om <code class=\"docutils literal notranslate\"><span class=\"pre\">shuffle</span></code> är <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> kommer fröet att genereras slumpmässigt. I båda fallen kommer fröet att loggas och sättas till <code class=\"docutils literal notranslate\"><span class=\"pre\">self.shuffle_seed</span></code> innan testerna körs. Detta alternativ kan användas för att hjälpa till att upptäcka tester som inte är ordentligt isolerade. <a class=\"reference internal\" href=\"/sv/6.1/topics/testing/overview/#order-of-tests\"><span class=\"std std-ref\">Gruppering efter testklass</span></a> bevaras när detta alternativ används.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">logger</span></code> can be used to pass a Python <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.html#logger\" title=\"(in Python v3.14)\"><span class=\"xref std std-ref\">Logger object</span></a>.\nIf provided, the logger will be used to log messages instead of printing to\nthe console. The logger object will respect its logging level rather than\nthe <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> will show a list of the N slowest test cases. Setting this\noption to <code class=\"docutils literal notranslate\"><span class=\"pre\">0</span></code> will result in the duration for all tests being shown.</p>\n<p>Django kan, från tid till annan, utöka testlöparens möjligheter genom att lägga till nya argument. Deklarationen <code class=\"docutils literal notranslate\"><span class=\"pre\">**kwargs</span></code> tillåter denna expansion. Om du underklassar <code class=\"docutils literal notranslate\"><span class=\"pre\">DiscoverRunner</span></code> eller skriver din egen testlöpare, se till att den accepterar <code class=\"docutils literal notranslate\"><span class=\"pre\">**kwargs</span></code>.</p>\n<p>Din testlöpare kan också definiera ytterligare kommandoradsalternativ. Skapa eller åsidosätt en klassmetod <code class=\"docutils literal notranslate\"><span class=\"pre\">add_arguments(cls,</span> <span class=\"pre\">parser)</span></code> och lägg till anpassade argument genom att anropa <code class=\"docutils literal notranslate\"><span class=\"pre\">parser.add_argument()</span></code> inuti metoden, så att kommandot <a class=\"reference internal\" href=\"/sv/6.1/ref/django-admin/#django-admin-test\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">test</span></code></a> kan använda dessa argument.</p>\n</dd></dl>\n\n<section id=\"attributes\">\n<h4>Attribut<a class=\"heading-anchor\" href=\"#attributes\"><span class=\"visually-hidden\">Link to this heading</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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Den klass som används för att bygga testsviten. Som standard är den inställd på <code class=\"docutils literal notranslate\"><span class=\"pre\">unittest.TestSuite</span></code>. Detta kan åsidosättas om du vill implementera en annan logik för att samla in tester.</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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Detta är klassen för den testlöpare på låg nivå som används för att köra de enskilda testerna och formatera resultaten. Som standard är den inställd på <code class=\"docutils literal notranslate\"><span class=\"pre\">unittest.TextTestRunner</span></code>. Trots den olyckliga likheten i namngivningskonventioner är detta inte samma typ av klass som <code class=\"docutils literal notranslate\"><span class=\"pre\">DiscoverRunner</span></code>, som täcker en bredare uppsättning ansvarsområden. Du kan åsidosätta detta attribut för att ändra hur tester körs och rapporteras.</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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Det här är klassen som laddar tester, oavsett om det är från TestCases eller moduler eller på annat sätt, och buntar ihop dem till testsviter som köraren kan köra. Som standard är den inställd på <code class=\"docutils literal notranslate\"><span class=\"pre\">unittest.defaultTestLoader</span></code>. Du kan åsidosätta detta attribut om dina tester kommer att laddas på ovanliga sätt.</p>\n</dd></dl>\n\n</section>\n<section id=\"methods\">\n<h4>Metoder<a class=\"heading-anchor\" href=\"#methods\"><span class=\"visually-hidden\">Link to this heading</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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Kör testsviten.</p>\n<p>med <code class=\"docutils literal notranslate\"><span class=\"pre\">test_labels</span></code> kan du ange vilka tester som ska köras och det finns stöd för flera format (se <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> för en lista över format som stöds).</p>\n<p>Denna metod bör returnera antalet tester som misslyckades.</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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Override this class method to add custom arguments accepted by the\n<a class=\"reference internal\" href=\"/sv/6.1/ref/django-admin/#django-admin-test\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">test</span></code></a> management command. See\n<a class=\"reference external\" href=\"https://docs.python.org/3/library/argparse.html#argparse.ArgumentParser.add_argument\" title=\"(in Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">argparse.ArgumentParser.add_argument()</span></code></a> for details about adding\narguments to a parser.</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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Ställer in testmiljön genom att anropa <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> och ställa in <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a> till <code class=\"docutils literal notranslate\"><span class=\"pre\">self.debug_mode</span></code> (standard är <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>).</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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Konstruerar en testsvit som matchar de testetiketter som anges.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">test_labels</span></code> är en lista med strängar som beskriver de tester som ska köras. En testetikett kan ha en av fyra former:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">path.to.test_module.TestCase.test_method</span></code> – Kör en enda testmetod i en testfallsklass.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">path.to.test_module.TestCase</span></code> – Kör alla testmetoder i ett testfall.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">path.to.module</span></code> – Söker efter och kör alla tester i det angivna Python-paketet eller -modulen.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">path/to/directory</span></code> – Sök efter och kör alla tester under den angivna katalogen.</p></li>\n</ul>\n<p>Om <code class=\"docutils literal notranslate\"><span class=\"pre\">test_labels</span></code> har värdet <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> kommer testlöparen att söka efter tester i alla filer under den aktuella katalogen vars namn matchar dess <code class=\"docutils literal notranslate\"><span class=\"pre\">mönster</span></code> (se ovan).</p>\n<p>Returnerar en instans av <code class=\"docutils literal notranslate\"><span class=\"pre\">TestSuite</span></code> som är redo att köras.</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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Skapar testdatabaserna genom att anropa <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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Kör <a class=\"reference internal\" href=\"/sv/6.1/topics/checks/\"><span class=\"doc\">systemkontroller</span></a> på testets <code class=\"docutils literal notranslate\"><span class=\"pre\">databaser</span></code>.</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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Kör testsviten.</p>\n<p>Returnerar resultatet av körningen av testsviten.</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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Returnerar nyckelordsargumenten för att instansiera <code class=\"docutils literal notranslate\"><span class=\"pre\">DiscoverRunner.test_runner</span></code> med.</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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Förstör testdatabaserna och återställer villkoren före testet genom att anropa <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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Återställer miljön före testet.</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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Beräknar och returnerar en returkod baserad på en testsvit och resultatet från denna testsvit.</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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Om en <code class=\"docutils literal notranslate\"><span class=\"pre\">logger</span></code> är inställd, loggas meddelandet på den angivna heltalsnivån för <a class=\"reference external\" href=\"https://docs.python.org/3/library/logging.html#levels\">loggning</a> (t.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> eller <code class=\"docutils literal notranslate\"><span class=\"pre\">logging.WARNING</span></code>). Annars skrivs meddelandet ut till konsolen, med hänsyn till den aktuella <code class=\"docutils literal notranslate\"><span class=\"pre\">verbosity</span></code>. Exempelvis skrivs inget meddelande ut om <code class=\"docutils literal notranslate\"><span class=\"pre\">verbosity</span></code> är 0, <code class=\"docutils literal notranslate\"><span class=\"pre\">INFO</span></code> och högre skrivs ut om <code class=\"docutils literal notranslate\"><span class=\"pre\">verbosity</span></code> är minst 1 och <code class=\"docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code> skrivs ut om den är minst 2. Standardvärdet för <code class=\"docutils literal notranslate\"><span class=\"pre\">level</span></code> är <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>Test av verktyg<a class=\"heading-anchor\" href=\"#testing-utilities\"><span class=\"visually-hidden\">Link to this heading</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\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>För att hjälpa till att skapa din egen testlöpare tillhandahåller Django ett antal verktygsmetoder i modulen <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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Utför globala inställningar före test, t.ex. installation av instrument för mallrenderingssystemet och konfigurering av dummy-utkorgen för e-post.</p>\n<p>Om <code class=\"docutils literal notranslate\"><span class=\"pre\">debug</span></code> inte är <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>, uppdateras <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a>-inställningen till dess värde.</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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Utför global nedmontering efter test, t.ex. avlägsnande av instrument från mallsystemet och återställning av normala e-posttjänster.</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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Skapar testdatabaserna.</p>\n<p>Returnerar en datastruktur som innehåller tillräckligt med detaljer för att ångra de ändringar som har gjorts. Dessa data kommer att tillhandahållas till <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>-funktionen när testningen är avslutad.</p>\n<p>Argumentet <code class=\"docutils literal notranslate\"><span class=\"pre\">aliases</span></code> bestämmer vilka <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a>-alias som testdatabaserna ska konfigureras för. Om det inte anges, är standardvärdet alla <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a> alias.</p>\n<p>Argumentet <code class=\"docutils literal notranslate\"><span class=\"pre\">serialized_aliases</span></code> bestämmer vilken delmängd av <code class=\"docutils literal notranslate\"><span class=\"pre\">aliases</span></code> testdatabaser som ska ha sitt tillstånd serialiserat för att möjliggöra användning av funktionen <a class=\"reference internal\" href=\"/sv/6.1/topics/testing/overview/#test-case-serialized-rollback\"><span class=\"std std-ref\">serialized_rollback</span></a>. Om det inte anges är standardvärdet <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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Förstör testdatabaserna och återställer förhållandena före testet.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">old_config</span></code> är en datastruktur som definierar de ändringar i databaskonfigurationen som måste återställas. Det är returvärdet för metoden <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\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Skapandemodulen för databasens backend innehåller också några verktyg som kan vara användbara under testning.</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\">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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Skapar en ny testdatabas och kör <code class=\"docutils literal notranslate\"><span class=\"pre\">migrate</span></code> mot den.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">verbosity</span></code> har samma beteende som i <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> beskriver det beteende som kommer att uppstå om en databas med samma namn som testdatabasen upptäcks:</p>\n<ul class=\"simple\">\n<li><p>Om <code class=\"docutils literal notranslate\"><span class=\"pre\">autoclobber</span></code> är <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> kommer användaren att bli ombedd att godkänna att den befintliga databasen förstörs. <code class=\"docutils literal notranslate\"><span class=\"pre\">sys.exit</span></code> anropas om användaren inte godkänner detta.</p></li>\n<li><p>Om <code class=\"docutils literal notranslate\"><span class=\"pre\">autoclobber</span></code> är <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> kommer databasen att förstöras utan att användaren tillfrågas.</p></li>\n</ul>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">keepdb</span></code> avgör om testkörningen ska använda en befintlig databas eller skapa en ny. Om <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> används den befintliga databasen, eller skapas om den inte finns. Om <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> skapas en ny databas och användaren uppmanas att ta bort den befintliga databasen, om en sådan finns.</p>\n<p>Returnerar namnet på den testdatabas som skapades.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">create_test_db()</span></code> har som bieffekt att värdet för <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-NAME\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">NAME</span></code></a> i <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a> ändras så att det motsvarar namnet på testdatabasen.</p>\n<aside class=\"version-note version-deprecated\" data-version=\"6.0\">\n<p class=\"version-note-title\">Deprecated since Django 6.0</p><p><span class=\"versionmodified deprecated\">Ersatt sedan version 6.0: </span>The <code class=\"docutils literal notranslate\"><span class=\"pre\">serialize</span></code> keyword argument is deprecated. Passing\n<code class=\"docutils literal notranslate\"><span class=\"pre\">serialize=True</span></code> would automatically call\n<a class=\"reference internal\" href=\"#django.db.connection.creation.serialize_db_to_string\" title=\"django.db.connection.creation.serialize_db_to_string\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">serialize_db_to_string()</span></code></a> but it was deprecated as it could result\nin queries against non-test databases during serialization.</p>\n</aside>\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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Förstör databasen vars namn är värdet för <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-NAME\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">NAME</span></code></a> i <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a> och anger värdet för <code class=\"docutils literal notranslate\"><span class=\"pre\">old_database_name</span></code> i <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-NAME\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">NAME</span></code></a>.</p>\n<p>Argumentet <code class=\"docutils literal notranslate\"><span class=\"pre\">verbosity</span></code> har samma beteende som för <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>Om argumentet <code class=\"docutils literal notranslate\"><span class=\"pre\">keepdb</span></code> är <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> kommer anslutningen till databasen att stängas, men databasen kommer inte att förstöras.</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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Serialiserar databasen till en JSON-sträng i minnet som kan användas för att återställa databastillståndet mellan tester om backend inte stöder transaktioner eller om din svit innehåller testklasser med <a class=\"reference internal\" href=\"/sv/6.1/topics/testing/overview/#test-case-serialized-rollback\"><span class=\"std std-ref\">serialized_rollback=True</span></a> aktiverat.</p>\n<p>Denna funktion bör endast anropas när alla testdatabaser har skapats eftersom serialiseringsprocessen kan resultera i frågor mot databaser som inte är testdatabaser beroende på din <a class=\"reference internal\" href=\"/sv/6.1/topics/db/multi-db/#topics-db-multi-db-routing\"><span class=\"std std-ref\">routingkonfiguration</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>Integration med <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\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Kodtäckning beskriver hur mycket av källkoden som har testats. Den visar vilka delar av din kod som testas och vilka som inte gör det. Det är en viktig del av testningen av applikationer, så det rekommenderas starkt att du kontrollerar täckningen av dina tester.</p>\n<p>Django kan enkelt integreras med <a class=\"reference external\" href=\"https://coverage.readthedocs.io/\">coverage.py</a>, ett verktyg för att mäta kodtäckning av Python-program. Först installerar du <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/coverage/\">coverage</a>. Därefter kör du följande från din projektmapp som innehåller <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>Detta kör dina tester och samlar in täckningsdata för de exekverade filerna i ditt projekt. Du kan se en rapport över dessa data genom att skriva följande kommando:</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>Observera att en del Django-kod exekverades när testerna kördes, men den listas inte här på grund av flaggan <code class=\"docutils literal notranslate\"><span class=\"pre\">source</span></code> som skickades till föregående kommando.</p>\n<p>För fler alternativ, t.ex. kommenterade HTML-listor med information om missade rader, se dokumenten för <a class=\"reference external\" href=\"https://coverage.readthedocs.io/\">coverage.py</a>.</p>\n</section>","rootId":"advanced-testing-topics","toc":[{"title":"Förfrågningsfabriken","anchor":"the-request-factory","children":[{"title":"Exempel","anchor":"example","children":[]},{"title":"AsyncRequestFactory","anchor":"asyncrequestfactory","children":[]}]},{"title":"Testning av klassbaserade vyer","anchor":"testing-class-based-views","children":[]},{"title":"Tester och flera värdnamn","anchor":"tests-and-multiple-host-names","children":[]},{"title":"Tester och flera databaser","anchor":"tests-and-multiple-databases","children":[{"title":"Test av primär/replikakonfigurationer","anchor":"testing-primary-replica-configurations","children":[]},{"title":"Kontroll av skapandeordning för testdatabaser","anchor":"controlling-creation-order-for-test-databases","children":[]}]},{"title":"Avancerade funktioner i TransactionTestCase","anchor":"advanced-features-of-transactiontestcase","children":[]},{"title":"Genomför sekventiell körning av testklasser","anchor":"enforce-running-test-classes-sequentially","children":[]},{"title":"Använda Django Test Runner för att testa återanvändbara applikationer","anchor":"using-the-django-test-runner-to-test-reusable-applications","children":[]},{"title":"Användning av olika testramverk","anchor":"using-different-testing-frameworks","children":[{"title":"Definiera en testlöpare","anchor":"defining-a-test-runner","children":[{"title":"Attribut","anchor":"attributes","children":[]},{"title":"Metoder","anchor":"methods","children":[]}]},{"title":"Test av verktyg","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":"Integration med coverage.py","anchor":"integration-with-coverage-py","children":[]}],"breadcrumbs":[{"docname":"topics/index","title":"Använda Django","url":"/sv/6.1/topics/"},{"docname":"topics/testing/index","title":"Testning i Django","url":"/sv/6.1/topics/testing/"}],"prev":{"docname":"topics/testing/tools","title":"Testverktyg","url":"/sv/6.1/topics/testing/tools/"},"next":{"docname":"topics/auth/index","title":"Användarautentisering i Django","url":"/sv/6.1/topics/auth/"},"formats":{"html":"/sv/6.1/topics/testing/advanced/","markdown":"/sv/6.1/topics/testing/advanced.md","json":"/sv/6.1/topics/testing/advanced.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/topics/testing/advanced.txt","official":"https://docs.djangoproject.com/sv/6.1/topics/testing/advanced/","inVersions":["6.1","6.0","5.2"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}