如何使用所有可能的构造函数参数排列测试对象/类?

2024-04-25 13:05:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下一个要用pytest测试的类:

class Analysis(object, metaclass=abc.ABCMeta):

    def __init__(self, filters, and_operator, filters_comb_type):
        self.filters = filters
        self.andOperator = and_operator
        self.filtersComb_type = filters_comb_type

    def _generate_defaultfilters_combination(self):
        ...

    def _generate_allfilters_combinations(self):
        ...

    def _check_filters(self, pattern_indexes, direction=None):
        ...

因此,我想为filtersand_operatorfilters_comb_type创建许多可能的Analysis(),使用一组不同的可能值

因此,我使用pytest编写了下一个代码:

import pytest
from src.statistical_analysis.analysis import Analysis, FiltersCombinationType
from tests.analysis_filters.mocks_analysis_filter import *


@pytest.fixture(params=[[],
                        [MockAllwaysTrueAnalysisFilter()],
                        [MockAllwaysFalseAnalysisFilter()],
                        [MockEvenTrueOddFalseAnalysisFilter()],
                        [MockAllwaysTrueAnalysisFilter(), MockAllwaysFalseAnalysisFilter(), MockAllwaysFalseAnalysisFilter()]])
def filters(request):
    return request.param


@pytest.fixture(params=[True, False])
def and_operator(request):
    return request.param


@pytest.fixture(params=[FiltersCombinationType.ONLY_DEFAULTS,
                        FiltersCombinationType.ONE_COMBINATION,
                        FiltersCombinationType.ALL_COMBINATIONS])
def filters_comb_type(request):
    return request.param


@pytest.fixture
def analysis():
    a = Analysis(filters, and_operator, filters_comb_type)
    return a

因此,如果我已经很好地理解了analysis()函数,它将创建analysis()对象的所有可能组合

但是,当我想编写代码来测试分析类的3种方法时,我的问题就来了,因为如果我这样写:

def test_check_filters(analysis):
    ...

测试将使用fixture中创建的所有分析对象调用它,但是现在我如何将每个Analysis与check_filters()方法的预期返回值进行比较呢

我想知道当我们想要测试一个类的方法时,哪一个是正确的方法,该方法创建了一个具有不同构造函数参数的类的许多实例


Tags: and方法selfreturnpytestrequestdeftype