Django มี testing framework ในตัว (ขยายจาก unittest ของ Python) พร้อมเครื่องมือที่ออกแบบมาเฉพาะสำหรับเว็บแอปพลิเคชัน — test client สำหรับจำลอง request, ระบบ fixtures/ฐานข้อมูลที่สร้าง test database แยกต่างหาก และตัวช่วยสำหรับการทดสอบ model, view และ form
test case พื้นฐาน
from django.test import TestCase
class ArticleModelTest(TestCase):
def setUp(self):
# runs before each test; data created here is rolled back after
self.article = Article.objects.create(title="Test", body="...")
def test_str(self):
self.assertEqual(str(self.article), "Test")
def test_default_published(self):
self.assertFalse(self.article.published)
TestCase ห่อหุ้มแต่ละ test ไว้ใน transaction ของฐานข้อมูลที่ถูก roll back หลังจากนั้น ดังนั้น test จึงแยกจากกันและไม่ปนเปื้อนกัน — และมันใช้ test database แยกต่างหาก (สร้าง/ทำลายโดยอัตโนมัติ) ไม่เคยแตะข้อมูลจริงของคุณ
การทดสอบ view ด้วย test client
class ArticleViewTest(TestCase):
def test_list_view(self):
Article.objects.create(title="Hello")
response = self.client.get("/articles/") # simulate a GET request
self.assertEqual(response.status_code, 200)
self.assertContains(response, "Hello") # the title appears in the HTML
def test_create_requires_login(self):
response = self.client.post("/articles/create/", {"title": "X"})
self.assertEqual(response.status_code, 302) # redirected to login
def test_authenticated_create(self):
self.client.login(username="ann", password="pw") # log in for the test
response = self.client.post("/articles/create/", {"title": "New", "body": "..."})
self.assertEqual(Article.objects.count(), 1)
test client จำลอง HTTP request ไปยัง view ของคุณ (GET/POST พร้อม login, session ฯลฯ) โดยไม่ต้องมีเซิร์ฟเวอร์ที่กำลังรัน — ให้คุณทดสอบวงจร request/response ทั้งหมด, status code และเนื้อหาที่ render ออกมา
การทดสอบ DRF API
from rest_framework.test import APITestCase
class ArticleAPITest(APITestCase):
def test_create_article(self):
response = self.client.post("/api/articles/", {"title": "X", "body": "..."}, format="json")
self.assertEqual(response.status_code, 201)
self.assertEqual(response.data["title"], "X")
เครื่องมือและแนวปฏิบัติที่มีประโยชน์
✓ setUpTestData — create shared read-only data ONCE per class (faster than setUp)
✓ Factories (factory_boy) — generate test data cleanly instead of manual creation
✓ pytest-django — many teams prefer pytest's cleaner syntax over unittest
✓ Coverage.py — measure test coverage
✓ Mock external services (APIs, email) so tests are fast and deterministic
✓ Run: python manage.py test (or pytest)
ควรทดสอบอะไร
Models → custom methods, validation, properties
Views → status codes, correct data, permissions/auth, form handling
Forms/Serializers → validation logic (valid + invalid cases)
Business logic → the core domain rules
ทำไมจึงสำคัญ
การทดสอบเป็นสิ่งจำเป็นสำหรับการสร้างแอปพลิเคชัน Django ที่เชื่อถือได้และดูแลรักษาได้ และ testing framework ในตัวของ Django — ที่ออกแบบมาเฉพาะสำหรับเว็บแอปพลิเคชัน — ทำให้มันเข้าถึงได้และมีประสิทธิภาพ ดังนั้นการเข้าใจมันจึงสำคัญทั้งต่อคุณภาพของโค้ดและในฐานะมาตรฐานวิชาชีพ
framework มีเครื่องมือเฉพาะสำหรับเว็บที่ทำให้การทดสอบแอป Django เป็นไปได้จริง: test client จำลอง HTTP request ไปยัง view (จัดการ GET/POST, การ authenticate, session) เพื่อให้คุณทดสอบวงจร request/response ทั้งหมด — status code, เนื้อหาที่ render, redirect, permission — โดยไม่ต้องมีเซิร์ฟเวอร์ที่กำลังรัน ซึ่งสำคัญยิ่งเพราะ view คือที่ที่พฤติกรรมของแอปส่วนใหญ่อยู่
test database อัตโนมัติ (สร้างใหม่และทำลายหลังจากนั้น โดยแต่ละ test ถูกห่อหุ้มใน transaction ที่ roll back) รับประกันว่า test แยกจากกันและไม่เคยแตะข้อมูลจริง ทำให้มันปลอดภัยและทำซ้ำได้
การเข้าใจวิธีทดสอบ layer หลัก — model (เมธอดแบบกำหนดเอง, การ validate), view (status code, ข้อมูล, auth/permission, การจัดการ form ผ่าน test client), form/serializer (ตรรกะการ validate ทั้งกรณี input ที่ถูกและไม่ถูกต้อง) และ business logic — ครอบคลุมขอบเขตเชิงปฏิบัติของการทดสอบแอปพลิเคชัน Django และการรู้จักเครื่องมืออย่าง APITestCase สำหรับ DRF API, setUpTestData/factory สำหรับข้อมูล test ที่มีประสิทธิภาพ และการ mock external service เพื่อให้ test เร็วและคาดเดาได้ สะท้อนแนวปฏิบัติการทดสอบที่ครบเครื่อง
แอปพลิเคชัน Django ที่ทดสอบดีจะจับ regression ได้, เปิดทางให้ refactor ได้อย่างมั่นใจ และเป็นเอกสารบันทึกพฤติกรรมที่คาดหวัง ในขณะที่การออกแบบที่ตระหนักถึงเว็บของ framework (โดยเฉพาะ test client และ test database) ทำให้การทดสอบอย่างละเอียดง่ายกว่าการสร้างเองมาก
เนื่องจากการทดสอบเป็นพื้นฐานของการพัฒนาซอฟต์แวร์อย่างมืออาชีพ และ Django ให้การรองรับในตัวที่ยอดเยี่ยมซึ่งออกแบบมาเฉพาะสำหรับฟีเจอร์ของมัน การรู้วิธีเขียน test ที่มีประสิทธิภาพข้าม layer model/view/form เป็นความรู้ที่สำคัญและเกี่ยวข้องบ่อย ซึ่งแยกแยะนักพัฒนาที่สร้างแอปพลิเคชันที่ทนทานและดูแลรักษาได้ ออกจากผู้ที่ส่งมอบโค้ดที่เปราะบางและไม่ผ่านการทดสอบ
