14

我开始使用 pytest。我已经配置了 pytest,无论如何我找不到使用 pytest 进行 Django 特定测试的资源。如何使用 测试模型pytest_django

我已经问过一个关于单元测试的问题,

如何有效地测试这个 Django 模型?

我想知道如何用 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 = "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 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__())

感谢您的任何意见。

4

2 回答 2

8

pytest 支持运行 Python unittest.py 样式测试。它旨在利用现有的 unittest 风格的项目来使用 pytest 功能。具体来说,pytest 会自动在测试文件中收集 unittest.TestCase 子类及其测试方法。它将调用典型的 setup/teardown 方法,并且通常会尝试使编写的测试套件在 unittest 上运行,也可以使用 pytest 运行。

给定的测试可以在py.test没有任何修改的情况下进行测试,但是 py.test 使测试更加pythonic。

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 = "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 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

于 2016-04-12T08:41:20.010 回答
7

您可以使用这个将 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 helper: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
于 2016-04-08T19:54:38.263 回答