用pytest+uiautomator2+allure搭了一套UI自动化框架,现在有个问题就是每次执行case都会重复多次初始化,这个问题怎么解,让获取设备号和连接u2这步全局只执行一次啊

要实现让获取设备号和连接uiautomator2只执行一次的效果,你可以使用pytest的一些特性,如conftest.py文件和pytest.fixture装饰器。

首先,你可以在项目的根目录下创建一个conftest.py文件,用来定义全局的测试夹具(fixture)。在conftest.py文件中,你可以编写测试用例运行前的一些初始化代码,确保这些代码只执行一次。代码示例如下:

import pytest
import uiautomator2 as u2

@pytest.fixture(scope="session", autouse=True)
def setup_and_teardown():
    # 初始化代码
    device = u2.connect()  # 连接uiautomator2
    device_id = device.device_info["serial"]  # 获取设备号
    # 可以在这里实现一些全局的初始化操作

    yield device_id, device

    # 清理代码
    # 可以在这里实现一些全局的清理操作

在上述代码中,setup_and_teardown是一个会话级别的fixture,用来执行初始化和清理操作的代码。autouse=True参数指定这个fixture自动在每个测试用例运行前后执行。yield关键字之前的部分是初始化代码,通过uiautomator2连接设备并获取设备号。yield关键字之后的部分是清理代码,可以在这里实现一些全局的清理操作。

接下来,在你的测试用例文件中,你可以直接使用setup_and_teardown这个fixture来获取设备号和连接uiautomator2。代码示例如下:

import pytest

@pytest.mark.usefixtures("setup_and_teardown")
class TestExample:

    def test_case1(self, setup_and_teardown):
        device_id, device = setup_and_teardown
        # 在这里使用device_id和device进行测试操作

    def test_case2(self, setup_and_teardown):
        device_id, device = setup_and_teardown
        # 在这里使用device_id和device进行测试操作

    # 其他测试用例...

在上述代码中,我们使用了@pytest.mark.usefixtures("setup_and_teardown")装饰器将setup_and_teardown夹具应用到测试用例中。

这样,每个测试用例都可以通过setup_and_teardown夹具获取设备号和连接uiautomator2,并且这部分代码只会在测试开始前执行一次,避免了重复初始化的问题。

请注意,根据需要和实际情况,你可以根据setup_and_teardown夹具的定义,自定义一些初始化和清理操作。另外,你也可以根据需要创建其他的夹具来实现更多的全局操作。