How can I test this Django model effectively?

I am creating an authentication system for a website, I have no previous testing experience with Django. I wrote some basic tests.

model,

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 

and model manager,

 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 

and my tests

 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 = " testuser@testbase.com " 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__()) 

fortunately, all the passes, and my question is, are these tests exaggerated or exaggerated or normal? What needs to be tested in the model? is there any procedure missing? Is there something wrong with these tests? how to write tests efficiently?

Thank you for any ideas.

+2
python django testing testcase django-testing
source share
1 answer

It is quite quiet. A few notes:

  • No need to delete properties in tearDown
  • You forgot the UserManager tests in the raise ValueError lines with assertRaises .
  • You can also verify that the user created by create_user (from the UserManager) can authenticate (from django.contrib.auth) with a password and email.
  • Use the coverage package to determine which lines / classes / packages / statements were skipped for testing.

Hope this helps!

+3
source share

All Articles