2016-04-06 22 views
7

Tôi đang bắt đầu với pytest. Tôi đã cấu hình pytest, dù sao tôi không thể tìm thấy một nguồn lực trên thử nghiệm cụ thể Django với pytest. Làm cách nào để kiểm tra mô hình với pytest_django?Làm thế nào để kiểm tra một mô hình Django với pytest?

Tôi đã hỏi một câu hỏi về unittesting,

how do I efficiently test this Django model?

Tôi muốn biết làm thế nào các cuộc thử nghiệm tương tự có thể được viết với py.test?

thêm bên dưới mô hình và các bài kiểm tra được viết không liên quan.

mô hình được kiểm tra là,

class User(AbstractBaseUser, PermissionsMixin): 
    username = models.CharField(max_length=25, unique=True, error_messages={ 
     'unique': 'The username is taken' 
    }) 
    first_name = models.CharField(max_length=60, blank=True, null=True) 
    last_name = models.CharField(max_length=60, blank=True, null=True) 
    email = models.EmailField(unique=True, db_index=True, error_messages={ 
     'unique': 'This email id is already registered!' 
    }) 

    is_active = models.BooleanField(default=True) 
    is_staff = models.BooleanField(default=False) 

    date_joined = models.DateTimeField(auto_now_add=True) 

    USERNAME_FIELD = 'email' 
    REQUIRED_FIELDS = ['username',] 


    objects = UserManager() 

    def get_full_name(self): 
     return ' '.join([self.first_name, self.last_name]) 

    def get_short_name(self): 
     return self.email 

    def __unicode__(self): 
     return self.username 

unittest viết,

class SettingsTest(TestCase):  
    def test_account_is_configured(self): 
     self.assertTrue('accounts' in INSTALLED_APPS) 
     self.assertTrue('accounts.User' == AUTH_USER_MODEL) 


class UserTest(TestCase): 
    def setUp(self): 
     self.username = "testuser" 
     self.email = "[email protected]" 
     self.first_name = "Test" 
     self.last_name = "User" 
     self.password = "z" 

     self.test_user = User.objects.create_user(
      username=self.username, 
      email=self.email, 
      first_name=self.first_name, 
      last_name=self.last_name 
     ) 

    def test_create_user(self): 
     self.assertIsInstance(self.test_user, User) 

    def test_default_user_is_active(self): 
     self.assertTrue(self.test_user.is_active) 

    def test_default_user_is_staff(self): 
     self.assertFalse(self.test_user.is_staff) 

    def test_default_user_is_superuser(self): 
     self.assertFalse(self.test_user.is_superuser) 

    def test_get_full_name(self): 
     self.assertEqual('Test User', self.test_user.get_full_name()) 

    def test_get_short_name(self): 
     self.assertEqual(self.email, self.test_user.get_short_name()) 

    def test_unicode(self): 
     self.assertEqual(self.username, self.test_user.__unicode__()) 

Cảm ơn bạn cho bất kỳ đầu vào.

Trả lời

1

pytest đã hỗ trợ cho việc chạy Python kiểm tra phong cách unittest.py. Điều này có nghĩa là để tận dụng các dự án kiểu hiện đại không nhất thiết để sử dụng các tính năng độc nhất. Cụ thể, pytest sẽ tự động thu thập các lớp con unittest.TestCase và các phương thức thử nghiệm của chúng trong các tệp thử nghiệm. Nó sẽ gọi các phương thức thiết lập/teardown điển hình và thường cố gắng làm cho các bộ thử nghiệm được viết để chạy trên unittest, cũng chạy bằng cách sử dụng pytest.

Các thử nghiệm đã cho có thể được kiểm tra với py.test mà không có bất kỳ sửa đổi nào, tuy nhiên py.test làm cho các thử nghiệm trở nên bổ dưỡng hơn.

class SettingsTest(TestCase):  
    def test_account_is_configured(self): 
     assert 'accounts' in INSTALLED_APPS 
     assert 'accounts.User' == AUTH_USER_MODEL 


class UserTest(TestCase): 
    def setUp(self): 
     self.username = "testuser" 
     self.email = "[email protected]" 
     self.first_name = "Test" 
     self.last_name = "User" 
     self.password = "z" 

     self.test_user = User.objects.create_user(
      username=self.username, 
      email=self.email, 
      first_name=self.first_name, 
      last_name=self.last_name 
     ) 

    def test_create_user(self): 
     assert isinstance(self.test_user, User) 

    def test_default_user_is_active(self): 
     assert self.test_user.is_active 

    def test_default_user_is_staff(self): 
     assert not self.test_user.is_staff 

    def test_default_user_is_superuser(self): 
     assert not self.test_user.is_superuser 

    def test_get_full_name(self): 
     assert self.test_user.get_full_name() == 'Test User' 

    def test_get_short_name(self): 
     assert self.test_user.get_short_name() == self.email 

    def test_unicode(self): 
     assert self.test_user.__unicode__() == self.username 

như @Sid đề cập, bạn có thể sử dụng @pytest.mark.django_db marker (trang trí) để truy cập vào cơ sở dữ liệu khi chạy một thử nghiệm mà không sử dụng django.test.TestCase,

4

Bạn có thể sử dụng plugin này tích hợp pytest với Django: https://pytest-django.readthedocs.org/en/latest/tutorial.html

Việc thiết lập và thay đổi pytest.ini được mô tả ở đây: http://www.johnmcostaiii.net/2013/django-projects-to-django-apps-converting-the-unit-tests/

Bạn sẽ tìm thấy ví dụ của bạn ở đây bắt đầu từ slide 57. Bộ bài này sẽ hữu ích trong việc kiểm tra lượt xem cũng như các mô hình và cài đặt cụ thể cho các mô hình thử nghiệm: https://speakerdeck.com/pelme/testing-django-applications-with-py-dot-test-europython-2013

Cụ thể xem @ pytest.mark.django_db helper docu mented here: http://pytest-django.readthedocs.org/en/latest/helpers.html

Ví dụ cho phép truy cập db trong thử nghiệm cũng được đề cập trong phần trên được sao chép tại đây. Nếu không có mark.django_db thì thử nghiệm sẽ thất bại.

import pytest 
@pytest.mark.django_db 
def test_user_count(): 
    assert User.objects.count() == 0 
Các vấn đề liên quan