Skip to main content
 首页 » 编程设计

python之我如何有效地测试这个 Django 模型

2024年08月23日29me-sa

我正在为一个网站构建一个身份验证系统,我之前没有使用 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 = "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__()) 

幸运的是所有的通行证,我的问题是, 这些测试是过度、不足还是正常?模型中应该测试什么?是否缺少任何程序?这个测试有什么问题吗??我如何有效地编写测试??

感谢您提供任何见解。

请您参考如下方法:

这就够了。只是几个注意事项:

  1. 无需在tearDown中删除属性
  2. 您忘记在 raise ValueError 行中使用 assertRaises 测试 UserManager。
  3. 您还可以测试由 create_user(来自 UserManager)创建的用户是否可以通过给定的密码和电子邮件进行身份验证(来自 django.contrib.auth)。
  4. 使用 coverage 包来检测哪些行/类/包/语句被遗漏了以进行测试。