pytest 测试方法互相调用的正确姿势

在iOS UI 自动化测试过程中,会遇到一些场景,例如:

1、test_login、test_logout是两个测试方法,但是在测试多次登录的过程中肯定需要退出登录才能进行下次登录,所以涉及到了在测试方法中调用其他测试方法的情况;

2、可能还有场景是,在做iOS UI 自动化专项测试的时候,要统计每次设备开流各节点的时间,在执行相应测试方法的时候,如果app是未登录状态,需要先登录,这样也需要调用test_login方法。

而在 pytest 中,测试方法之间的调用应该尽量避免,因为 pytest 旨在以独立、隔离的方式执行测试。测试方法的目的应该是验证单一功能,而不是依赖其他测试的执行结果。测试方法之间的直接调用违背了这一原则。
然而,在某些情况下,可能会有需要在一个测试方法中调用另一个测试方法的情况。通常,推荐的做法是将公共逻辑提取到 fixture 中,然后在需要的测试方法中使用这些 fixture,而不是直接调用其他测试方法。

方法1:使用 pytest fixture 共享登录和登出逻辑
推荐的做法是将登录和登出的逻辑提取到 fixture 中,这样可以在多个测试方法中复用。

import pytest

# 定义登录和登出逻辑的 fixture
@pytest.fixture
def login():
    print("Logging in")
    # 模拟登录逻辑
    assert True  # 假设登录成功
    yield
    print("Logging out")
    # 模拟注销逻辑
    assert True  # 假设注销成功

# 使用 login fixture 的测试方法
def test_login(login):
    print("Executing test_login")
    # 登录逻辑已经通过 fixture 执行了
    # 这里执行登录后需要验证的内容
    assert True  # 登录成功的测试

def test_logout(login):
    print("Executing test_logout")
    # 注销逻辑已经通过 fixture 执行了
    # 这里执行注销后需要验证的内容
    assert True  # 注销成功的测试

方法2:直接在 test_login 中调用 test_logout
如果真的想直接在一个测试中调用另一个测试,可以简单地在一个测试中调用另一个测试函数,但这并不符合 pytest 的推荐做法,因为它破坏了测试的独立性。

def test_login():
    print("Executing test_login")
    # 执行登录操作
    assert True  # 假设登录成功
    test_logout()  # 调用 test_logout

def test_logout():
    print("Executing test_logout")
    # 执行注销操作
    assert True  # 假设注销成功

这种做法虽然可以执行 test_logout,但它让 test_logout 变得依赖于 test_login,而这不是测试框架推荐的做法。通过这种方式调用test_logout(),并不会按两条用例执行,测试test_logout()被当作普通方法执行。

方法3:把test_login测试方法再独立成一个普通方法,例如,叫login_app,这样就避免了测试方法之间的依赖。

方法4:也是最不推荐的方式,就是下面这种方式,如果采用这种方式,那么test_logout()会被当作一条测试用例执行,就不是单独执行一条test_login那样了

pytest.main(['-k', 'test_logout', '--tb=no'])

【总结】 

1、使用 fixture 进行共享和复用是更为符合 pytest 推荐的最佳实践,也能保证测试更加模块化、易于维护;

2、把对应的测试方法在单独抽象出一个普通的方法;

3、直接调用test_xxxx方法,但是有一些限制,后面的文章中会讲到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值