gpt4 book ai didi

python - Python 中的单元测试问题 "Imperative shell, functional core"

转载 作者:行者123 更新时间:2023-12-01 07:51:46 24 4
gpt4 key购买 nike

我正在创建一个继承自 NamedTuple 的类(特别是为了不变性)元组中包含三部分数据。我正在覆盖 __repr__()提供一个漂亮的、人类可识别的类表示。然而,自定义__repr__必须对元组中的数据进行一些昂贵的计算才能提供漂亮的表示。因此,我的__repr__函数按以下方式组织:

class MyClass(NamedTuple):
data1: float
data2: MyOtherClass
data3: float


def __repr__():
exp_1 = self.expensive_function1(self.data1, self.data2, self.data3)
exp_2 = self.expensive_function2(self.data1, self.data2, self.data3)

repr_component_1 = MyClass.static_func1(self.data1, exp_1, exp_2)
repr_component_2 = MyClass.static_func2(self.data2, exp_1, exp_2)
repr_component_3 = MyClass.static_func2(self.data3, exp_1, exp_2)

return f"{repr_component_1} {repr_component_2}{repr_component_3}"

代码本身没有问题。它运行良好并且工作正常。我遇到的问题是如何有效地单元测试静态方法 repr_component_1 , repr_component_2 ,和repr_component_3 .

如果MyClass并不特别需要不可变,我可以抛出 exp_1exp_2进入私有(private)类属性并且没有问题。然而,MyClass由于各种原因必须是不可变的。

问题是exp_1exp_2特定于实例的结果,然后作为输入进入静态方法

因此,我能想到测试这个的唯一方法(使用 pytest )如下:

def test_repr_component_1():
a = MyClass(data1, data2, data3)
exp_1 = a.expensive_function1(self.data1, self.data2, self.data3)
exp_2 = b.expensive_function2(self.data1, self.data2, self.data3)
result1 = MyClass.static_func1(a.data1, exp_1, exp_2)
assert result1 == "expected result"

但是,每个测试场景有很多行(我的实际代码有超过五行)!当然,我希望测试很多场景。我以前听说过设置和拆卸的东西,但我不知道这些东西是否适用于这种情况。

想了解一些关于编写这些单元测试的“专业”和Pythonic方式的想法。

编辑:我确实想到使用Python 3.7 dataclass (因为它能够被“卡住”)这将允许我设置 exp_1exp_2作为 __post_init__ 期间的私有(private)属性步骤,但我计划将其设为公共(public)库,并且不想依赖仅拥有 Python >= 3.7 的用户来使其工作。

最佳答案

参数化将帮助您在编写许多场景时减少代码行数:

@pytest.mark.parametrize(
['data1', 'data2', 'data3', 'data_argument', 'static_func', 'expected_result'],
[
[ # scenario 1
data1,
data2,
data3,
data1,
MyClass.static_func1,
'repr_component1'
],
[ # scenario 2
data1,
data2,
data3,
data2,
MyClass.static_func2,
'repr_component2'
]
]
)
def test_repr_component(data1, data2, data3, data_argument, static_func, expected_result):
a = MyClass(data1, data2, data3) # two scenarios use the same code for tests
exp_1 = a.expensive_function1(data1, data2, data3)
exp_2 = a.expensive_function2(data1, data2, data3)
result = static_func1(data_argument, exp_1, exp_2)
assert result == expected_result

关于python - Python 中的单元测试问题 "Imperative shell, functional core",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56173577/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com