Python 3.x 干燥试验参数化

Python 3.x 干燥试验参数化,python-3.x,pytest,parameterization,Python 3.x,Pytest,Parameterization,我正在寻找一种为我的测试实现自定义参数化逻辑的方法。我的代码倾向于使用多态设计,因此在一次测试中测试所有多态方法感觉是最明智的方法。一个模拟的例子说明了我目前如何布置测试: @mark.parametrize( ("cls", "input", "expected"), [ (ClsA, 0, True), (ClsA, 1, False), (ClsB, 0, False

我正在寻找一种为我的测试实现自定义参数化逻辑的方法。我的代码倾向于使用多态设计,因此在一次测试中测试所有多态方法感觉是最明智的方法。一个模拟的例子说明了我目前如何布置测试:

@mark.parametrize(
    ("cls", "input", "expected"),
    [
        (ClsA, 0, True),
        (ClsA, 1, False),
        (ClsB, 0, False),
        (ClsB, 1, True),
)
在测试中,我会在使用input和expect进行实例化后,对每个类实例调用该方法。感觉(尤其是对于更大的参数集)对使用它的所有参数一次“设置”ClsA、对使用它的所有参数一次“设置”ClsB更有意义。如果您只有一个cls arg,您可以使用:

@mark.parameterize(
    "cls",
    [ClsA],
)
@mark.parameterize(
    ("input", "output"),
    [
         (0, True),
         (1, False),
    ]
)

但是,您不能将此语法与多个cls参数一起使用,因为它将创建不同装饰器的产品,缺少在一个装饰器中指定某些参数以仅与另一个装饰器中的某些参数一起使用的方法。有没有办法实现我想要实现的目标?否则,我必须重复写出同样的论点,这让我感觉很湿。

举一个例子说明这种方法不起作用的地方,就像它适用于你给出的例子一样。看看这个。从你的例子很难判断这是否是一个好的方法。
assert ClsA(0.method()==True
是否真的测试了与
assert ClsB(0.method()==False
相同的东西?还要记住,这样做会限制生产代码与测试兼容。如果您最终实现了
ClsC
,它在初始值设定项中包含两个参数,该怎么办?在我看来,测试更重要的是简洁和表达,而不是枯燥。@Beanbremen先生——第二个例子是一种不起作用的方法。如果您试图扩展逻辑以使用第二个cls,您就不能使用这种方法。@danzel-感谢您提供的关于良好设计的建议-始终对此表示感谢!我认为你链接的问题最接近我想要的,所以我正在考虑我的问题的答案。啊,对不起,我误读了你的例子-对,在这个例子中我同意@danzel。