2010-02-02 34 views
27

Tôi chưa bao giờ viết bất kỳ bài kiểm tra nào trong cuộc sống của mình, nhưng tôi muốn bắt đầu viết các bài kiểm tra cho các dự án Django của tôi. Tôi đã đọc một số bài viết về các bài kiểm tra và quyết định cố gắng viết một số bài kiểm tra cho một ứng dụng Django cực kỳ đơn giản hoặc bắt đầu.Viết bài kiểm tra tốt cho các ứng dụng Django

Ứng dụng này có hai quan điểm (một cái nhìn danh sách, và một cái nhìn chi tiết) và một mô hình với bốn lĩnh vực:

class News(models.Model): 
    title = models.CharField(max_length=250) 
    content = models.TextField() 
    pub_date = models.DateTimeField(default=datetime.datetime.now) 
    slug = models.SlugField(unique=True) 

Tôi muốn cho bạn thấy tập tin tests.py tôi và hỏi:

Có hợp lý không?

Tôi thậm chí có thử nghiệm cho đúng thứ không?

Có các phương pháp hay nhất mà tôi không theo dõi và bạn có thể chỉ cho tôi không?

tests.py của tôi (nó chứa 11 kiểm tra):

# -*- coding: utf-8 -*- 
from django.test import TestCase 
from django.test.client import Client 
from django.core.urlresolvers import reverse 
import datetime 
from someproject.myapp.models import News 

class viewTest(TestCase): 
    def setUp(self): 
     self.test_title = u'Test title: bąrekść' 
     self.test_content = u'This is a content 156' 
     self.test_slug = u'test-title-bareksc' 
     self.test_pub_date = datetime.datetime.today() 

     self.test_item = News.objects.create(
      title=self.test_title, 
      content=self.test_content, 
      slug=self.test_slug, 
      pub_date=self.test_pub_date, 
     ) 

     client = Client() 
     self.response_detail = client.get(self.test_item.get_absolute_url()) 
     self.response_index = client.get(reverse('the-list-view')) 

    def test_detail_status_code(self): 
     """ 
     HTTP status code for the detail view 
     """ 
     self.failUnlessEqual(self.response_detail.status_code, 200) 

    def test_list_status_code(self): 
     """ 
     HTTP status code for the list view 
     """ 
     self.failUnlessEqual(self.response_index.status_code, 200) 

    def test_list_numer_of_items(self): 
     self.failUnlessEqual(len(self.response_index.context['object_list']), 1)  

    def test_detail_title(self): 
     self.failUnlessEqual(self.response_detail.context['object'].title, self.test_title)  

    def test_list_title(self): 
     self.failUnlessEqual(self.response_index.context['object_list'][0].title, self.test_title) 

    def test_detail_content(self): 
     self.failUnlessEqual(self.response_detail.context['object'].content, self.test_content)  

    def test_list_content(self): 
     self.failUnlessEqual(self.response_index.context['object_list'][0].content, self.test_content) 

    def test_detail_slug(self): 
     self.failUnlessEqual(self.response_detail.context['object'].slug, self.test_slug)  

    def test_list_slug(self): 
     self.failUnlessEqual(self.response_index.context['object_list'][0].slug, self.test_slug) 

    def test_detail_template(self): 
     self.assertContains(self.response_detail, self.test_title) 
     self.assertContains(self.response_detail, self.test_content) 

    def test_list_template(self):  
     self.assertContains(self.response_index, self.test_title) 

Trả lời

18

Tôi không hoàn hảo trong thử nghiệm nhưng một vài suy nghĩ:

Về cơ bản bạn nên kiểm tra mỗi chức năng, phương pháp, lớp , bất cứ điều gì, bạn đã tự viết.

Điều này ngụ ý rằng bạn không phải thử nghiệm các chức năng, lớp học, v.v. mà khung cung cấp.

