Thứ tư, 06/05/2020 | 00:00 GMT+7

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:

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.pyviews.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 :

~ / my_blog_app / blog / blogsite / tests / test_models.py
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:

~ / my_blog_app / blog / blogsite / models.py
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:

~ / my_blog_app / blog / blogsite / tests / test_models.py
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:

~ / my_blog_app / blog / blogsite / tests / 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, 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 :

Output
Creating 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:

~ / my_blog_app / blog / blogsite / tests / 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) 

Ở đâ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:

Output
Creating 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 :

~ / my_blog_app / blog / blogsite / tests / 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.pyviews.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:

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.


Tags:

Các tin liên quan