在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方法,但是有一些限制,后面的文章中会讲到。