pytest.mark.parametize with django.test.SimpleTestCase

pytest.mark.parametize with django.test.SimpleTestCase,django,pytest,Django,Pytest,我在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 按预期工作:

我在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::ParameterizeTest::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
等关闭其中任何一个(或全部)都没有帮助。

Django测试类是一个
unittest.TestCase
子类。 不支持参数化,这在以下章节中有记录:


由于不同的设计理念,以下pytest功能不起作用,并且可能永远不会起作用:

  • 装置(自动使用装置除外)
  • 参数化
  • 定制挂钩

如果您需要参数化测试和pytest runner,最好的选择是放弃unittest样式-这意味着将安装/拆卸移动到Fixture中(
pytest django
插件已经为您实现了硬部分),并使用模块级函数进行测试

使用@pytest.mark.django_db 维姆,谢谢你的回答。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
的一个原因是 用简单的测试函数代替测试方法的想法吸引了我; 我喜欢轻量级的方法。
但现在我几乎只使用测试类和方法,
因为我更喜欢它们提供的测试的显式分组。)

这似乎应该是可行的,但是我如何使用Django fixture来设置数据库呢?