2016-02-19 9 views
2

Я создаю систему аутентификации для веб-сайта, у меня нет предыдущего опыта тестирования с Django. Я написал несколько базовых тестов.Как я могу эффективно протестировать эту модель Django?

модель,

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 

и менеджер модели,

class UserManager(BaseUserManager): 
    def create_user(self, email, password=None, **kwargs): 
     if not email: 
      raise ValueError('Enter Email address') 

     if not kwargs.get('username'): 
      raise ValueError('Enter Username') 

     account = self.model(
      email=self.normalize_email(email), username=kwargs.get('username') 
     ) 

     account.set_password(password) 
     account.save() 

     return account 

    def create_superuser(self, email, password, **kwargs): 
     account = self.create_user(email, password, **kwargs) 

     account.is_superuser = True 
     account.save() 

     return account 

и мои тесты,

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 tearDown(self): 
     del self.username 
     del self.email 
     del self.first_name 
     del self.last_name 
     del self.password 

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

к счастью, все проходит, и мой вопрос, эти тесты переборщить или преувеличить или нормально? Что нужно тестировать в модели? есть ли какая-либо процедура отсутствует? что-то не так с этими тестами? как я могу эффективно писать тесты?

Благодарим вас за любые идеи.

+0

В 'tearDown (self)' возможно, 'self.test_user.delete()', потому что если вы запустите тест с флагом '--keepdb', он попытается создать пользователя снова с тем же адресом электронной почты и терпят неудачу. – C14L

+0

Определенно не конечная игра, но обычно стоит использовать покрытие, чтобы попытаться получить 100% заявлений, попавших в ваши тесты. Обычно это не слишком сложно в относительно небольших проектах Django. Я нахожу, что речь идет о поиске ошибок, скрывающихся на скрытых линиях, но больше о вдохновении для новых тестовых случаев. https://coverage.readthedocs.org/en/coverage-4.0.3/ – DaveBensonPhillips

ответ

3

Это достаточно тихо. Несколько примечаний:

  1. Нет необходимости удалять свойства в tearDown
  2. Вы забыли тесты UserManager в линиях raise ValueError с использованием assertRaises.
  3. Вы также можете проверить, что пользователь, созданный create_user (от UserManager), может authenticate (от django.contrib.auth) указанным паролем и электронной почтой.
  4. Используйте пакет coverage, чтобы определить, какие строки/классы/пакеты/заявления были пропущены для проверки.

Надеюсь, это поможет!

 Смежные вопросы

  • Нет связанных вопросов^_^