Cách thêm kiểm thử đơn vị vào dự án Django của bạn
Gần như không thể xây dựng các trang web hoạt động hoàn hảo ngay lần đầu tiên mà không có lỗi. Vì lý do đó, bạn cần kiểm tra ứng dụng web của bạn để tìm ra những lỗi này và chủ động khắc phục chúng. Để nâng cao hiệu quả của các bài kiểm tra, người ta thường chia nhỏ việc kiểm thử thành các đơn vị kiểm tra các chức năng cụ thể của ứng dụng web. Thực hành này được gọi là kiểm thử đơn vị . Nó giúp phát hiện lỗi dễ dàng hơn vì các bài kiểm tra tập trung vào các phần (đơn vị) nhỏ trong dự án của bạn một cách độc lập với các phần khác. Kiểm tra một trang web có thể là một nhiệm vụ phức tạp phải thực hiện vì nó được tạo thành từ nhiều lớp logic như xử lý các yêu cầu HTTP, xác thực biểu mẫu và kết xuất các mẫu. Tuy nhiên Django cung cấp một bộ công cụ mà làm cho thử nghiệm liền mạch ứng dụng web của bạn. Trong Django, cách ưa thích để kiểm tra ghi là sử dụng Python unittest module , mặc dù nó có thể sử dụng các khuôn khổ thử nghiệm khác.
Trong hướng dẫn này, bạn sẽ cài đặt một bộ thử nghiệm trong dự án Django của bạn và viết các bài kiểm tra đơn vị cho các mô hình và chế độ xem trong ứng dụng của bạn. Bạn sẽ chạy các bài kiểm tra này, phân tích kết quả của chúng và học cách tìm ra nguyên nhân của các bài kiểm tra không đạt.
Yêu cầu
Trước khi bắt đầu hướng dẫn này, bạn cần những thứ sau:
- Django được cài đặt trên server của bạn với môi trường lập trình được cài đặt . Để thực hiện việc này, bạn có thể làm theo một trong các hướng dẫn Cách cài đặt Django Web Framework và Cài đặt Môi trường Lập trình của ta .
- Một dự án Django được tạo với các mô hình và khung nhìn. Trong hướng dẫn này, ta đã theo dự án từ của ta phát triển Django loạt hướng dẫn.
Bước 1 - Thêm bộ thử nghiệm vào ứng dụng Django của bạn
 Bộ thử nghiệm trong Django là tập hợp tất cả các trường hợp thử nghiệm trong tất cả các ứng dụng trong dự án của bạn. Để làm cho nó có thể cho các tiện ích thử nghiệm Django để khám phá ra trường hợp thử nghiệm mà bạn có, bạn viết các trường hợp thử nghiệm trong các kịch bản có tên bắt đầu với test . Trong bước này, bạn sẽ tạo cấu trúc folder  và file  cho bộ thử nghiệm  của bạn , đồng thời tạo một trường hợp thử nghiệm trống trong đó.
 Nếu bạn đã theo dõi loạt bài hướng dẫn Phát triển Django , bạn sẽ có một ứng dụng Django được gọi là blogsite .
Hãy tạo một folder để chứa tất cả các tập lệnh thử nghiệm của ta . Đầu tiên, kích hoạt môi trường ảo:
- cd ~/my_blog_app 
- . env/bin/activate 
Sau đó,  chuyển  đến folder  ứng dụng blogsite , folder  chứa các file  models.py và views.py , rồi tạo một folder  mới có tên là tests :
- cd ~/my_blog_app/blog/blogsite 
- mkdir tests 
Tiếp theo, bạn sẽ biến folder  này thành một gói Python, vì vậy hãy thêm file  __init__.py :
- cd ~/my_blog_app/blog/blogsite/tests 
- touch __init__.py 
Bây giờ, bạn sẽ thêm một file để thử nghiệm các mô hình của bạn và một file khác để kiểm tra chế độ xem của bạn:
- touch test_models.py 
- touch test_views.py 
Cuối cùng, bạn sẽ tạo một trường hợp thử nghiệm trống trong test_models.py . Bạn  cần  nhập lớp Django TestCase và biến nó thành một lớp siêu cấp của lớp trường hợp thử nghiệm  của bạn . Sau đó, bạn sẽ thêm các phương thức vào trường hợp thử nghiệm này để kiểm tra tính logic trong các mô hình của bạn. Mở file  test_models.py :
- nano test_models.py 
Bây giờ hãy thêm mã sau vào file :
from django.test import TestCase  class ModelsTestCase(TestCase):     pass  Đến đây bạn  đã thêm thành công một bộ thử nghiệm vào ứng dụng blogsite . Tiếp theo, bạn sẽ điền thông tin chi tiết của trường hợp thử nghiệm mô hình trống mà bạn đã tạo tại đây.
Bước 2 - Kiểm tra mã Python của bạn
 Trong bước này, bạn sẽ kiểm tra tính logic của mã được viết trong file  models.py . Đặc biệt, bạn sẽ thử nghiệm phương pháp save của mô hình Post  đảm bảo  nó tạo ra slug chính xác của tiêu đề bài đăng khi được gọi.
 Hãy bắt đầu bằng cách xem mã bạn đã có trong file  models.py  của bạn  để biết phương pháp save của mô hình Post :