Điều đó nói rằng, một kiểm tra nhanh các chức năng thử nghiệm của bạn:

  • test_detail_status_codetest_list_status_code:
    Ok để kiểm tra xem bạn đã cấu hình định tuyến đúng cách hay không. Thậm chí quan trọng hơn khi bạn cung cấp triển khai của riêng mình get_absolute_url().

  • test_list_numer_of_items:
    Ok nếu một số mặt hàng nhất định phải được trả về bởi chế độ xem. Không cần thiết nếu số không quan trọng (tức là tùy ý).

  • test_detail_templatetest_list_template:
    Ok để kiểm tra xem các biến mẫu có được đặt đúng hay không.

  • Tất cả các chức năng khác: Không cần thiết.
    Những gì về cơ bản bạn đang thử nghiệm ở đây là liệu ORM có hoạt động đúng hay không, cho dù các danh sách hoạt động như mong đợi và liệu các thuộc tính đối tượng có thể được truy cập (hay không). Miễn là bạn không thay đổi ví dụ: phương thức save() của một mô hình và/hoặc cung cấp logic tùy chỉnh của bạn, tôi sẽ không kiểm tra điều này. Bạn nên tin tưởng các nhà phát triển khung công tác này hoạt động đúng.

Bạn chỉ nên kiểm tra những gì bạn có (trên) được viết.

Các lớp mô hình có thể là trường hợp đặc biệt. Về cơ bản, bạn phải kiểm tra chúng, như tôi đã nói, nếu bạn cung cấp logic tùy chỉnh. Nhưng bạn cũng nên kiểm tra chúng theo yêu cầu của bạn. Ví dụ. có thể là một trường không được phép là null (hoặc nó phải là một kiểu dữ liệu nhất định, như số nguyên). Vì vậy, bạn nên kiểm tra rằng việc lưu trữ một đối tượng không thành công, nếu nó có giá trị null trong trường này.
Điều này làm không kiểm tra ORM để theo dõi chính xác đặc điểm kỹ thuật của bạn nhưng kiểm tra xem thông số kỹ thuật vẫn đáp ứng các yêu cầu của bạn. Nó có thể là bạn thay đổi mô hình và thay đổi một số thiết lập (bởi cơ hội hoặc bởi vì bạn quên về các yêu cầu).
Nhưng bạn không phải kiểm tra ví dụ: các phương thức như save() hoặc thời tiết bạn có thể truy cập thuộc tính.

Tất nhiên khi bạn sử dụng mã của bên thứ ba lỗi ... mọi thứ có thể khác nhau. Nhưng như Django sử dụng các khung kiểm tra chính nó để xác minh rằng tất cả mọi thứ đang làm việc, tôi sẽ giả sử nó đang làm việc.

Để tổng hợp:
Kiểm tra yêu cầu của bạn, hãy kiểm tra mã của riêng bạn.

Đây chỉ là quan điểm của tôi. Có thể những người khác có đề xuất tốt hơn.

5

Làm bài kiểm tra của bạn thành hai loại hoàn toàn riêng biệt.

  • Kiểm tra mô hình. Đặt các tệp này vào tệp models.py với mô hình của bạn. Các bài kiểm tra này sẽ thực hiện các phương thức trong các lớp mô hình của bạn. Bạn có thể làm CRUD đơn giản (Tạo, Truy xuất, Cập nhật, Xóa) để chỉ đơn giản chứng minh rằng mô hình của bạn hoạt động. Đừng kiểm tra mọi thuộc tính. Làm các mặc định của trường thử nghiệm và các quy tắc save() nếu bạn tò mò.

    Ví dụ: tạo một lớp TestNews tạo, nhận, cập nhật và xóa mục News. Hãy chắc chắn kiểm tra kết quả ngày mặc định. Lớp này nên ngắn gọn và cho điểm. Bạn có thể, nếu ứng dụng của bạn yêu cầu nó, hãy kiểm tra các loại xử lý bộ lọc khác nhau. Mã kiểm tra đơn vị của bạn có thể (và nên) cung cấp các ví dụ về cách "đúng" để lọc News.

  • Kiểm tra giao diện người dùng. Đặt chúng trong một tệp riêng biệt tests.py. Các thử nghiệm này sẽ kiểm tra các chức năng và mẫu xem.

    • Đặt tên cho TestCase bằng "điều kiện" bạn đang tạo. "TestNotLoggedIn". "TestLoggedIn". "TestNoValidThis". "TestNotAllowedToDoThat". setUp của bạn sẽ thực hiện đăng nhập và các bước khác cần thiết để thiết lập điều kiện bắt buộc.

    • Đặt tên cho từng phương pháp thử nghiệm bằng hành động và kết quả. "test_get_noquery_should_list", "test_post_should_validate_with_errors", "test_get_query_should_detail".

Các vấn đề liên quan