Vai al contenuto principale
ProdottiStrumenti desktopTASTECADVisualizzazione disegniTASTEFILESGestione fileTASTEFTPTrasferimento fileTASTESSHSpazio di lavoro remotoTASTEZIPCompressione ed estrazioneStrumenti per sviluppatoriTASTECODEAmbiente di sviluppo integrato per RustTASTESTUDIOAmbiente integrato di sviluppo e testTASTEETLIntegrazione dati (ETL)ServerTASTEREMOTEServer di desktop remotoTASTEGEOServer geospazialeTASTEMAILSpazio di lavoro emailIniziaDownloadDocumentazioneAcquistaTutti i prodotti
Marketplace
Notizie
TecnologiaNotizieNotizie di sviluppo di oggiDocumentazioneLinguaggi di programmazioneRustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDartFramework frontend webNext.jsReactVue.js · NuxtSvelteKitAngularFramework serverSpring BootDjangoFastAPIASP.NET CoreNestJS · ExpressFramework per app e desktopTauriFlutterReact NativeElectronAlgoritmiBasi degli algoritmiAlgoritmi fondamentaliAlgoritmi avanzatiAlgoritmi pratici
CommunityProgettiLog di sviluppoPromptProblemi degli strumenti di IAVetrinaGuida alla community
CollaboraTrasferimento tecnicoRealizzazione del sito webRealizzazione di app desktopPipeline di rilascio e pagamentoPartner commercialeContatti
ServiziDesktop remotoPacchetti di installazione su misura
TASTEDEV
Prodotti

Strumenti desktop

TASTECADApri con leggerezza anche i disegni più complessiTASTEFILESSolo i file che servono, alla massima velocitàTASTEFTPLa via più ordinata per i tuoi fileTASTESSHUn legame più solido tra te e i tuoi serverTASTEZIPComprimi più veloce, estrai più sicuro

Strumenti per sviluppatori

TASTECODEModifica, compila, esegui il debug e testa app Rust in un'unica finestraTASTESTUDIODalla modifica ai test remoti e alle correzioni IA approvateTASTEETLSposta i dati guardando i valori

Server

TASTEREMOTEUn desktop remoto che gira sul tuo serverTASTEGEOUn server geospaziale compatibile con GeoServer, ricostruito in RustTASTEMAILRiprendi il controllo della tua posta

Inizia

DownloadUltime versioni di ogni prodottoDocsCome usare ogni prodottoAcquistaAbbonamenti e licenze perpetueTutti i prodottiTutti i prodotti a colpo d’occhio
Tutti i prodotti
MarketplaceNotizie
Tecnologia

Notizie

Notizie di sviluppo di oggiAnnunci ufficiali su linguaggi, framework, GitHub e IADocumentazioneGuide a linguaggi, framework e algoritmi

Linguaggi di programmazione

RustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDart

Framework

Framework frontend webNext.jsReactVue.js · NuxtSvelteKitAngular
Framework serverSpring BootDjangoFastAPIASP.NET CoreNestJS · Express
Framework per app e desktopTauriFlutterReact NativeElectron

Algoritmi

Basi degli algoritmiAnalisi della complessità · Ordinamento · Ricerca · Strutture dati di base · Alberi e heapAlgoritmi fondamentaliVisita dei grafi · Cammini minimi e alberi ricoprenti · Programmazione dinamica · Algoritmi greedy · Divide et impera · BacktrackingAlgoritmi avanzatiAlgoritmi sulle stringhe · Matematica e teoria dei numeri · Manipolazione dei bit · Alberi di segmenti · Union-FindAlgoritmi praticiStrategia per colloqui di programmazione · Cache LRU · Rate limiting · Hashing consistente
Tutta la documentazione di sviluppo
Community
ProgettiScopri sviluppatori e lavoriLog di sviluppoDecisioni e lezioni appresePromptIstruzioni riutilizzabiliProblemi degli strumenti di IAProblemi e alternative di Claude, Codex, GeminiVetrinaRisultati completatiGuida alla communityCome sviluppiamo in modo aperto
Collabora
Trasferimento tecnicoApp native in Rust ed eguiRealizzazione del sito web10 lingue, account, documentazione e downloadRealizzazione di app desktopRust ed egui, senza WebViewPipeline di rilascio e pagamentoFirma, MSI, deb, rpm, AppImage, hashPartner commercialeConsigliaci e ricevi il 30%ContattiSviluppo, partnership e investimenti
Servizi
Desktop remotoRaggiungi il tuo computer dal browserPacchetti di installazione su misuraSolo il necessario, impostazioni precaricate
Acquista
IT
한국어EnglishDeutschEspañolFrançaisItalianoPortuguês (Brasil)日本語简体中文繁體中文
Accedi
Accedi
TASTEDEV

Dai piccoli strumenti a uno sviluppo migliore.

support@tastedev.netSostieni TASTEDEV
ProdottiGamma di prodottiAcquistaDocsDownloadMarketplaceAssistenza
CommunityProgettiLog di sviluppoPromptProblemi degli strumenti di IAVetrina
NormeInformativa sulla privacyTermini di servizioCondizioni di abbonamentoRimborsiLinee guida della community
AccountAccediRegistrati
Visitatori
Oggi
012345678901234567890123456789012345678901234567890123456789
Ieri
012345678901234567890123456789012345678901234567890123456789
Visualizzazioni totali
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
Società
GXSOFT
Rappresentante
CHOI YOUNG GU
Numero di registrazione
853-44-00368
Indirizzo
9F V24, 351 Gyeongin-ro, Michuhol-gu, Incheon, Republic of Korea
Telefono
+82-10-4404-1523
E-mail
whitecalvin@tastedev.net
Responsabile privacy
CHOI YOUNG GU

