【问题标题】:how do I efficiently test this Django model?如何有效地测试这个 Django 模型?
【发布时间】:2016-06-01 13:01:23
【问题描述】:

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

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

感谢您提供任何见解。

【问题讨论】:

  • tearDown(self) 中可能会使用self.test_user.delete(),因为如果您使用--keepdb 标志运行测试,它会尝试使用相同的电子邮件再次创建用户并失败。
  • 绝对不是最终结果,但通常值得使用覆盖率来尝试在测试中获得 100% 的语句命中率。在相对较小的 Django 项目中,这通常并不太难。我发现它不是为了找到隐藏在隐藏线上的任何错误,而是更多关于新测试用例的灵感。 coverage.readthedocs.org/en/coverage-4.0.3
  • 我只是要链接到这个 SO 答案,因为看起来测试代码与此处相同。它是公共领域,但值得称赞stackoverflow.com/a/36567915/943773

标签: python django testing testcase django-testing


【解决方案1】:

够安静的。几点注意事项:

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

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 2017-09-06
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 2020-10-25
    • 2020-02-03
    • 1970-01-01
    相关资源
    最近更新 更多