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

时间:2018-01-10 16:44:57

标签: 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

按预期工作:

  

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等将其中任何一个(或所有这些)关闭都无济于事。

2 个答案:

答案 0 :(得分:4)

Django测试类是unittest.TestCase子类。  参数化不受支持,这在pytest features in unittest.TestCase subclasses

部分中有说明

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

  • 灯具(autouse灯具除外)
  • 参数化
  • 自定义挂钩

如果您需要参数化测试和pytest runner,最好的办法是放弃unittest样式 - 这意味着将setup / teardown移动到fixture(pytest-django插件已经为您实现了硬件),并使用用于测试的模块级功能。

答案 1 :(得分:4)

使用@ pytest.mark.django_db

谢谢,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的原因之一就是这样 使用普通测试函数而不是测试方法的想法吸引了我; 我喜欢轻量级的方法 但是现在我几乎完全使用测试类和方法, 因为我更喜欢他们提供的明确的测试分组。)