今天的實作內容主要根據教學網站進行。
接續昨天的內容,今天將實作model和form的測試程式。
使用以下指令即開始自動化測試,此指令會將專案資料夾下所有符合test*.py檔名格式的程式進行自動化測試。
python manage.py test
若想只執行特定程式,則以以下指令進行。 (引用自教學網站)
python3 manage.py test catalog.tests # Run the specified module
python3 manage.py test catalog.tests.test_models # Run the specified module
python3 manage.py test catalog.tests.test_models.YourTestClass # Run the specified class
python3 manage.py test catalog.tests.test_models.YourTestClass.test_one_plus_one_equals_two # Run the specified method
測試程式的重點在於測試我們自己開發的程式,而不是測試Django原有功能。
在Model中,我們主要進行的是設定欄位及其規格,和部分客製化開發的Method。
故在測試環節,我們可以測試:
欄位設定是否符合規格,例如label、最大長度。
Method回傳內容是否符合預期。
於test_models.py中,import Django的測試模組,開發Author的Model測試,並於初始化階段新增一個Author供其他測試方法使用。
from django.test import TestCase
# Create your tests here.
from track.models import Author
class AuthorModelTest(TestCase):
@classmethod
def setUpTestData(cls):
Author.objects.create(authorname='A')
def test_authorname_max_length(self):
author=Author.objects.get(authorname='A')
max_length = author._meta.get_field('authorname').max_length
self.assertEquals(max_length,30)
def test_authorname_label(self):
author=Author.objects.get(authorname='A')
field_label = author._meta.get_field('authorname').verbose_name
self.assertEquals(field_label,'author name')
def test_authorid_label(self):
author=Author.objects.get(authorname='A')
field_label = author._meta.get_field('authorid').verbose_name
self.assertEquals(field_label,'author id')
def test_object_name_is_authorname(self):
author=Author.objects.get(authorname='A')
expected_object_name = author.authorname
self.assertEqual(expected_object_name, str(author))
在Form的部分,我們自己開發的內容主要為Form所使用的欄位、顯示內容、與欄位檢核。
故在測試環節,可以對於以下環節進行測試:
欄位設定是否符合規格,例如label、最大長度、顯示的輔助資訊。
欄位檢核:Django本身提供的欄位類型檢核不需要另外測試,例如如果我們在forms.py中設定了UrlField,則我們不需要另外測試此欄位的格式是否為URL。但對於我們自己開發的客製化檢核機制,則還是需要進行測試,例如網域是否符合系統支援範圍。
於test_models.py中,import Django的測試模組,開發TrackBookForm的測試。
from django.test import TestCase
# Create your tests here.
from track.forms import TrackBookForm
class TrackBookFormTest(TestCase):
def test_oriurl_label(self):
form = TrackBookForm()
self.assertEqual(form.fields['oriurl'].label, '網址')
def test_oriurl_help_text(self):
form = TrackBookForm()
self.assertEqual(form.fields['oriurl'].help_text, '輸入小說主頁的網址')
def test_oriurl_max_length(self):
form = TrackBookForm()
self.assertEqual(form.fields['oriurl'].max_length, 100)
def test_oriurl_is_valid(self):
url = 'http://www.jjwxc.net/onebook.php?novelid=3860813'
form_data = {'oriurl': url}
form = TrackBookForm(data = form_data)
self.assertTrue(form.is_valid())
def test_oriurl_is_invalid(self):
url = 'https://m.qidian.com/book/1023422452.html'
form_data = {'oriurl': url}
form = TrackBookForm(data = form_data)
self.assertFalse(form.is_valid())