- cd ~/my_blog_app/blog/blogsite 
- nano models.py 
Bạn sẽ thấy như sau:
class Post(models.Model):     ...     def save(self, *args, **kwargs):         if not self.slug:             self.slug = slugify(self.title)         super(Post, self).save(*args, **kwargs)     ...  Ta  có thể thấy rằng nó kiểm tra xem bài viết sắp được lưu có giá trị slug hay không, và nếu không, nó sẽ gọi slugify để tạo giá trị slug cho nó. Đây là loại logic bạn  có thể cần  kiểm tra  đảm bảo  rằng các slugs thực sự được tạo ra khi lưu một bài đăng.
Đóng file .
 Để kiểm tra điều này, hãy quay lại test_models.py :
- nano test_models.py 
Sau đó, cập nhật nó thành phần sau, thêm vào các phần được đánh dấu:
from django.test import TestCase from django.template.defaultfilters import slugify from blogsite.models import Post   class ModelsTestCase(TestCase):     def test_post_has_slug(self):         """Posts are given slugs correctly when saving"""         post = Post.objects.create(title="My first post")          post.author = "John Doe"         post.save()         self.assertEqual(post.slug, slugify(post.title)) Phương pháp mới này test_post_has_slug tạo một bài đăng mới với tiêu đề "My first post" , sau đó đặt cho bài viết đó là tác giả và lưu bài đăng. Sau đó, bằng cách sử dụng assertEqual phương pháp từ Python unittest module, nó kiểm tra xem các slug cho bài là đúng. Phương thức khẳng định assertEqual kiểm tra xem hai đối số được truyền vào nó có bằng nhau hay không như được xác định bởi toán tử "==" và tạo ra lỗi nếu chúng không giống nhau.
 Lưu và thoát test_models.py .
 Đây là một ví dụ về những gì có thể được kiểm tra. Bạn càng thêm logic vào dự án  của bạn , thì càng có nhiều thứ để kiểm tra. Nếu bạn thêm nhiều logic hơn vào phương thức save hoặc tạo phương thức mới cho mô hình Post ,  bạn cần  thêm nhiều thử nghiệm hơn tại đây. Bạn có thể thêm chúng vào phương thức test_post_has_slug hoặc tạo các phương pháp thử nghiệm mới, nhưng tên của chúng phải bắt đầu bằng test .
 Bạn đã tạo thành công một trường hợp thử nghiệm cho mô hình Post trong đó bạn khẳng định rằng các  slug  được tạo chính xác sau khi lưu. Trong bước tiếp theo, bạn sẽ viết một trường hợp thử nghiệm để kiểm tra các lượt xem.
Bước 3 - Sử dụng Ứng dụng khách thử nghiệm của Django
 Trong bước này, bạn sẽ viết một trường hợp thử nghiệm kiểm tra chế độ xem bằng  ứng dụng client  thử nghiệm Django. Ứng dụng khách thử nghiệm là một lớp Python hoạt động như một trình duyệt web giả, cho phép bạn kiểm tra chế độ xem và tương tác với ứng dụng Django  của bạn  giống như cách  user  làm. Bạn có thể truy cập  ứng dụng client  thử nghiệm bằng cách tham self.client trong các phương pháp thử nghiệm  của bạn . Ví dụ: hãy để  ta  tạo một trường hợp thử nghiệm trong test_views.py . Đầu tiên, hãy mở file  test_views.py :
