@contextlib.contextmanager
def connect(port):print("yield 之前")yield Foo(1,2)... # close connectionprint("yield 之后")@pytest.fixture
def equipments(request):r = []for port in ("C1", "C3", "C28"):cm = connect(port)equip = cm.__enter__()request.addfinalizer(functools.partial(cm.__exit__, None,None, None))#测试方法运行完成后执行此方法类似于teardownr.append(equip)print("equipmentsasdfadsfds")return rdef test_compare(equipments):equipments[0]# 先执行 connent 遇到yield 返回 执行equipments 返回到test_compare 执行test_compare后因为加入了request.addfinalizer() 然后会去执行cm.__exit_ 最后执行了yield后的数据 最后结束if __name__ == '__main__':pytest.main(["-s","test_login.py"])