使用django.test.SimpleTestCase进行pytest.mark.parametrize

Lut*_*elt 9 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
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等方式将其中任何一个(或所有这些)关闭都无济于事.

wim*_*wim 6

Django测试类是一个unittest.TestCase子类。不支持参数化,这记录unittest.TestCase子类的pytest功能部分


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

  • 夹具(除了autouse夹具)
  • 参数化
  • 定制挂钩

如果您需要参数化测试和pytest运行程序,最好的选择是放弃单元测试样式-这意味着将设置/拆解移动到固定装置中(pytest-django插件已经为您实现了硬部件),并使用模块级功能进行测试。


Lut*_*elt 6

使用@ 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
Run Code Online (Sandbox Code Playgroud)

(顺便说一句,有趣的是,我最初决定使用的一个原因pytest是使用纯测试功能而不是测试方法的想法吸引了我;我喜欢轻量级方法。
但是现在我还是几乎只使用测试类和方法,因为我更喜欢他们提供的测试的明确分组。)