© 2026 TASTEDEVLe informazioni sui prodotti si basano su fonti di sviluppo verificate.Rilasciato · in miglioramento

Documentazione di Django
Django
Getting Started with DjangoProject StructureCore ConceptsData and StateTestingDeployment
Discussioni

Guida a Django · 5/6

Testing

Per ora questo capitolo è disponibile solo in inglese.

Django includes a testing framework built on the standard library's unittest. It creates and destroys a test database for you and provides a test client that sends requests without a browser. If you prefer pytest, the pytest-django plugin gives you the same capabilities.

Running tests

Put tests in an app's tests.py or in files whose names start with test inside a tests/ package. manage.py test discovers and runs them.

# Everything
python manage.py test

# One app, one class, one method
python manage.py test polls
python manage.py test polls.tests.QuestionModelTests
python manage.py test polls.tests.QuestionModelTests.test_str

# Keep the test database between runs
python manage.py test --keepdb

# Split the run across several processes
python manage.py test --parallel

Django creates a separate database, named with a test_ prefix, and applies your migrations to it. Your real data is never touched.

Testing models with TestCase

django.test.TestCase wraps each test method in a transaction and rolls it back afterwards, so data created in one test never leaks into another. Data shared by several tests can be created once per class in setUpTestData, which keeps the suite fast.

# polls/tests.py
from datetime import timedelta

from django.test import TestCase
from django.utils import timezone

from .models import Question


class QuestionModelTests(TestCase):
    @classmethod
    def setUpTestData(cls):
        cls.question = Question.objects.create(question_text="Favorite language?")

    def test_str(self):
        self.assertEqual(str(self.question), "Favorite language?")

    def test_future_question_is_not_listed(self):
        Question.objects.create(
            question_text="Future question",
            pub_date=timezone.now() + timedelta(days=30),
        )
        listed = Question.objects.filter(pub_date__lte=timezone.now())
        self.assertQuerySetEqual(listed, [self.question])

For pure functions that never touch the database, SimpleTestCase runs faster.

Testing views with the test client

self.client acts like a minimal browser that sends GET and POST requests. The response also exposes the templates and context used to render it.

from django.contrib.auth import get_user_model
from django.test import TestCase
from django.urls import reverse

from .models import Question


class QuestionViewTests(TestCase):
    def test_index_lists_questions(self):
        Question.objects.create(question_text="First question?")
        response = self.client.get(reverse("polls:index"))
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, "First question?")
        self.assertTemplateUsed(response, "polls/index.html")

    def test_detail_returns_404_for_missing_question(self):
        response = self.client.get(reverse("polls:detail", args=[999]))
        self.assertEqual(response.status_code, 404)

    def test_create_requires_login(self):
        url = reverse("polls:create")
        response = self.client.post(url, {"question_text": "New question?"})
        self.assertEqual(response.status_code, 302)

        user = get_user_model().objects.create_user("kim", password="pass1234")
        self.client.force_login(user)
        response = self.client.post(url, {"question_text": "New question?"})
        self.assertEqual(Question.objects.count(), 1)
Domande su questo capitolo?
Capitolo precedenteData and StateCapitolo successivoDeployment

force_login() logs a user in without checking a password. Build URLs with reverse() rather than hard-coded strings so tests survive URL changes.

Overriding settings and stubbing external calls

Use override_settings to change settings for one test or class, and unittest.mock to replace things that must not really run, such as external API calls.

from unittest import mock

from django.core import mail
from django.test import TestCase, override_settings


@override_settings(EMAIL_BACKEND="django.core.mail.backends.locmem.EmailBackend")
class NotifyTests(TestCase):
    def test_sends_mail(self):
        mail.send_mail("Subject", "Body", "from@example.com", ["to@example.com"])
        self.assertEqual(len(mail.outbox), 1)

    @mock.patch("polls.services.fetch_weather", return_value={"temp": 20})
    def test_uses_weather(self, fetch):
        from polls.services import summary
        self.assertIn("20", summary())
        fetch.assert_called_once()

Django uses the in-memory email backend during tests anyway; the override above just makes it explicit.

pytest-django

If you like pytest's plain assert statements and fixtures, install pytest-django.

python -m pip install pytest pytest-django
# pyproject.toml
[tool.pytest.ini_options]
DJANGO_SETTINGS_MODULE = "mysite.settings"
python_files = ["tests.py", "test_*.py"]
# polls/test_views.py
import pytest
from django.urls import reverse

from polls.models import Question


@pytest.mark.django_db
def test_index(client):
    Question.objects.create(question_text="A pytest question?")
    response = client.get(reverse("polls:index"))
    assert response.status_code == 200
    assert "A pytest question?" in response.content.decode()


@pytest.mark.django_db
def test_admin_index(admin_client):
    response = admin_client.get("/admin/")
    assert response.status_code == 200

Tests that touch the database need @pytest.mark.django_db. Fixtures such as client, admin_client, rf (a RequestFactory) and settings are built in, and existing TestCase classes still run. Measure coverage with coverage run -m pytest or pytest-cov.

Summary

  • python manage.py test runs your suite against a separate test database.
  • TestCase rolls back each test's transaction, and setUpTestData creates shared data once.
  • self.client and reverse() let you check views request by request.
  • pytest-django offers the same features with @pytest.mark.django_db and the client fixture, in less code.

0 commenti

Commenti principaliPrima i più recenti

Accedi · Accedi per lasciare un commento.