pytest.mark.parametize with django.test.SimpleTestCase
我在Windows上的Python 3.6.2上使用pytest 3.2.2和Django 1.11.5 下面的代码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 按预期工作:
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来设置数据库呢?