Pytest usa dispositivos para implementar tokens compartidos

Cuando los estudiantes realizan la automatización de la interfaz de Pytest , se encontrarán con un escenario en el que diferentes casos de prueba necesitan un paso previo al inicio de sesión . Una vez que se completa el inicio de sesión, se obtendrá el token y se utilizará en el código posterior. Primero, permítanme demostrar una práctica convencional.

Primero defina un método de inicio de sesión en conftest, el método devuelve token

@pytest.fixture(scope="function")
def login():
    header = {
            "Content-Type": "application/json"
    }
    data = {
            "username": "test",
            "password": "test"
    }
    login_info = requests.post(url='http://.../login',json=data).json()
    return login_info['token']

Introduzca este método en el método de caso de prueba, y todos los tokens utilizados deben utilizar el método de inicio de sesión.

def test_user(login):
    token = login # 通过login获取token
    ......
def test_address(login):
    token = login # 通过login获取token
    ......

A través del método anterior, se puede resolver el requisito de usar token para la interfaz, pero cada vez que se hace esto, la interfaz de inicio de sesión se ejecutará primero. ¿Hay alguna manera de ejecutar la interfaz de inicio de sesión solo una vez, y las interfaces posteriores no lo harán? llamar a la interfaz de inicio de sesión. Después de la prueba de Lao Wu, en realidad se puede hacer.

Idea: La interfaz de inicio de sesión usa el caché. Cuando hay un token, se usa el token y no se llama a la interfaz de inicio de sesión. Si no hay token, se llama a la interfaz de inicio de sesión y el token se almacena en caché.

Luego, debe modificar el método de inicio de sesión anterior, agregar el método save_token y guardar el token. Introduce el módulo pickle para escribir datos.

import pickle
@pytest.fixture(scope="function")
def login():
    ......
    # 增加缓存方法
    save_token(login_info['token'])
    return login_info['token']
 
def save_token(token):
    # login_path为目录中一个存放token的文件路径,自己定义。
    with open(login_path, 'wb') as f:
        pickle.dump(login_info, f)
        f.close()

El código anterior completa la escritura del token, y cuando no hay ningún token, el token se escribe en el archivo. Si hay un token, no necesitamos realizar la operación de inicio de sesión y usar directamente el token en el archivo. En este momento, el código debe modificarse. Al comienzo del método, se juzga si hay un archivo que guarda el token y, de ser así, se obtiene el token y ya no se realiza la operación de inicio de sesión. Agregue otro método get_login_info para leer el contenido del archivo

import pickle
@pytest.fixture(scope="function")
def login():
    if os.path.exists(login_info):
        return get_login_info(login_info)
    else:
        ......
        # 增加缓存方法
        save_token(login_info['token'])
        return login_info['token']
# 增加一个读取文件的方法
def get_login_info():
    with open(login_path, 'rb') as f:
        data = pickle.load(f)
        f.close()
        return data

El 90% del trabajo anterior se ha completado y un toque final será perfecto. Elimine el archivo de token guardado después de cada ejecución del caso de uso; de lo contrario, se genera un token y el código no llamará a la interfaz de inicio de sesión si existe el archivo de token. Una vez que el token caduca, la ejecución del caso de uso fallará.

Defina un método en conftest para limpiar el archivo de token cada vez que se ejecuta un caso de uso. Tenga en cuenta que el nivel es el nivel de sesión.

@pytest.fixture(scope='session', autouse=True)
def clear_login_file():
    if os.path.exists(login_path):
        logger.info("清理token文件")
        os.remove(login_path)

Supongo que te gusta

Origin blog.csdn.net/nhb687095/article/details/131455066
Recomendado
Clasificación