代码之家  ›  专栏  ›  技术社区  ›  ncopiy

在DRF测试中使用pytest参数化

  •  2
  • ncopiy  · 技术社区  · 6 年前

    现在我有这样的代码:

    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'
    

    @pytest.mark.parametrize 内部有测试的装饰器 APITestCase 来自DRF测试课程?
    也许有其他方法可以参数化测试(但不是循环)?

    2 回复  |  直到 6 年前
        1
  •  6
  •   hoefling    6 年前

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

    从python3.4开始,参数化就可以在标准库中使用 subTest :

    class MyTest(APITestCase):
    
        test_ordering_params = [('id', False), ('id', True)]
    
        def test_ordering(self):
            for field, reverse_ordering in self.test_ordering_params:
                with self.subTest(field=field, reverse=reverse_ordering):
                    query = ('-' if reverse_ordering else '') + field
                    resp = self.client.get(reverse('url-name'), {'ordering': query}, format='json')
                    assert resp.data
    

    但是,如果您想从使用 pytest ,考虑离开 unittest -样式类测试来测试函数。使用相同的测试 结合 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
    

    你也可以看看 parameterized 图书馆,提供 皮特斯特

    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
    
        2
  •  4
  •   ar-m-an    6 年前

    ApiTestCase 是的一个子类 unittest.TestCase pytest docs :

    以下pytest特性适用于unittest.TestCase测试用例子类:

    • 标记:skip、skipif、xfail;
    • 自动使用夹具;

    下面的测试 功能不起作用,可能永远不会由于不同的设计

    • 参数化;
    • 定制挂钩;

    在插件和测试套件上。