Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 使用pytest参数化和DRF测试_Django_Django Rest Framework_Pytest_Django Testing_Pytest Django - Fatal编程技术网

Django 使用pytest参数化和DRF测试

Django 使用pytest参数化和DRF测试,django,django-rest-framework,pytest,django-testing,pytest-django,Django,Django Rest Framework,Pytest,Django Testing,Pytest Django,现在我有这样的代码: from rest_framework.test import APITestCase class MyTestClass(ApiTestCase): fixtures = ['some_fixtures.json', ] @pytest.mark.parametrize('field, reverse_ordering', [ ('id', False), ('id', True)]) def test_orde

现在我有这样的代码:

from rest_framework.test import APITestCase

class MyTestClass(ApiTestCase):
    fixtures = ['some_fixtures.json', ]

    @pytest.mark.parametrize('field, reverse_ordering', [
        ('id', False),
        ('id', True)])
    def test_ordering(self, field, reverse_ordering):
        # some test function
每次因该错误而失败时:

======================================================================
ERROR: test_ordering (my_module.tests.MyTestClass)
----------------------------------------------------------------------
TypeError: test_ordering() missing 2 required positional arguments: 'field' and 'reverse_ordering'
如何使用DRF tests类中的
@pytest.mark.parametize
装饰器和
APITestCase
中的测试?

也许有其他方法可以参数化测试(但不是循环)

ApiTestCase
unittest.TestCase
的一个子类,它不支持如下所述的参数化:

以下pytest功能适用于unittest.TestCase子类:

  • 标记:skip、skipif、xfail
  • 汽车夹具
下面的测试 由于不同的设计,功能不起作用,可能永远也不会起作用 哲学:

  • 固定装置(自动使用固定装置除外,见下文)
  • 参数化
  • 定制挂钩
第三方插件可能工作正常,也可能不正常,这取决于 在插件和测试套件上

也许有其他方法可以参数化测试(但不是循环)

自Python 3.4以来,可以在标准库中使用以下参数进行参数化:

但是,如果希望从使用<代码> PyTest获得真正的好处,请考虑从<代码> UNITTest< /C> >样式类测试转移到测试函数。使用

pytest
pytest-django
插件进行相同的测试:

import pytest
from rest_framework.test import APIClient

@pytest.fixture
def apiclient():
    return APIClient()

@pytest.mark.parametrize('field, reverse_ordering', [('id', False), ('id', True)])
def test_ordering(apiclient, db, field, reverse_ordering):
    query = ('-' if reverse_ordering else '') + field
    resp = apiclient.get(reverse('url-name'), {'ordering': query}, format='json')
    assert resp.data
编辑
您还可以查看这个库,它为测试类方法提供了类似于
pytest
的参数化。例如:

from parameterized import parameterized


class MyTest(APITestCase):

    @parameterized.expand([('id', False), ('id', True)])
    def test_ordering(self, field, reverse_ordering):
        query = ('-' if reverse_ordering else '') + field
        resp = self.client.get(reverse('url-name'), {'ordering': query}, format='json')
        assert resp.data

我在这里更新了问题(最后一行)。没关系,我不能用。但是我能用什么来参数化呢?我现在用的是
子测试
,但我不喜欢它看起来的样子。我的所有测试类都是从我自己特定的
BaseTestClass(ApiTestCase)
继承的。(我的意思是,我不能为单独的测试函数重写它)根据我的经验,驻留在基本测试类中的任何功能都可以被重构为一个fixture,最终导致更少的样板代码。但是当然,如果您已经有数百个
unittest
样式的测试,那么重构所有这些测试是一项需要立即完成的艰巨任务。您还可以看看
参数化的
库,它为测试类方法提供了类似pytest的参数化。我已经用一个用法示例更新了答案。谢谢,我会用它的!很高兴我能帮忙!
from parameterized import parameterized


class MyTest(APITestCase):

    @parameterized.expand([('id', False), ('id', True)])
    def test_ordering(self, field, reverse_ordering):
        query = ('-' if reverse_ordering else '') + field
        resp = self.client.get(reverse('url-name'), {'ordering': query}, format='json')
        assert resp.data