{"title":"Skriva och köra tester","version":"6.1","locale":"sv","docname":"topics/testing/overview","url":"/sv/6.1/topics/testing/overview/","canonical":"https://djangodocs.dev/sv/6.1/topics/testing/overview/","summary":"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.","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\" role=\"note\">\n<p class=\"admonition-title\">Se även</p>\n<p><a class=\"reference internal\" href=\"/sv/6.1/intro/tutorial05/\"><span class=\"doc\">testhandledning</span></a>, <a class=\"reference internal\" href=\"/sv/6.1/topics/testing/tools/\"><span class=\"doc\">referens för testverktyg</span></a> och <a class=\"reference internal\" href=\"/sv/6.1/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\">unittest</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/6.1/topics/testing/tools/#django.test.TestCase\" title=\"django.test.TestCase\"><code class=\"xref py py-class docutils literal notranslate\">django.test.TestCase</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\">unittest.TestCase</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=\"nn\">django.test</span> <span class=\"kn\">import</span> TestCase\n<span class=\"kn\">from</span> <span class=\"nn\">myapp.models</span> <span class=\"kn\">import</span> Animal\n\n\n<span class=\"k\">class</span> <span class=\"nc\">AnimalTestCase</span><span class=\"p\">(</span>TestCase<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">setUp</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        Animal<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;cat&quot;</span><span class=\"p\">,</span> sound<span class=\"o\">=</span><span class=\"s2\">&quot;meow&quot;</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</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=\"sd\">&quot;&quot;&quot;Animals that can speak are correctly identified&quot;&quot;&quot;</span>\n        cat <span class=\"o\">=</span> Animal<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>name<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>assertEqual<span class=\"p\">(</span>cat<span class=\"o\">.</span>speak<span class=\"p\">(),</span> <span class=\"s1\">&#39;The cat says &quot;meow&quot;&#39;</span><span class=\"p\">)</span>\n\n        cat<span class=\"o\">.</span>sound <span class=\"o\">=</span> <span class=\"s2\">&quot;hiss&quot;</span>\n        cat<span class=\"o\">.</span>save<span class=\"p\">(</span>update_fields<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;sound&quot;</span><span class=\"p\">])</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span>assertEqual<span class=\"p\">(</span>cat<span class=\"o\">.</span>speak<span class=\"p\">(),</span> <span class=\"s1\">&#39;The cat says &quot;hiss&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\">unittest.TestCase</code></a>) i alla filer vars namn börjar med <code class=\"docutils literal notranslate\">test</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\">unittest</code></a>, se Python-dokumentationen.</p>\n<aside class=\"admonition-where-should-the-tests-live admonition\" role=\"note\">\n<p class=\"admonition-title\">Var ska testerna genomföras?</p>\n<p>Standardmallen <a class=\"reference internal\" href=\"/sv/6.1/ref/django-admin/#django-admin-startapp\"><code class=\"xref std std-djadmin docutils literal notranslate\">startapp</code></a> skapar en fil med namnet <code class=\"docutils literal notranslate\">tests.py</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\">test_models.py</code>, <code class=\"docutils literal notranslate\">test_views.py</code>, <code class=\"docutils literal notranslate\">test_forms.py</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/6.1/topics/testing/tools/#django.test.TestCase\" title=\"django.test.TestCase\"><code class=\"xref py py-class docutils literal notranslate\">django.test.TestCase</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\">unittest.TestCase</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\">unittest.TestCase</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/6.1/ref/django-admin/#django-admin-test\"><code class=\"xref std std-djadmin docutils literal notranslate\">test</code></a> i verktyget <code class=\"docutils literal notranslate\">manage.py</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>$ ./manage.py <span class=\"nb\">test</span>\n</code></pre></div>\n<p>Testupptäckt bygger på modulens unittest <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\">inbyggda testupptäckt</span></a>. Som standard upptäcks tester i alla filer med namnet <code class=\"docutils literal notranslate\">test*.py</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\">./manage.py test</code>. Varje testetikett kan vara en fullständig Python-punktad sökväg till ett paket, en modul, en <code class=\"docutils literal notranslate\">TestCase</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$ ./manage.py <span class=\"nb\">test</span> animals.tests\n\n<span class=\"c1\"># Run all the tests found within the &#39;animals&#39; package</span>\n$ ./manage.py <span class=\"nb\">test</span> animals\n\n<span class=\"c1\"># Run just one test case class</span>\n$ ./manage.py <span class=\"nb\">test</span> animals.tests.AnimalTestCase\n\n<span class=\"c1\"># Run just one test method</span>\n$ ./manage.py <span class=\"nb\">test</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>$ ./manage.py <span class=\"nb\">test</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\">-p</code> (eller <code class=\"docutils literal notranslate\">--pattern</code>) om dina testfiler har andra namn än <code class=\"docutils literal notranslate\">test*.py</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>$ ./manage.py <span class=\"nb\">test</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\">Ctrl-C</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\">Ctrl-C</code> kan alltså vara mycket användbart om du glömmer att ange alternativet <a class=\"reference internal\" href=\"/sv/6.1/ref/django-admin/#cmdoption-test-failfast\"><code class=\"xref std std-option docutils literal notranslate\">--failfast</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\">Ctrl-C</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\" role=\"note\">\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\">python -Wa manage.py test</code>. Flaggan <code class=\"docutils literal notranslate\">-Wa</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/6.1/ref/django-admin/#cmdoption-test-keepdb\"><code class=\"xref std std-option docutils literal notranslate\">test --keepdb</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/6.1/ref/django-admin/#cmdoption-test-noinput\"><code class=\"xref std std-option docutils literal notranslate\">test --noinput</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\">test_</code> till värdet för varje <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-NAME\"><code class=\"xref std std-setting docutils literal notranslate\">NAME</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\">DATABASES</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/6.1/ref/settings/#std-setting-DATABASE-TEST\"><code class=\"xref std std-setting docutils literal notranslate\">TEST</code></a> i <code class=\"xref std std-setting docutils literal notranslate\">DATABASER</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/6.1/ref/settings/#std-setting-TEST_NAME\"><code class=\"xref std std-setting docutils literal notranslate\">NAME</code></a> i ordlistan <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-DATABASE-TEST\"><code class=\"xref std std-setting docutils literal notranslate\">TEST</code></a> för en viss databas i <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\">DATABASES</code></a>.</p>\n<p>På PostgreSQL behöver <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-USER\"><code class=\"xref std std-setting docutils literal notranslate\">USER</code></a> också läsbehörighet till den inbyggda databasen <code class=\"docutils literal notranslate\">postgres</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/6.1/ref/settings/#std-setting-DATABASE-ENGINE\"><code class=\"xref std std-setting docutils literal notranslate\">ENGINE</code></a>, <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-USER\"><code class=\"xref std std-setting docutils literal notranslate\">USER</code></a>, <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-HOST\"><code class=\"xref std std-setting docutils literal notranslate\">HOST</code></a>, etc. Testdatabasen skapas av den användare som anges av <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-USER\"><code class=\"xref std std-setting docutils literal notranslate\">USER</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/6.1/ref/settings/#std-setting-TEST_CHARSET\"><code class=\"xref std std-setting docutils literal notranslate\">CHARSET</code></a> TEST. Om du använder MySQL kan du också använda alternativet <a class=\"reference internal\" href=\"/sv/6.1/ref/settings/#std-setting-TEST_COLLATION\"><code class=\"xref std std-setting docutils literal notranslate\">COLLATION</code></a> för att styra den specifika kollationering som används av testdatabasen. Se <a class=\"reference internal\" href=\"/sv/6.1/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\" role=\"note\">\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 implementationer av <a class=\"reference internal\" href=\"/sv/6.1/ref/applications/#django.apps.AppConfig.ready\" title=\"django.apps.AppConfig.ready\"><code class=\"xref py py-meth docutils literal notranslate\">ready()</code></a>.</p>\n</aside>\n<aside class=\"admonition admonition-seealso\" role=\"note\">\n<p class=\"admonition-title\">Se även</p>\n<p>The <a class=\"reference internal\" href=\"/sv/6.1/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\">TestCase</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/6.1/topics/testing/tools/#django.test.TestCase\" title=\"django.test.TestCase\"><code class=\"xref py py-class docutils literal notranslate\">TestCase</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/6.1/topics/testing/tools/#django.test.SimpleTestCase\" title=\"django.test.SimpleTestCase\"><code class=\"xref py py-class docutils literal notranslate\">SimpleTestCase</code></a>, inklusive <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\">TransactionTestCase</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\">unittest.TestCase</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/6.1/topics/testing/tools/#django.test.TransactionTestCase\" title=\"django.test.TransactionTestCase\"><code class=\"xref py py-class docutils literal notranslate\">TransactionTestCase</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/6.1/ref/django-admin/#cmdoption-test-shuffle\"><code class=\"xref std std-option docutils literal notranslate\">test --shuffle</code></a> och <a class=\"reference internal\" href=\"/sv/6.1/ref/django-admin/#cmdoption-test-reverse\"><code class=\"xref std std-option docutils literal notranslate\">--reverse</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\">TestCase</code>-tester och inte i <code class=\"docutils literal notranslate\">TransactionTestCase</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\">TransactionTestCase</code> som <a class=\"reference internal\" href=\"/sv/6.1/topics/testing/tools/#django.test.LiveServerTestCase\" title=\"django.test.LiveServerTestCase\"><code class=\"xref py py-class docutils literal notranslate\">LiveServerTestCase</code></a> och <a class=\"reference internal\" href=\"/sv/6.1/ref/contrib/staticfiles/#django.contrib.staticfiles.testing.StaticLiveServerTestCase\" title=\"django.contrib.staticfiles.testing.StaticLiveServerTestCase\"><code class=\"xref py py-class docutils literal notranslate\">StaticLiveServerTestCase</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\">serialized_rollback</code> till <code class=\"docutils literal notranslate\">True</code> i kroppen av <code class=\"docutils literal notranslate\">TestCase</code> eller <code class=\"docutils literal notranslate\">TransactionTestCase</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\">TestCase</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/6.1/ref/settings/#std-setting-TEST_NON_SERIALIZED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">TEST_NON_SERIALIZED_APPS</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\">serialized_rollback=True</code> <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\">post_migrate</code></a>-signalen när testdatabasen rensas.</p>\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/6.1/ref/settings/#std-setting-DEBUG\"><code class=\"xref std std-setting docutils literal notranslate\">DEBUG</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\">manage.py test fooapp</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\">verbosity</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=\"nb\">test</span> database...\nCreating table myapp_animal\nCreating table 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=\"m\">22</span> tests <span class=\"k\">in</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: test_was_published_recently_with_future_poll <span class=\"o\">(</span>polls.tests.PollMethodTests<span class=\"o\">)</span>\n----------------------------------------------------------------------\nTraceback <span class=\"o\">(</span>most recent call last<span class=\"o\">)</span>:\n  File <span class=\"s2\">&quot;/dev/mysite/polls/tests.py&quot;</span>, line <span class=\"m\">16</span>, <span class=\"k\">in</span> test_was_published_recently_with_future_poll\n    self.assertIs<span class=\"o\">(</span>future_poll.was_published_recently<span class=\"o\">()</span>, False<span class=\"o\">)</span>\nAssertionError: True is not False\n\n----------------------------------------------------------------------\nRan <span class=\"m\">1</span> <span class=\"nb\">test</span> <span class=\"k\">in</span> <span class=\"m\">0</span>.003s\n\nFAILED <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\">unittest</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<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/6.1/ref/django-admin/#cmdoption-test-parallel\"><code class=\"xref std std-option docutils literal notranslate\">test --parallel</code></a>.</p>\n</section>\n<section id=\"password-hashing\">\n<span id=\"speeding-up-tests-auth-hashers\"></span><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/6.1/ref/settings/#std-setting-PASSWORD_HASHERS\"><code class=\"xref std std-setting docutils literal notranslate\">PASSWORD_HASHERS</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>PASSWORD_HASHERS <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/6.1/ref/settings/#std-setting-PASSWORD_HASHERS\"><code class=\"xref std std-setting docutils literal notranslate\">PASSWORD_HASHERS</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/6.1/ref/django-admin/#cmdoption-test-keepdb\"><code class=\"xref std std-option docutils literal notranslate\">test --keepdb</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 id=\"using-setuptestdata-to-create-test-data\">\n<h4>Använda <code class=\"docutils literal notranslate\">setUpTestData</code> för att skapa testdata<a class=\"heading-anchor\" href=\"#using-setuptestdata-to-create-test-data\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Att flytta gemensamma testdata till <a class=\"reference internal\" href=\"/sv/6.1/topics/testing/tools/#django.test.TestCase.setUpTestData\" title=\"django.test.TestCase.setUpTestData\"><code class=\"xref py py-meth docutils literal notranslate\">TestCase.setUpTestData()</code></a> minskar antalet gånger testerna behöver skapa data. Användning av <a class=\"reference internal\" href=\"/sv/6.1/topics/testing/tools/#django.test.TestCase.setUpTestData\" title=\"django.test.TestCase.setUpTestData\"><code class=\"xref py py-meth docutils literal notranslate\">TestCase.setUpTestData()</code></a> skapar testdata en gång per klass, medan <a class=\"reference external\" href=\"https://docs.python.org/3/library/unittest.html#unittest.TestCase.setUp\" title=\"(in Python v3.14)\"><code class=\"xref py py-meth docutils literal notranslate\">TestCase.setUp()</code></a> skapar testdata en gång per test.</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":[]},{"title":"Använda setUpTestData för att skapa testdata","anchor":"using-setuptestdata-to-create-test-data","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/index","title":"Testning i Django","url":"/sv/6.1/topics/testing/"},"next":{"docname":"topics/testing/tools","title":"Testverktyg","url":"/sv/6.1/topics/testing/tools/"},"formats":{"html":"/sv/6.1/topics/testing/overview/","markdown":"/sv/6.1/topics/testing/overview.md","json":"/sv/6.1/topics/testing/overview.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/topics/testing/overview.txt","official":"https://docs.djangoproject.com/sv/6.1/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"]}