使用setup_class进行初始化"冲突"使用参数化选项

时间:2017-01-27 10:35:42

标签: python pytest

我有这个文件:

import numpy as np


class Variables(object):

    def __init__(self, var_name, the_method):

        self.var_name = var_name
        self.the_method = the_method

    def evaluate_v(self):
        var_name, the_method = self.var_name, self.the_method

        if the_method == 'Average':
            return np.average(var_name)

和这个测试文件:

import unittest
import pytest
import numpy as np

from .variables import Variables


class TestVariables():

    @classmethod
    def setup_class(cls):
        var_name = np.array([1, 2, 3])
        the_method = 'Whatever'
        cls.variables = Variables(var_name, the_method)

    @pytest.mark.parametrize(
        "var_name, the_method, expected_output", [
            (np.array([1, 2, 3]), 'Average', 2),
        ])
    def test_evaluate_v_method_returns_correct_results(
        self, var_name, the_method,expected_output):

        var_name, the_method = self.variables.var_name, self.variables.the_method

        obs = self.variables.evaluate_v()  
        assert obs == expected_output

if __name__ == "__main__":
    unittest.main()

现在,我的问题是我在安装程序类中初始化值(var_name,the_method)。

因此,当我在参数化中使用不同的值时,这些值将被忽略。

所以,现在的测试是通过将the_method值设为Whatever而不是Average(我希望在不同的参数化设置中使用)来完成测试。

有没有办法解决这个问题而不会失去setup_class

因为,如果我省略了setup_class,那么确实有效。

1 个答案:

答案 0 :(得分:0)

好吧,您可以使用任何非抛出异常数据将setup_class方法的责任限制为创建变量'实例

@classmethod
    def setup_class(cls):            
        cls.variables = Variables(None, None)

并创建测试

    @pytest.mark.parametrize(
        "var_name, the_method, expected_output", [
            (np.array([1, 2, 3]), 'Average', 2),
            (np.array([1, 2, 3]), 'Whatever', 'whatever you want')
        ])
    def test_evaluate_v_method_returns_correct_results(
        self, var_name, the_method, expected_output):

        self.variables.var_name = var_name
        self.variables.the_method = the_method

        assert self.variables.evaluate_v() == expected_output

但就个人而言,我不认为将None传递给构造函数是一个非常干净的解决方案。我建议每个测试都使参数可选或创建Variables`实例。