- nano test_views.py 
Sau đó thêm những thứ sau:
from django.test import TestCase   class ViewsTestCase(TestCase):     def test_index_loads_properly(self):         """The index page loads properly"""         response = self.client.get('your_server_ip:8000')         self.assertEqual(response.status_code, 200) ViewsTestCase chứa phương thức test_index_loads_properly sử dụng client  thử nghiệm Django để truy cập trang index  của trang web ( http:// your_server_ip :8000 , trong đó your_server_ip là địa chỉ IP của  server  bạn đang sử dụng). Sau đó, phương pháp kiểm tra sẽ kiểm tra xem phản hồi có mã trạng thái là 200 ,  nghĩa là  trang đã phản hồi mà không có bất kỳ lỗi nào. Do đó, bạn có thể chắc chắn rằng khi  user  truy cập, nó cũng sẽ phản hồi mà không có lỗi.
Ngoài mã trạng thái, bạn có thể đọc về các thuộc tính khác của phản hồi ứng dụng client thử nghiệm mà bạn có thể kiểm tra trong trang Phản hồi kiểm tra tài liệu Django .
Trong bước này, bạn đã tạo một trường hợp thử nghiệm để kiểm tra rằng chế độ xem hiển thị trang index hoạt động mà không có lỗi. Hiện có hai trường hợp thử nghiệm trong bộ thử nghiệm của bạn. Trong bước tiếp theo, bạn sẽ chạy chúng để xem kết quả của chúng.
Bước 4 - Chạy thử nghiệm của bạn
  Đến đây bạn  đã hoàn thành việc xây dựng một bộ thử nghiệm cho dự án, đã đến lúc thực hiện các thử nghiệm này và xem kết quả của chúng. Để chạy các bài kiểm tra, hãy  chuyển  đến folder  blog (chứa file  manage.py của ứng dụng):
- cd ~/my_blog_app/blog 
Sau đó chạy chúng với:
- python manage.py test 
Bạn sẽ thấy kết quả tương tự như sau trong terminal của bạn :
OutputCreating test database for alias 'default'... System check identified no issues (0 silenced). .. ---------------------------------------------------------------------- Ran 2 tests in 0.007s  OK Destroying test database for alias 'default'... Trong  kết quả  này, có hai dấu chấm .. , mỗi dấu chấm đại diện cho một trường hợp thử nghiệm đã qua.  Đến đây bạn  sẽ sửa đổi test_views.py để kích hoạt thử nghiệm không thành công. Trước tiên, hãy mở file  bằng:
- nano test_views.py 
Sau đó, thay đổi mã được đánh dấu thành:
from django.test import TestCase   class ViewsTestCase(TestCase):     def test_index_loads_properly(self):         """The index page loads properly"""         response = self.client.get('your_server_ip:8000')         self.assertEqual(response.status_code, 404) Ở đây bạn đã thay đổi mã trạng thái từ 200 thành 404 . Bây giờ, hãy chạy lại kiểm tra từ folder  của bạn với manage.py :
- python manage.py test 
Bạn sẽ thấy kết quả sau:
OutputCreating test database for alias 'default'... System check identified no issues (0 silenced). .F ====================================================================== FAIL: test_index_loads_properly (blogsite.tests.test_views.ViewsTestCase) The index page loads properly ---------------------------------------------------------------------- Traceback (most recent call last):   File "~/my_blog_app/blog/blogsite/tests/test_views.py", line 8, in test_index_loads_properly     self.assertEqual(response.status_code, 404) AssertionError: 200 != 404  ---------------------------------------------------------------------- Ran 2 tests in 0.007s  FAILED (failures=1) Destroying test database for alias 'default'... Bạn thấy rằng có một thông báo lỗi mô tả cho bạn biết tập lệnh, trường hợp thử nghiệm và phương pháp không thành công. Nó cũng cho bạn biết nguyên nhân của lỗi, mã trạng thái không bằng 404 trong trường hợp này, với thông báo AssertionError: 200 != 404 . AssertionError ở đây được nêu ra ở dòng mã được đánh dấu trong file  test_views.py :
from django.test import TestCase   class ViewsTestCase(TestCase):     def test_index_loads_properly(self):         """The index page loads properly"""         response = self.client.get('your_server_ip:8000')         self.assertEqual(response.status_code, 404) Nó cho bạn biết rằng khẳng định là sai, nghĩa là mã trạng thái phản hồi ( 200 ) không phải là những gì được mong đợi ( 404 ). Trước thông báo thất bại, bạn có thể thấy rằng hai dấu chấm .. giờ đã chuyển thành .F , cho bạn biết rằng trường hợp thử nghiệm đầu tiên đã vượt qua trong khi trường hợp thứ hai thì không.
Kết luận
 Trong hướng dẫn này, bạn đã tạo một bộ thử nghiệm trong dự án Django  của bạn , thêm các trường hợp thử nghiệm vào mô hình thử nghiệm và xem logic, học cách chạy thử nghiệm và phân tích kết quả thử nghiệm. Bước tiếp theo, bạn có thể tạo các tập lệnh thử nghiệm mới cho mã Python không có trong models.py và views.py .
Sau đây là một số bài viết có thể hữu ích khi xây dựng và thử nghiệm các trang web với Django:
- Tài liệu Kiểm tra Đơn vị Django
- Loạt bài hướng dẫn Scaling Django
Bạn cũng có thể xem trang chủ đề Django của ta để biết thêm các hướng dẫn và dự án.
Các tin liên quan
 

