使用 class 方法进行参数化,然后使用对象调用该方法

Parametrizing with class method, then calling that method with object

(伪代码) 我有 class 个具有属性的节点:

class Node(WebElement):

    def __init__(self, element):
        super().__init__(element)
        ...

    @property
    def name(self):
        <returns name>

    @property
    def node_id(self):
        <returns node_id>

    @property
    def device_type(self):
        <returns device type>

等等... 我需要创建测试,它将检查节点 属性 是否不是 None(必须进行参数化,管理有数量偏差)

简单的方法是使用 getattr

@pytest.mark.parametrize("property", ["name" ,"node_id" ,"device_type"])
def test_01_device_information(self, property):
    property = request.param
    ...
    for node in nodes:
         assert device.getattr(node, property) is not None

但缺点是,这是动态反射,测试会在运行时间内知道属性是否存在。 IDE syntaxer 不会找出丢失的 属性。测试 运行 整夜...

我可以制作一个属性列表(语法器会发现是否有任何缺失):

        @pytest.mark.parametrize("property", [Node.name ,Node.node_id ,Node.device_type])

有没有办法在 for 循环中的对象 'node' 上调用它?我知道,我可以在 property 上调用 __name__,但我认为可能会有更好或不同的解决方案。 我会感谢你的建议! :)

你可以这样做:

for node in nodes:
    assert property.fget(node) is not None