使用 pytest-django 在参数化测试之间保存数据
keeping data between parameterized tests with pytest-django
我正在尝试将带有 pytest.parameterize 标记的一系列故事放在一起:
conftest.py:
from django.conf import settings
import pytest
@pytest.fixture(scope='session')
def django_db_modify_db_settings():
pass
@pytest.fixture(scope='session')
def pytest_configure():
settings.configure(
INSTALLED_APPS=[
'django.contrib.contenttypes',
'django.contrib.auth',
],
DATABASES=dict(default=dict(
ENGINE='django.db.backends.sqlite3',
NAME=':memory:',
))
)
test_db.py:
import pytest
from django.contrib.auth.models import Group
@pytest.mark.parametrize('name,count', [
('test', 1,),
('staff', 2),
])
@pytest.mark.django_db(transaction=True)
def test_group(name, count):
Group.objects.create(name=name)
assert Group.objects.count() == count
py.test 输出:
$ py.test test_db.py
============================================ test session starts =============================================
platform linux -- Python 3.7.2, pytest-3.10.1, py-1.5.4, pluggy-0.7.1
rootdir: /home/jpic/src/djcli, inifile:
plugins: mock-1.5.0, django-3.4.2, cov-2.6.0
collected 2 items
test_db.py .F [100%]
================================================== FAILURES ==================================================
____________________________________________ test_group[staff-2] _____________________________________________
name = 'staff', count = 2
@pytest.mark.parametrize('name,count', [
('test', 1,),
('staff', 2),
])
@pytest.mark.django_db(transaction=True)
def test_group(name, count):
Group.objects.create(name=name)
> assert Group.objects.count() == count
E assert 1 == 2
E + where 1 = <bound method BaseManager._get_queryset_methods.<locals>.create_method.<locals>.manager_method of <django.contrib.auth.models.GroupManager object at 0x7f351e01ef98>>()
E + where <bound method BaseManager._get_queryset_methods.<locals>.create_method.<locals>.manager_method of <django.contrib.auth.models.GroupManager object at 0x7f351e01ef98>> = <django.contrib.auth.models.GroupManager object at 0x7f351e01ef98>.count
E + where <django.contrib.auth.models.GroupManager object at 0x7f351e01ef98> = Group.objects
test_db.py:12: AssertionError
如您所见,第一个测试通过,这意味着创建了一个组,剩下了一个组。
在第二个测试中,您可以看到测试失败,因为第一组已经消失。
此实施有效,但我们在摘要中的细节较少,因为这将测试归为一个。
import pytest
from django.contrib.auth.models import Group
story = [
('test', 1,),
('staff', 2),
]
@pytest.mark.django_db(transaction=True)
def test_group():
for name, count in story:
Group.objects.create(name=name)
assert Group.objects.count() == count
作为一种非常快速的技巧,您可以将这两种方法结合起来。
stories = [
('test', 1,),
('staff', 2),
]
param_story = []
final_stories = []
for story in stories:
param_story.append(story)
append_this = list(param_story)
final_stories.append(append_this)
print(final_stories)
>>> [[('test', 1)], [('test', 1), ('staff', 2)]]
然后在参数化标记中:
@pytest.mark.parametrize('name,count', final_stories)
不过,我不确定如何从 name,count
转到列表列表。也许 [name, count] * len(final_stories)
?
我正在尝试将带有 pytest.parameterize 标记的一系列故事放在一起:
conftest.py:
from django.conf import settings
import pytest
@pytest.fixture(scope='session')
def django_db_modify_db_settings():
pass
@pytest.fixture(scope='session')
def pytest_configure():
settings.configure(
INSTALLED_APPS=[
'django.contrib.contenttypes',
'django.contrib.auth',
],
DATABASES=dict(default=dict(
ENGINE='django.db.backends.sqlite3',
NAME=':memory:',
))
)
test_db.py:
import pytest
from django.contrib.auth.models import Group
@pytest.mark.parametrize('name,count', [
('test', 1,),
('staff', 2),
])
@pytest.mark.django_db(transaction=True)
def test_group(name, count):
Group.objects.create(name=name)
assert Group.objects.count() == count
py.test 输出:
$ py.test test_db.py
============================================ test session starts =============================================
platform linux -- Python 3.7.2, pytest-3.10.1, py-1.5.4, pluggy-0.7.1
rootdir: /home/jpic/src/djcli, inifile:
plugins: mock-1.5.0, django-3.4.2, cov-2.6.0
collected 2 items
test_db.py .F [100%]
================================================== FAILURES ==================================================
____________________________________________ test_group[staff-2] _____________________________________________
name = 'staff', count = 2
@pytest.mark.parametrize('name,count', [
('test', 1,),
('staff', 2),
])
@pytest.mark.django_db(transaction=True)
def test_group(name, count):
Group.objects.create(name=name)
> assert Group.objects.count() == count
E assert 1 == 2
E + where 1 = <bound method BaseManager._get_queryset_methods.<locals>.create_method.<locals>.manager_method of <django.contrib.auth.models.GroupManager object at 0x7f351e01ef98>>()
E + where <bound method BaseManager._get_queryset_methods.<locals>.create_method.<locals>.manager_method of <django.contrib.auth.models.GroupManager object at 0x7f351e01ef98>> = <django.contrib.auth.models.GroupManager object at 0x7f351e01ef98>.count
E + where <django.contrib.auth.models.GroupManager object at 0x7f351e01ef98> = Group.objects
test_db.py:12: AssertionError
如您所见,第一个测试通过,这意味着创建了一个组,剩下了一个组。
在第二个测试中,您可以看到测试失败,因为第一组已经消失。
此实施有效,但我们在摘要中的细节较少,因为这将测试归为一个。
import pytest
from django.contrib.auth.models import Group
story = [
('test', 1,),
('staff', 2),
]
@pytest.mark.django_db(transaction=True)
def test_group():
for name, count in story:
Group.objects.create(name=name)
assert Group.objects.count() == count
作为一种非常快速的技巧,您可以将这两种方法结合起来。
stories = [
('test', 1,),
('staff', 2),
]
param_story = []
final_stories = []
for story in stories:
param_story.append(story)
append_this = list(param_story)
final_stories.append(append_this)
print(final_stories)
>>> [[('test', 1)], [('test', 1), ('staff', 2)]]
然后在参数化标记中:
@pytest.mark.parametrize('name,count', final_stories)
不过,我不确定如何从 name,count
转到列表列表。也许 [name, count] * len(final_stories)
?