2016-04-06 3 views
7

Я начинаю с pytest. Я настроил pytest, так или иначе, я не смог найти ресурс для специфического тестирования Django с помощью pytest. Как проверить модель с помощью pytest_django?Как проверить модель Django с помощью pytest?

я уже задал вопрос о том, модульном тестировании

how do I efficiently test this Django model?

Я хочу знать, как одни и те же тесты могут быть написаны с py.test?

добавление ниже модели и тестов, написанных в unittest.

модель тестируемый,

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 написано

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__()) 

Спасибо за любые входы.

ответ

1

pytest имеет поддержку для выполнения Python тестов unittest.py стиля. Это предназначено для использования существующих проектов в стиле unittest для использования функций pytest. Конкретно, pytest будет автоматически собирать подклассы unittest.TestCase и их методы тестирования в тестовых файлах. Он будет ссылаться на типичные методы настройки/удаления и вообще попытаться сделать тестовые наборы написанными для запуска на unittest, а также запустить с помощью pytest.

Данные испытания могут быть протестированы с использованием py.test без каких-либо изменений, однако py.test делает тесты более питоновскими.

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 

как упомянуто @Sid, вы можете использовать @pytest.mark.django_db маркер (декоратор), чтобы получить доступ к базе данных при выполнении теста без использования django.test.TestCase,

4

Вы можете использовать этот плагин, который интегрирует pytest с Django: https://pytest-django.readthedocs.org/en/latest/tutorial.html

Установка и изменения pytest.ini описаны здесь: http://www.johnmcostaiii.net/2013/django-projects-to-django-apps-converting-the-unit-tests/

Вы найдете пример здесь, начиная с горкой 57. Эта колода будет полезна при тестировании видов, а также моделей и настроек, характерных для моделей тестирования: https://speakerdeck.com/pelme/testing-django-applications-with-py-dot-test-europython-2013

В частности, посмотрите на @ pytest.mark.django_db вспомогательный документ здесь: http://pytest-django.readthedocs.org/en/latest/helpers.html

Здесь приводится копия примера для разрешения доступа к базе данных в тесте, упомянутом в вышеупомянутой палубе. Без mark.django_db тест завершится ошибкой.

import pytest 
@pytest.mark.django_db 
def test_user_count(): 
    assert User.objects.count() == 0