我有这个文件:
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,那么确实有效。
答案 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`实例。