Pytest - 在class_method上访问session_scope fixture

时间:2018-02-19 18:15:30

标签: python pytest

我正在使用celery fixture来测试一个项目上的几个任务,我想知道是否有一种方法可以在类方法中访问会话范围夹具(celery fixture是默认的会话范围)引用: @ pytest.mark.usefixture( 'celery_worker') class TasksTest(TestCase):     def test_my_task_a(个体经营):         tas_info = my_task_a.delay()         断言celery_worker.something#访问celery_worker引用会引发错误

1 个答案:

答案 0 :(得分:2)

pytest docs中所述:

  

注意:

     

unittest.TestCase方法无法直接接收fixture参数作为实现可能会导致运行通用unittest.TestCase测试套件的能力。

     

以上usefixturesautouse示例应该有助于将pytest灯具混合到单元测试套件中。

     

您也可以逐步从子类化从unittest.TestCase转移到普通断言,然后开始逐步从完整的pytest功能集中受益。

因此,遵循这个建议,您可以在类级别定义一个“传递”autouse fixture,它接受其他fixture作为参数,并将引用存储在单个测试中应该需要的任何内容:

class TasksTest(TestCase):

    @pytest.fixture(autouse=True)
    def my_celery_passthrough(self, celery_worker, celery_session_worker):
        self.worker = celery_worker
        self.session_worker = celery_session_worker

    def test_spam(self):
        assert 'macbookpro2017' in self.worker.hostname
        assert 'macbookpro2017' in self.session_worker.hostname

但是,让我重复上面引用的最后部分:

  

您也可以逐步从子类化从unittest.TestCase转移到普通断言,然后开始逐步从完整的pytest功能集中受益。

由于您已经在使用pytest不再理解的unittest功能,为什么坚持测试类?只需从一开始就将新测试作为函数编写,这样您就不必引入任何变通方法。对于旧的基于类的测试,您可以暂时保留它们,并在以后重写它们,如果您必须修改它们。