{"title":"Skriva och köra tester","version":"5.2","locale":"sv","docname":"topics/testing/overview","url":"/sv/5.2/topics/testing/overview/","canonical":"https://djangodocs.dev/sv/5.2/topics/testing/overview/","summary":"Se även testhandledning , referens för testverktyg och avancerade testämnen . Detta dokument är uppdelat i två huvudavsnitt. Först förklarar vi hur man skriver…","html":"<span id=\"writing-and-running-tests\"></span><h1>Skriva och köra tester<a class=\"heading-anchor\" href=\"#module-django.test\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">Se även</p>\n<p><a class=\"reference internal\" href=\"/sv/5.2/intro/tutorial05/\"><span class=\"doc\">testhandledning</span></a>, <a class=\"reference internal\" href=\"/sv/5.2/topics/testing/tools/\"><span class=\"doc\">referens för testverktyg</span></a> och <a class=\"reference internal\" href=\"/sv/5.2/topics/testing/advanced/\"><span class=\"doc\">avancerade testämnen</span></a>.</p>\n</aside>\n<p>Detta dokument är uppdelat i två huvudavsnitt. Först förklarar vi hur man skriver tester med Django. Sedan förklarar vi hur man kör dem.</p>\n<section id=\"writing-tests\">\n<h2>Skriva tester<a class=\"heading-anchor\" href=\"#writing-tests\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Djangos enhetstester använder en modul från Pythons standardbibliotek: <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>. Denna modul definierar tester med hjälp av ett klassbaserat tillvägagångssätt.</p>\n<p>Här är ett exempel som underklassar från <a class=\"reference internal\" href=\"/sv/5.2/topics/testing/tools/#django.test.TestCase\" title=\"django.test.TestCase\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.test.TestCase</span></code></a>, som är en underklass av <a class=\"reference external\" href=\"https://docs.python.org/3/library/unittest.html#unittest.TestCase\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">unittest.TestCase</span></code></a> som kör varje test inuti en transaktion för att ge isolering:</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<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">myapp.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Animal</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">AnimalTestCase</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=\"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=\"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;cat&quot;</span><span class=\"p\">,</span> <span class=\"n\">sound</span><span class=\"o\">=</span><span class=\"s2\">&quot;meow&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">test_animals_can_speak</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;Animals that can speak are correctly identified&quot;&quot;&quot;</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\">get</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>\n        <span class=\"n\">cat</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\">get</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;cat&quot;</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\">lion</span><span class=\"o\">.</span><span class=\"n\">speak</span><span class=\"p\">(),</span> <span class=\"s1\">&#39;The lion says &quot;roar&quot;&#39;</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\">cat</span><span class=\"o\">.</span><span class=\"n\">speak</span><span class=\"p\">(),</span> <span class=\"s1\">&#39;The cat says &quot;meow&quot;&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>När du <a class=\"reference internal\" href=\"#running-tests\"><span class=\"std std-ref\">kör dina tester</span></a>, är standardbeteendet för testverktyget att hitta alla testfallsklasser (det vill säga underklasser till <a class=\"reference external\" href=\"https://docs.python.org/3/library/unittest.html#unittest.TestCase\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">unittest.TestCase</span></code></a>) i alla filer vars namn börjar med <code class=\"docutils literal notranslate\"><span class=\"pre\">test</span></code>, automatiskt bygga en testsvit av dessa testfallsklasser och köra sviten.</p>\n<p>För mer information om <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>, se Python-dokumentationen.</p>\n<aside class=\"admonition-where-should-the-tests-live admonition\">\n<p class=\"admonition-title\">Var ska testerna genomföras?</p>\n<p>Standardmallen <a class=\"reference internal\" href=\"/sv/5.2/ref/django-admin/#django-admin-startapp\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">startapp</span></code></a> skapar en fil med namnet <code class=\"docutils literal notranslate\"><span class=\"pre\">tests.py</span></code> i den nya applikationen. Detta kan vara bra om du bara har ett fåtal tester, men när din testsvit växer kommer du sannolikt att vilja omstrukturera den till ett testpaket så att du kan dela upp dina tester i olika undermoduler som <code class=\"docutils literal notranslate\"><span class=\"pre\">test_models.py</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">test_views.py</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">test_forms.py</span></code>, etc. Känn dig fri att välja vilket organisationsschema du vill.</p>\n<p>Se även <span class=\"xref std std-ref\">testning av återanvändbara applikationer</span>.</p>\n</aside>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Varning</p>\n<p>Om dina tester förlitar sig på databasåtkomst, till exempel för att skapa eller fråga modeller, se till att skapa dina testklasser som underklasser till <a class=\"reference internal\" href=\"/sv/5.2/topics/testing/tools/#django.test.TestCase\" title=\"django.test.TestCase\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.test.TestCase</span></code></a> snarare än <a class=\"reference external\" href=\"https://docs.python.org/3/library/unittest.html#unittest.TestCase\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">unittest.TestCase</span></code></a>.</p>\n<p>Genom att använda <a class=\"reference external\" href=\"https://docs.python.org/3/library/unittest.html#unittest.TestCase\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">unittest.TestCase</span></code></a> slipper du kostnaden för att köra varje test i en transaktion och rensa databasen, men om dina tester interagerar med databasen kommer deras beteende att variera beroende på i vilken ordning testlöparen kör dem. Detta kan leda till enhetstester som godkänns när de körs isolerat men som misslyckas när de körs i en svit.</p>\n</aside>\n</section>\n<section id=\"running-tests\">\n<span id=\"id1\"></span><h2>Genomföra tester<a class=\"heading-anchor\" href=\"#running-tests\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>När du har skrivit tester kan du köra dem med kommandot <a class=\"reference internal\" href=\"/sv/5.2/ref/django-admin/#django-admin-test\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">test</span></code></a> i verktyget <code class=\"docutils literal notranslate\"><span class=\"pre\">manage.py</span></code> i ditt projekt:</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>$<span class=\"w\"> </span>./manage.py<span class=\"w\"> </span><span class=\"nb\">test</span>\n</code></pre></div>\n<p>Testupptäckt baseras på unittest-modulens <a class=\"reference external\" href=\"https://docs.python.org/3/library/unittest.html#unittest-test-discovery\" title=\"(in Python v3.14)\"><span class=\"xref std std-ref\">inbyggd testupptäckt</span></a>.  Som standard kommer detta att upptäcka tester i alla filer med namnet <code class=\"docutils literal notranslate\"><span class=\"pre\">test*.py</span></code> under den aktuella arbetskatalogen.</p>\n<p>Du kan ange särskilda tester som ska köras genom att ange ett valfritt antal ”testetiketter” till <code class=\"docutils literal notranslate\"><span class=\"pre\">./manage.py</span> <span class=\"pre\">test</span></code>. Varje testetikett kan vara en fullständig Python-punktad sökväg till ett paket, en modul, en <code class=\"docutils literal notranslate\"><span class=\"pre\">TestCase</span></code>-underklass eller en testmetod. Till exempel:</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><span class=\"c1\"># Run all the tests in the animals.tests module</span>\n$<span class=\"w\"> </span>./manage.py<span class=\"w\"> </span><span class=\"nb\">test</span><span class=\"w\"> </span>animals.tests\n\n<span class=\"c1\"># Run all the tests found within the &#39;animals&#39; package</span>\n$<span class=\"w\"> </span>./manage.py<span class=\"w\"> </span><span class=\"nb\">test</span><span class=\"w\"> </span>animals\n\n<span class=\"c1\"># Run just one test case class</span>\n$<span class=\"w\"> </span>./manage.py<span class=\"w\"> </span><span class=\"nb\">test</span><span class=\"w\"> </span>animals.tests.AnimalTestCase\n\n<span class=\"c1\"># Run just one test method</span>\n$<span class=\"w\"> </span>./manage.py<span class=\"w\"> </span><span class=\"nb\">test</span><span class=\"w\"> </span>animals.tests.AnimalTestCase.test_animals_can_speak\n</code></pre></div>\n<p>Du kan också ange en sökväg till en katalog för att hitta tester under den katalogen:</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>$<span class=\"w\"> </span>./manage.py<span class=\"w\"> </span><span class=\"nb\">test</span><span class=\"w\"> </span>animals/\n</code></pre></div>\n<p>Du kan ange ett anpassat filnamnsmönster med hjälp av alternativet <code class=\"docutils literal notranslate\"><span class=\"pre\">-p</span></code> (eller <code class=\"docutils literal notranslate\"><span class=\"pre\">--pattern</span></code>) om dina testfiler har andra namn än <code class=\"docutils literal notranslate\"><span class=\"pre\">test*.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>$<span class=\"w\"> </span>./manage.py<span class=\"w\"> </span><span class=\"nb\">test</span><span class=\"w\"> </span>--pattern<span class=\"o\">=</span><span class=\"s2\">&quot;tests_*.py&quot;</span>\n</code></pre></div>\n<p>Om du trycker på <code class=\"docutils literal notranslate\"><span class=\"pre\">Ctrl-C</span></code> medan testerna körs, väntar testköraren på att det aktuella testet ska slutföras och avslutas sedan på ett elegant sätt. Under en elegant avslutning kommer testköraren att ge ut information om eventuella testfel, rapportera hur många tester som kördes och hur många fel och misslyckanden som uppstod, samt förstöra alla testdatabaser som vanligt. Att trycka på <code class=\"docutils literal notranslate\"><span class=\"pre\">Ctrl-C</span></code> kan alltså vara mycket användbart om du glömmer att ange alternativet <a class=\"reference internal\" href=\"/sv/5.2/ref/django-admin/#cmdoption-test-failfast\"><code class=\"xref std std-option docutils literal notranslate\"><span class=\"pre\">--failfast</span></code></a>, märker att vissa tester oväntat misslyckas och vill få information om misslyckandena utan att vänta på att hela testkörningen ska slutföras.</p>\n<p>Om du inte vill vänta på att det aktuella testet ska avslutas kan du trycka på <code class=\"docutils literal notranslate\"><span class=\"pre\">Ctrl-C</span></code> en gång till så avbryts testkörningen omedelbart, men inte på ett elegant sätt. Inga detaljer om de tester som kördes före avbrottet kommer att rapporteras, och inga testdatabaser som skapats av körningen kommer att förstöras.</p>\n<aside class=\"admonition-test-with-warnings-enabled admonition\">\n<p class=\"admonition-title\">Test med varningar aktiverade</p>\n<p>Det är en bra idé att köra dina tester med Python-varningar aktiverade: <code class=\"docutils literal notranslate\"><span class=\"pre\">python</span> <span class=\"pre\">-Wa</span> <span class=\"pre\">manage.py</span> <span class=\"pre\">test</span></code>. Flaggan <code class=\"docutils literal notranslate\"><span class=\"pre\">-Wa</span></code> säger till Python att visa varningar för utfasning. Django, liksom många andra Python-bibliotek, använder dessa varningar för att flagga när funktioner försvinner. Det kan också flagga områden i din kod som inte är helt fel men som kan dra nytta av en bättre implementering.</p>\n</aside>\n<section id=\"the-test-database\">\n<span id=\"id2\"></span><h3>Testdatabasen<a class=\"heading-anchor\" href=\"#the-test-database\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Tester som kräver en databas (dvs. modelltester) använder inte din ”riktiga” (produktions-) databas. Separata, tomma databaser skapas för testerna.</p>\n<p>Oavsett om testerna godkänns eller inte, förstörs testdatabaserna när alla tester har utförts.</p>\n<p>Du kan förhindra att testdatabaserna förstörs genom att använda alternativet <a class=\"reference internal\" href=\"/sv/5.2/ref/django-admin/#cmdoption-test-keepdb\"><code class=\"xref std std-option docutils literal notranslate\"><span class=\"pre\">test</span> <span class=\"pre\">--keepdb</span></code></a>. Detta kommer att bevara testdatabasen mellan körningarna. Om databasen inte finns kommer den först att skapas. Eventuella migreringar kommer också att tillämpas för att hålla den uppdaterad.</p>\n<p>Som beskrivs i föregående avsnitt får testdatabasen inte förstöras om en testkörning avbryts med våld. Vid nästa körning kommer du att få frågan om du vill återanvända eller förstöra databasen. Använd alternativet <a class=\"reference internal\" href=\"/sv/5.2/ref/django-admin/#cmdoption-test-noinput\"><code class=\"xref std std-option docutils literal notranslate\"><span class=\"pre\">test</span> <span class=\"pre\">--noinput</span></code></a> för att undertrycka den frågan och automatiskt förstöra databasen. Detta kan vara användbart när du kör tester på en server för kontinuerlig integration där testerna kan avbrytas av en timeout, till exempel.</p>\n<p>Standardnamnen på testdatabaserna skapas genom att lägga till <code class=\"docutils literal notranslate\"><span class=\"pre\">test_</span></code> till värdet för varje <a class=\"reference internal\" href=\"/sv/5.2/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/5.2/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a>. När SQLite används kommer testerna att använda en databas i minnet som standard (dvs. databasen skapas i minnet och kringgår filsystemet helt!) Ordlistan <a class=\"reference internal\" href=\"/sv/5.2/ref/settings/#std-setting-DATABASE-TEST\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TEST</span></code></a> i <code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASER</span></code> erbjuder ett antal inställningar för att konfigurera din testdatabas. Om du till exempel vill använda ett annat databasnamn anger du <a class=\"reference internal\" href=\"/sv/5.2/ref/settings/#std-setting-TEST_NAME\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">NAME</span></code></a> i ordlistan <a class=\"reference internal\" href=\"/sv/5.2/ref/settings/#std-setting-DATABASE-TEST\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TEST</span></code></a> för en viss databas i <a class=\"reference internal\" href=\"/sv/5.2/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a>.</p>\n<p>På PostgreSQL behöver <a class=\"reference internal\" href=\"/sv/5.2/ref/settings/#std-setting-USER\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USER</span></code></a> också läsbehörighet till den inbyggda databasen <code class=\"docutils literal notranslate\"><span class=\"pre\">postgres</span></code>.</p>\n<p>Förutom att använda en separat databas kommer testköraren att använda samma inställningar för databasen som du har i din inställningsfil: <a class=\"reference internal\" href=\"/sv/5.2/ref/settings/#std-setting-DATABASE-ENGINE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">ENGINE</span></code></a>, <a class=\"reference internal\" href=\"/sv/5.2/ref/settings/#std-setting-USER\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USER</span></code></a>, <a class=\"reference internal\" href=\"/sv/5.2/ref/settings/#std-setting-HOST\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">HOST</span></code></a>, etc. Testdatabasen skapas av den användare som anges av <a class=\"reference internal\" href=\"/sv/5.2/ref/settings/#std-setting-USER\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USER</span></code></a>, så du måste se till att det angivna användarkontot har tillräckliga privilegier för att skapa en ny databas i systemet.</p>\n<p>För finkornig kontroll över teckenkodningen i din testdatabas använder du alternativet <a class=\"reference internal\" href=\"/sv/5.2/ref/settings/#std-setting-TEST_CHARSET\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CHARSET</span></code></a> TEST. Om du använder MySQL kan du också använda alternativet <a class=\"reference internal\" href=\"/sv/5.2/ref/settings/#std-setting-TEST_COLLATION\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">COLLATION</span></code></a> för att styra den specifika kollationering som används av testdatabasen. Se <a class=\"reference internal\" href=\"/sv/5.2/ref/settings/\"><span class=\"doc\">settings-dokumentationen</span></a> för mer information om dessa och andra avancerade inställningar.</p>\n<p>Om du använder en SQLite-databas i minnet med SQLite är <a class=\"reference external\" href=\"https://www.sqlite.org/sharedcache.html\">shared cache</a> aktiverat, så att du kan skriva tester med möjlighet att dela databasen mellan trådar.</p>\n<aside class=\"admonition-finding-data-from-your-production-database-when-running-tests admonition\">\n<p class=\"admonition-title\">Hittar du data från din produktionsdatabas när du kör tester?</p>\n<p>Om din kod försöker komma åt databasen när modulerna kompileras kommer detta att ske <em>innan</em> testdatabasen har skapats, vilket kan ge oväntade resultat. Om du till exempel har en databasfråga i kod på modulnivå och det finns en riktig databas, kan produktionsdata förorena dina tester. <em>Det är ändå en dålig idé att ha sådana databasfrågor för importtid i din kod</em> - skriv om din kod så att den inte gör detta.</p>\n<p>Detta gäller även anpassade implementeringar av <a class=\"reference internal\" href=\"/sv/5.2/ref/applications/#django.apps.AppConfig.ready\" title=\"django.apps.AppConfig.ready\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">ready()</span></code></a>.</p>\n</aside>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">Se även</p>\n<p>The <a class=\"reference internal\" href=\"/sv/5.2/topics/testing/advanced/#topics-testing-advanced-multidb\"><span class=\"std std-ref\">avancerade ämnen för testning av flera databaser</span></a>.</p>\n</aside>\n</section>\n<section id=\"order-in-which-tests-are-executed\">\n<span id=\"order-of-tests\"></span><h3>Ordning i vilken testerna utförs<a class=\"heading-anchor\" href=\"#order-in-which-tests-are-executed\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>För att garantera att all <code class=\"docutils literal notranslate\"><span class=\"pre\">TestCase</span></code>-kod startar med en ren databas, ordnar Django test runner om testerna på följande sätt:</p>\n<ul class=\"simple\">\n<li><p>Alla <a class=\"reference internal\" href=\"/sv/5.2/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> underklasser körs först.</p></li>\n<li><p>Därefter körs alla andra Django-baserade tester (testfallsklasser baserade på <a class=\"reference internal\" href=\"/sv/5.2/topics/testing/tools/#django.test.SimpleTestCase\" title=\"django.test.SimpleTestCase\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">SimpleTestCase</span></code></a>, inklusive <a class=\"reference internal\" href=\"/sv/5.2/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>) utan att någon särskild ordning garanteras eller upprätthålls mellan dem.</p></li>\n<li><p>Sedan körs alla andra <a class=\"reference external\" href=\"https://docs.python.org/3/library/unittest.html#unittest.TestCase\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">unittest.TestCase</span></code></a>-tester (inklusive doctests) som kan ändra databasen utan att återställa den till dess ursprungliga tillstånd.</p></li>\n</ul>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Observera</p>\n<p>Den nya ordningsföljden för tester kan avslöja oväntade beroenden av testfallets ordningsföljd. Detta är fallet med doctests som förlitade sig på tillstånd som lämnats i databasen av ett visst <a class=\"reference internal\" href=\"/sv/5.2/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>-test, de måste uppdateras för att kunna köras oberoende.</p>\n</aside>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Observera</p>\n<p>Fel som upptäcks vid laddning av tester ordnas före alla ovanstående för snabbare återkoppling. Detta inkluderar saker som testmoduler som inte kunde hittas eller som inte kunde laddas på grund av syntaxfel.</p>\n</aside>\n<p>Du kan randomisera och/eller vända exekveringsordningen inom grupper med hjälp av alternativen <a class=\"reference internal\" href=\"/sv/5.2/ref/django-admin/#cmdoption-test-shuffle\"><code class=\"xref std std-option docutils literal notranslate\"><span class=\"pre\">test</span> <span class=\"pre\">--shuffle</span></code></a> och <a class=\"reference internal\" href=\"/sv/5.2/ref/django-admin/#cmdoption-test-reverse\"><code class=\"xref std std-option docutils literal notranslate\"><span class=\"pre\">--reverse</span></code></a>. Detta kan hjälpa till att säkerställa att dina tester är oberoende av varandra.</p>\n</section>\n<section id=\"rollback-emulation\">\n<span id=\"test-case-serialized-rollback\"></span><h3>Rollback-emulering<a class=\"heading-anchor\" href=\"#rollback-emulation\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Alla initiala data som laddas i migreringar kommer endast att vara tillgängliga i <code class=\"docutils literal notranslate\"><span class=\"pre\">TestCase</span></code>-tester och inte i <code class=\"docutils literal notranslate\"><span class=\"pre\">TransactionTestCase</span></code>-tester, och dessutom endast på backends där transaktioner stöds (det viktigaste undantaget är MyISAM). Detta gäller även för tester som förlitar sig på <code class=\"docutils literal notranslate\"><span class=\"pre\">TransactionTestCase</span></code> som <a class=\"reference internal\" href=\"/sv/5.2/topics/testing/tools/#django.test.LiveServerTestCase\" title=\"django.test.LiveServerTestCase\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">LiveServerTestCase</span></code></a> och <a class=\"reference internal\" href=\"/sv/5.2/ref/contrib/staticfiles/#django.contrib.staticfiles.testing.StaticLiveServerTestCase\" title=\"django.contrib.staticfiles.testing.StaticLiveServerTestCase\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">StaticLiveServerTestCase</span></code></a>.</p>\n<p>Django kan ladda om dessa data åt dig per testfall genom att ställa in alternativet <code class=\"docutils literal notranslate\"><span class=\"pre\">serialized_rollback</span></code> till <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> i kroppen av <code class=\"docutils literal notranslate\"><span class=\"pre\">TestCase</span></code> eller <code class=\"docutils literal notranslate\"><span class=\"pre\">TransactionTestCase</span></code>, men observera att detta kommer att sakta ner testsviten med ungefär 3x.</p>\n<p>Tredjepartsappar eller de som utvecklas mot MyISAM måste ställa in detta; i allmänhet bör du dock utveckla dina egna projekt mot en transaktionsdatabas och använda <code class=\"docutils literal notranslate\"><span class=\"pre\">TestCase</span></code> för de flesta tester, och därmed inte behöva denna inställning.</p>\n<p>Den första serialiseringen går vanligtvis mycket snabbt, men om du vill utesluta vissa appar från denna process (och snabba upp testkörningarna något) kan du lägga till dessa appar i <a class=\"reference internal\" href=\"/sv/5.2/ref/settings/#std-setting-TEST_NON_SERIALIZED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TEST_NON_SERIALIZED_APPS</span></code></a>.</p>\n<p>För att förhindra att serialiserade data laddas två gånger, inaktiverar inställningen <code class=\"docutils literal notranslate\"><span class=\"pre\">serialized_rollback=True</span></code> <a class=\"reference internal\" href=\"/sv/5.2/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 när testdatabasen rensas.</p>\n<aside class=\"version-note version-changed\" data-version=\"5.2\">\n<p class=\"version-note-title\">Changed in Django 5.2</p><p>För <a class=\"reference internal\" href=\"/sv/5.2/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> görs serialiserade migreringsdata tillgängliga under <code class=\"docutils literal notranslate\"><span class=\"pre\">setUpClass()</span></code>.</p>\n</aside>\n</section>\n<section id=\"other-test-conditions\">\n<h3>Andra testförhållanden<a class=\"heading-anchor\" href=\"#other-test-conditions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Oavsett värdet på inställningen <a class=\"reference internal\" href=\"/sv/5.2/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DEBUG</span></code></a> i din konfigurationsfil körs alla Django-tester med :setting:<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">`</span></a>DEBUG`=False. Detta är för att säkerställa att den observerade utmatningen av din kod matchar vad som kommer att ses i en produktionsinställning.</p>\n<p>Cacher rensas inte efter varje test, och om du kör <code class=\"docutils literal notranslate\"><span class=\"pre\">manage.py</span> <span class=\"pre\">test</span> <span class=\"pre\">fooapp</span></code> kan data från testerna infogas i cacheminnet i ett live-system om du kör dina tester i produktion eftersom, till skillnad från databaser, en separat ”testcache” inte används. Detta beteende <a class=\"extlink-ticket reference external\" href=\"https://code.djangoproject.com/ticket/11505\">kan komma att ändras</a> i framtiden.</p>\n</section>\n<section id=\"understanding-the-test-output\">\n<h3>Förstå testutdata<a class=\"heading-anchor\" href=\"#understanding-the-test-output\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>När du kör dina tester kommer du att se ett antal meddelanden när testköraren förbereder sig. Du kan styra detaljnivån i dessa meddelanden med alternativet <code class=\"docutils literal notranslate\"><span class=\"pre\">verbosity</span></code> på kommandoraden:</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>Creating<span class=\"w\"> </span><span class=\"nb\">test</span><span class=\"w\"> </span>database...\nCreating<span class=\"w\"> </span>table<span class=\"w\"> </span>myapp_animal\nCreating<span class=\"w\"> </span>table<span class=\"w\"> </span>myapp_mineral\n</code></pre></div>\n<p>Detta visar att testköraren skapar en testdatabas, enligt beskrivningen i föregående avsnitt.</p>\n<p>När testdatabasen har skapats kommer Django att köra dina tester. Om allt går bra kommer du att se något liknande detta:</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>----------------------------------------------------------------------\nRan<span class=\"w\"> </span><span class=\"m\">22</span><span class=\"w\"> </span>tests<span class=\"w\"> </span><span class=\"k\">in</span><span class=\"w\"> </span><span class=\"m\">0</span>.221s\n\nOK\n</code></pre></div>\n<p>Om testerna misslyckas kommer du dock att se fullständig information om vilka tester som misslyckades:</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><span class=\"o\">======================================================================</span>\nFAIL:<span class=\"w\"> </span>test_was_published_recently_with_future_poll<span class=\"w\"> </span><span class=\"o\">(</span>polls.tests.PollMethodTests<span class=\"o\">)</span>\n----------------------------------------------------------------------\nTraceback<span class=\"w\"> </span><span class=\"o\">(</span>most<span class=\"w\"> </span>recent<span class=\"w\"> </span>call<span class=\"w\"> </span>last<span class=\"o\">)</span>:\n<span class=\"w\">  </span>File<span class=\"w\"> </span><span class=\"s2\">&quot;/dev/mysite/polls/tests.py&quot;</span>,<span class=\"w\"> </span>line<span class=\"w\"> </span><span class=\"m\">16</span>,<span class=\"w\"> </span><span class=\"k\">in</span><span class=\"w\"> </span>test_was_published_recently_with_future_poll\n<span class=\"w\">    </span>self.assertIs<span class=\"o\">(</span>future_poll.was_published_recently<span class=\"o\">()</span>,<span class=\"w\"> </span>False<span class=\"o\">)</span>\nAssertionError:<span class=\"w\"> </span>True<span class=\"w\"> </span>is<span class=\"w\"> </span>not<span class=\"w\"> </span>False\n\n----------------------------------------------------------------------\nRan<span class=\"w\"> </span><span class=\"m\">1</span><span class=\"w\"> </span><span class=\"nb\">test</span><span class=\"w\"> </span><span class=\"k\">in</span><span class=\"w\"> </span><span class=\"m\">0</span>.003s\n\nFAILED<span class=\"w\"> </span><span class=\"o\">(</span><span class=\"nv\">failures</span><span class=\"o\">=</span><span class=\"m\">1</span><span class=\"o\">)</span>\n</code></pre></div>\n<p>En fullständig förklaring av denna felutmatning ligger utanför ramen för detta dokument, men den är ganska intuitiv. Du kan läsa dokumentationen för Pythons <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>-bibliotek för mer information.</p>\n<p>Observera att returkoden för testrunner-skriptet är 1 för varje antal misslyckade tester (oavsett om misslyckandet orsakades av ett fel, ett misslyckat påstående eller en oväntad framgång). Om alla tester godkänns är returkoden 0. Den här funktionen är användbar om du använder testrunner-skriptet i ett shell-skript och behöver testa om det lyckas eller misslyckas på den nivån.</p>\n</section>\n<section id=\"speeding-up-the-tests\">\n<span id=\"speeding-up-tests-auth-hashers\"></span><h3>Snabbare tester<a class=\"heading-anchor\" href=\"#speeding-up-the-tests\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<section id=\"running-tests-in-parallel\">\n<h4>Kör tester parallellt<a class=\"heading-anchor\" href=\"#running-tests-in-parallel\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Så länge dina tester är ordentligt isolerade kan du köra dem parallellt för att få högre hastighet på flerkärnig maskinvara. Se <a class=\"reference internal\" href=\"/sv/5.2/ref/django-admin/#cmdoption-test-parallel\"><code class=\"xref std std-option docutils literal notranslate\"><span class=\"pre\">test</span> <span class=\"pre\">--parallel</span></code></a>.</p>\n</section>\n<section id=\"password-hashing\">\n<h4>Hashing av lösenord<a class=\"heading-anchor\" href=\"#password-hashing\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Standardalgoritmen för lösenordshashning är ganska långsam av designskäl. Om du autentiserar många användare i dina tester kanske du vill använda en anpassad inställningsfil och ställa in <a class=\"reference internal\" href=\"/sv/5.2/ref/settings/#std-setting-PASSWORD_HASHERS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">PASSWORD_HASHERS</span></code></a> till en snabbare hash-algoritm:</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\">PASSWORD_HASHERS</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"s2\">&quot;django.contrib.auth.hashers.MD5PasswordHasher&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>Glöm inte att i <a class=\"reference internal\" href=\"/sv/5.2/ref/settings/#std-setting-PASSWORD_HASHERS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">PASSWORD_HASHERS</span></code></a> även ange den hash-algoritm som används i fixturerna, om någon.</p>\n</section>\n<section id=\"preserving-the-test-database\">\n<h4>Bevara testdatabasen<a class=\"heading-anchor\" href=\"#preserving-the-test-database\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Alternativet <a class=\"reference internal\" href=\"/sv/5.2/ref/django-admin/#cmdoption-test-keepdb\"><code class=\"xref std std-option docutils literal notranslate\"><span class=\"pre\">test</span> <span class=\"pre\">--keepdb</span></code></a> bevarar testdatabasen mellan testkörningar. Det hoppar över åtgärderna för att skapa och förstöra, vilket kan minska tiden för att köra tester avsevärt.</p>\n</section>\n<section id=\"avoiding-disk-access-for-media-files\">\n<h4>Undvika diskåtkomst för mediefiler<a class=\"heading-anchor\" href=\"#avoiding-disk-access-for-media-files\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Klassen:~django.core.files.storage.InMemoryStorage är ett bekvämt sätt att förhindra diskåtkomst för mediefiler. All data sparas i minnet och kasseras sedan efter testkörningen.</p>\n</section>\n</section>\n</section>","rootId":"module-django.test","toc":[{"title":"Skriva tester","anchor":"writing-tests","children":[]},{"title":"Genomföra tester","anchor":"running-tests","children":[{"title":"Testdatabasen","anchor":"the-test-database","children":[]},{"title":"Ordning i vilken testerna utförs","anchor":"order-in-which-tests-are-executed","children":[]},{"title":"Rollback-emulering","anchor":"rollback-emulation","children":[]},{"title":"Andra testförhållanden","anchor":"other-test-conditions","children":[]},{"title":"Förstå testutdata","anchor":"understanding-the-test-output","children":[]},{"title":"Snabbare tester","anchor":"speeding-up-the-tests","children":[{"title":"Kör tester parallellt","anchor":"running-tests-in-parallel","children":[]},{"title":"Hashing av lösenord","anchor":"password-hashing","children":[]},{"title":"Bevara testdatabasen","anchor":"preserving-the-test-database","children":[]},{"title":"Undvika diskåtkomst för mediefiler","anchor":"avoiding-disk-access-for-media-files","children":[]}]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Använda Django","url":"/sv/5.2/topics/"},{"docname":"topics/testing/index","title":"Testning i Django","url":"/sv/5.2/topics/testing/"}],"prev":{"docname":"topics/testing/index","title":"Testning i Django","url":"/sv/5.2/topics/testing/"},"next":{"docname":"topics/testing/tools","title":"Testverktyg","url":"/sv/5.2/topics/testing/tools/"},"formats":{"html":"/sv/5.2/topics/testing/overview/","markdown":"/sv/5.2/topics/testing/overview.md","json":"/sv/5.2/topics/testing/overview.json"},"source":"https://github.com/django/django/blob/stable/5.2.x/docs/topics/testing/overview.txt","official":"https://docs.djangoproject.com/sv/5.2/topics/testing/overview/","inVersions":["6.1","6.0","5.2"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}