我在Windows上使用Python 3.6.2上的pytest 3.2.2和Django 1.11.5。
以下代码
import django.test
import pytest
class ParametrizeTest:
@pytest.mark.parametrize("param", ["a", "b"])
def test_pytest(self, param):
print(param)
assert False
按预期工作:
scratch_test.py::ParametrizeTest::test_pytest [a]失败 scratch_test.py::ParametrizeTest::test_pytest[b]失败
但是一旦我改为使用Django的SimpleTestCase
,
像这样:
class ParametrizeTest(django.test.SimpleTestCase):
...
它以
失败TypeError:test_pytest()缺少1个必需的位置参数:'param'
任何人都可以解释原因吗?怎么办呢?
(实际上我甚至需要使用django.test.TestCase
并访问数据库。)
我安装了以下pytest插件:
插件:random-0.2,mock-1.6.2,django-3.1.2,cov-2.5.1
但通过-p no:random
等将其中任何一个(或所有这些)关闭都无济于事。
答案 0 :(得分:4)
Django测试类是unittest.TestCase
子类。
参数化不受支持,这在pytest features in unittest.TestCase
subclasses:
以下pytest功能不起作用,可能永远不会由于不同的设计理念:
如果您需要参数化测试和pytest runner,最好的办法是放弃unittest样式 - 这意味着将setup / teardown移动到fixture(pytest-django
插件已经为您实现了硬件),并使用用于测试的模块级功能。
答案 1 :(得分:4)
谢谢,wim,这个有用的答案。 RTFM,再一次。
为清楚起见,以下是将工作的公式(相当于继承自TestCase
的测试,而不仅仅是SimpleTestCase
)。
确保已安装pytest-django
,然后执行:
import pytest
@pytest.mark.django_db
class ParametrizeTest:
@pytest.mark.parametrize("param", ["a", "b"])
def test_pytest(self, param):
print(param)
assert False
(顺便说一句:有趣的是,我最初决定使用pytest
的原因之一就是这样
使用普通测试函数而不是测试方法的想法吸引了我;
我喜欢轻量级的方法
但是现在我几乎完全使用测试类和方法,
因为我更喜欢他们提供的明确的测试分组。)