iT邦幫忙

2021 iThome 鐵人賽

DAY 20
1
自我挑戰組

Python 30天自我挑戰系列 第 20

Day20 - 使用Django進行自動化測試 (2)

  • 分享至 

  • xImage
  •  

今天的實作內容主要根據教學網站進行。

接續昨天的內容,今天將實作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

Model

測試程式的重點在於測試我們自己開發的程式,而不是測試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的部分,我們自己開發的內容主要為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())

上一篇
Day19 - 使用Django進行自動化測試 (1)
下一篇
Day21 - 使用Django進行自動化測試 (3)
系列文
Python 30天自我挑戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言