我在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
Run Code Online (Sandbox Code Playgroud)
按预期工作:
scratch_test.py::ParametrizeTest::test_pytest[a] FAILED scratch_test.py::ParametrizeTest::test_pytest[b]失败
但是一旦我改变它以使用Django SimpleTestCase,就像这样:
class ParametrizeTest(django.test.SimpleTestCase):
...
Run Code Online (Sandbox Code Playgroud)
它失败了
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等方式将其中任何一个(或所有这些)关闭都无济于事.
Django测试类是一个unittest.TestCase子类。不支持参数化,这记录在unittest.TestCase子类的pytest功能部分中:
以下pytest功能不起作用,由于不同的设计理念,可能永远不会起作用:
如果您需要参数化测试和pytest运行程序,最好的选择是放弃单元测试样式-这意味着将设置/拆解移动到固定装置中(pytest-django插件已经为您实现了硬部件),并使用模块级功能进行测试。
谢谢,谢谢,这个有用的答案。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
Run Code Online (Sandbox Code Playgroud)
(顺便说一句,有趣的是,我最初决定使用的一个原因pytest是使用纯测试功能而不是测试方法的想法吸引了我;我喜欢轻量级方法。
但是现在我还是几乎只使用测试类和方法,因为我更喜欢他们提供的测试的明确分组。)