一、自动化脚本实例对比
下面是一条用例,使用pytest框架,放在一个类中,两种实现方式:
1.1 setup_class初始化方式
1. 优点:
- 代码结构清晰,setup_class 和 teardown_class 看起来像传统的类级别的 setup 和 teardown 方法。
2. 缺点:
-
使用 autouse=True 的 fixture 作为类方法可能不是最佳实践,因为 fixture 通常不是类的一部分,而是独立的函数。
-
teardown_class 实际上并不是在每个测试方法之后调用,而是在整个类中的所有测试方法之后调用一次。这与 setup_class 的行为不一致,可能会导致误解
1.2 fixture初始化方式
1. 优点:
- 使用类级别的 fixture (scope=“class”) 是处理类级别资源初始化和清理的标准 Pytest 方法。
- fixture 的返回值直接传递给测试方法,避免了使用 self 变量来存储状态。
- yield 语句允许在 fixture 中定义 teardown 逻辑,确保在每个测试方法之后执行。
2. 缺点:
- 需要测试方法显式地接收 fixture 作为参数,这可能会稍微增加一些样板代码。
import pytest
import logging
class TestCGJGLogin:
"""
【川高】建管首页冒烟自动化 登录测试
"""
@pytest.fixture(autouse=True)
def setup_class(self, open_browser_login):
"""
这里用来设置类级别的资源,每个测试方法执行前都会调用
"""
self.driver, self.index, self.home, self.lg = open_browser_login
@pytest.fixture(autouse=True)
def teardown_class(self):
"""
这里用来清理类级别的资源,每个测试方法执行后都会调用
"""
if hasattr(self, 'home'):
self.home.switch_to_home(r=True)
@pytest.mark.smoke
def test_01_login(self):
"""
登录账号:lxl ,获取首页用户名称展示text 与 yaml 文件data断言
"""
text = self.home.user_ele().text
logging.info(text)
assert self.lg.dt.get_cell_data(14, 'assert_val') in text
import pytest
import logging
@pytest.fixture(scope="class", autouse=True)
def manage_home_resource(request, open_browser_login):
"""
类级别的fixture,自动应用于所有测试方法,用来管理home资源。
"""
# 初始化资源
driver, index, home, lg = open_browser_login
yield driver, index, home, lg
# 测试方法在此yield之后执行
# teardown逻辑放在这里,确保每次测试后执行
home.switch_to_home(r=True)
# 如果有需要在所有测试完成后执行的最终清理,可以考虑使用request.addfinalizer
class TestCGJGLogin:
"""
【川高】建管首页冒烟自动化 登录测试
"""
@pytest.mark.smoke
def test_01_login(self, manage_home_resource):
"""
登录账号:lxl ,获取首页用户名称展示text 与 yaml 文件data断言
"""
driver, index, home, lg = manage_home_resource
logging.info(self.__dict__)
text = home.user_ele().text
logging.info(text)
assert lg.dt.get_cell_data(14, 'assert_val') in text