Django Unit Testing - Part 1 Basics

2018/06/04 posted in  Django comments

Testing是寫出好Software的必備條件。它可以讓你推出新功能時有足夠信心你的system可以正常運作,不用人手到處test,也可以及早發現bug,等等等等。

這篇就先看看在Django如何建立基本的test。

Basic Test

from django.test import TestCase
from myapp.models import Animal

class AnimalTestCase(TestCase):
    def setUp(self):
        Animal.objects.create(name="lion", sound="roar")
        Animal.objects.create(name="cat", sound="meow")

    def test_animals_can_speak(self):
        """Animals that can speak are correctly identified"""
        lion = Animal.objects.get(name="lion")
        cat = Animal.objects.get(name="cat")
        self.assertEqual(lion.speak(), 'The lion says "roar"')
        self.assertEqual(cat.speak(), 'The cat says "meow"')
  • Django的test其實背後使用unittest
  • django.test.TestCase,能支援db transaction,而相反unittest.TestCase能省下一些db lock時間,要自己衡量一下
  • TestCase.setUp是準備test data的地方(一般是建立database objects)

可到python unittest module看更多test的做法。

Django Test官方文檔

File Structure

Default

預設建立app的時候,Django自動幫你加了一個tests.py

# some_app/
├── __init__.py
├── apps.py
├── migrations/
├── models.py
├── tests.py  # Here
└── views.py

當你test這個app,用下面的command:

$ ./manage.py test some_app.tests

Django會自動找出some_app.tests裡的所有TestCase

如果你只想run一個TestCase,也可以:

$ ./manage.py test some_app.tests.AnimalTestCase

獨立檔案Structure

TestCase變多,可以分開獨立檔案:

└── tests
    ├── __init__.py
    ├── some_tests.py
    └── other_tests.py