Mar*_*rty 9 python django django-testing pytest pytest-django
我开始使用pytest.我已经配置了pytest,无论如何我都找不到使用pytest进行Django特定测试的资源.如何测试模型pytest_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
Run Code Online (Sandbox Code Playgroud)
和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__())
Run Code Online (Sandbox Code Playgroud)
感谢您的任何意见.
pytest 支持运行 Python unittest.py 样式测试。它旨在利用现有的单元测试风格的项目来使用 pytest 功能。具体来说,pytest 会自动在测试文件中收集 unittest.TestCase 子类及其测试方法。它将调用典型的设置/拆卸方法,并通常尝试使编写的测试套件在 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
Run Code Online (Sandbox Code Playgroud)
正如@Sid 所提到的,您可以@pytest.mark.django_db在运行测试时使用标记(装饰器)来访问数据库而不使用django.test.TestCase,
您可以使用这个将 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7041 次 |
| 最近记录: |