Utilice Pytest Cache Fixture para implementar el almacenamiento en caché de resultados de pruebas

Durante el proceso de cierre automático de la interfaz, a menudo nos encontramos con escenarios como "La Solicitud 2 necesita usar los datos respondidos a la Solicitud 1". El enfoque común es crear dependencias de casos de uso o escribir los resultados de la respuesta de la Solicitud 1 en un archivo. Cuando se utiliza Leer el archivo. Por supuesto, este no es el tema central de este artículo, que presenta principalmente cachela escritura y lectura de datos de caché.

request.config.cache

Los estudiantes que aún no lo entiendan request fixturepueden leer primero el artículo escrito por mí.

Veamos primero el caso de uso:

def test_01(cache):
    cache.set("token", "uiouoouoiou")
​
def test_02(cache):
    r = cache.get("token", None)

De esta manera, el valor test_01se tokenalmacenará en caché cuando se ejecute el código y el valor test_02se podrá leer desde el caché en cualquier momento de la ejecución token. Cache¿Cómo se logra eso ? Echemos un vistazo al código fuente. Acceso directo al código fuente

Principio de implementación

def test_01(cache):
    cache.set("token", {"token": "1212121"})

Hacemos cache.set()un punto de interrupción en esta línea. debugDespués de la ejecución, debugel resultado es

cache = Cache()
_CACHE_PREFIX_DIRS = 'd'
_CACHE_PREFIX_VALUES = 'v'
_cachedir = /PycharmProjects/panda-test/org/.pytest_cache
_config = <_pytest.config.Config object at 0x109e80d60>

Puede ver que se crea automáticamente una instancia de caché y se inicializan algunos datos. De forma predeterminada, el archivo de caché debe estar en .pytest_cacheel directorio

/_pytest/cacheprovider.py

@fixture
def cache(request: FixtureRequest) -> Cache:
    """Return a cache object that can persist state between testing sessions.
​
    cache.get(key, default)
    cache.set(key, value)
​
    Keys must be ``/`` separated strings, where the first part is usually the
    name of your plugin or application to avoid clashes with other cache users.
​
    Values can be any object handled by the json stdlib module.
    """
    assert request.config.cache is not None
    return request.config.cache

Como puedes ver cachelo que se devuelve es Cacheun objeto, veamos Cachecómo se implementa el objeto.

    def set(self, key: str, value: object) -> None:
        path = self._getvaluepath(key)
        try:
            if path.parent.is_dir():
                cache_dir_exists_already = True
            else:
                cache_dir_exists_already = self._cachedir.exists()
                path.parent.mkdir(exist_ok=True, parents=True)
        except OSError:
            self.warn("could not create cache path {path}", path=path, _ispytest=True)
            return
        if not cache_dir_exists_already:
            self._ensure_supporting_files()
        data = json.dumps(value, ensure_ascii=False, indent=2)
        try:
            f = path.open("w", encoding="UTF-8")
        except OSError:
            self.warn("cache could not write path {path}", path=path, _ispytest=True)
        else:
            with f:
                f.write(data)

Este código fuente se utiliza para guardar pares clave-valor en la memoria caché. El código es relativamente simple, explíquelo brevemente.

  1. Obtenga la ruta del par clave-valor que se guardará: obtenga la ruta ( ) del valor ( ) en el caché _getvaluepath()en función de la clave dada ( ) llamando al método. La ruta aquí es una cadena separada por diferentes niveles, normalmente el primer nombre es el nombre del complemento o aplicación.keyvaluepath/
  2. Compruebe si la ruta existe: determine si es necesario crear la ruta juzgando si el directorio principal de la ruta es un directorio. Si el directorio principal ya existe, se cache_dir_exists_alreadyestablece en True; de lo contrario, verifica si el directorio de caché existe y si el directorio de caché ya existe, se cache_dir_exists_alreadyestablece en True; de lo contrario, crea el directorio de caché.
  3. Asegúrese de que existan los archivos de respaldo: si el directorio de caché se creó recientemente, llame _ensure_supporting_files()al método para asegurarse de que existan los archivos de respaldo. Este método se puede utilizar para crear otros archivos o directorios relacionados con la caché.
  4. Serialice los datos y escríbalos en un archivo: valueserialice el valor ( ) usando el formato JSON para asegurarse de que sea un tipo básico de Python o que contenga tipos anidados (como listas y diccionarios). Luego, intente abrir el archivo correspondiente a la ruta (codificado usando UTF-8) y escriba los datos serializados en el archivo.
    def get(self, key: str, default):
        
        path = self._getvaluepath(key)
        try:
            with path.open("r", encoding="UTF-8") as f:
                return json.load(f)
        except (ValueError, OSError):
            return default

Este código fuente se utiliza para obtener el valor de la clave especificada del caché. Aquí hay una breve explicación:

  1. Obtenga la ruta para obtener el valor: obtenga la ruta del valor en el caché () _getvaluepath()según la clave proporcionada ( ) llamando al método. La ruta aquí es una cadena separada por diferentes niveles; normalmente el primer nombre es el nombre del complemento o la aplicación.keypath/
  2. Intenta leer un archivo y devolver valores almacenados en caché: abra el archivo con la ruta (codificada en UTF-8) y json.load(f)cargue los datos en el archivo como un objeto Python usando . Luego se devuelve el valor cargado.
  3. Manejo de excepciones: si el contenido del archivo no se puede analizar en datos JSON válidos o falla al abrir el archivo, se detectan las excepciones ( ValueErrory ) y se devuelve el valor predeterminado ( ).OSErrordefault

Todavía aprendí aquí una forma novedosa de escribir, que nunca antes había usado, que with path.open("r", encoding="UTF-8") as f:equivale aopen(path, "r", encoding="UTF-8")

Estos son dos métodos de uso común. Por supuesto, se proporcionan más métodos. Aquí hay una breve introducción:

  1. __init__(self, cachedir: Path, config: Config, *, _ispytest: bool = False) -> None:

    • Método de inicialización, utilizado para establecer las propiedades de la clase _cachediry _config.
  2. for_config(cls, config: Config, *, _ispytest: bool = False) -> "Cache":

    • Método de clase que crea y devuelve una instancia basada en la información de configuración dada Cache.
    • Si el elemento de configuración cacheclearestá establecido en Truey el directorio de caché existe, llame clear_cacheal método para borrar el caché.
    • Finalmente, Cachese devuelve una nueva instancia.
  3. clear_cache(cls, cachedir: Path, _ispytest: bool = False) -> None:

    • Método de clase, borre los subdirectorios en el directorio de caché.
    • Cree una ruta de subdirectorio basada en el parámetro cachediry rm_rfelimine el directorio de forma recursiva usando la función.
  4. cache_dir_from_config(config: Config, *, _ispytest: bool = False) -> Path:

    • Método estático, obtiene la ruta del directorio de caché a partir de la información de configuración proporcionada.
    • Primero obtenga la representación de cadena del directorio de caché de la configuración, luego use resolve_from_strla función para analizarla Pathy devolverla como un objeto.
  5. warn(self, fmt: str, *, _ispytest: bool = False, **args: object) -> None:

    • Una forma de emitir advertencias de caché.
    • Utilice warnings.warnla función para emitir un mensaje de advertencia y especificar el tipo de advertencia PytestCacheWarning.
    • Si el parámetro está presente args, se utiliza como parámetro de formato reemplazando el marcador de posición en la cadena de formato.
  6. mkdir(self, name: str) -> Path:

    • Cree un objeto de ruta de directorio y cree el directorio en el directorio de caché.
    • El parámetro namees el nombre del directorio que se creará.
    • Comprueba si el nombre del directorio contiene un separador de ruta /y, de ser así, genera una excepción.
    • Utilice _cachedir.joinpathel método para crear la ruta completa del directorio y mkdirel método para crear el directorio.
    • Devuelve el objeto de ruta del directorio creado.
  7. _getvaluepath(self, key: str) -> Path:

    • Genera la ruta al archivo de valores según la clave proporcionada.
    • Cree la ruta del archivo de valores en el directorio de caché, utilizándola _CACHE_PREFIX_VALUEScomo prefijo de subdirectorio.
  8. _ensure_supporting_files(self) -> None:

    • Cree archivos de soporte en el directorio de caché.
    • Cree README.mdun archivo que describa el propósito del directorio de caché.
    • Cree .gitignoreel archivo, ignorando todos los archivos en el directorio de caché.
    • Cree CACHEDIR.TAGun archivo que marque el directorio de caché.

por fin

cacheLas funciones siguen siendo muy prácticas, como la función de inicio de sesión, que se puede escribir en el caché después de iniciar sesión token, de modo que al realizar otras solicitudes de interfaz, se tokenpueda obtener directamente del caché cuando sea necesario token.

Finalmente: se ha compilado y subido el video tutorial completo de prueba de software a continuación. Los amigos que lo necesiten pueden obtenerlo ellos mismos [garantizado 100% gratis]

Documento de entrevista de prueba de software

Debemos estudiar para encontrar un trabajo bien remunerado. Las siguientes preguntas de la entrevista son los últimos materiales de entrevista de empresas de Internet de primer nivel como Alibaba, Tencent, Byte, etc., y algunos jefes de Byte han dado respuestas autorizadas. Después de terminar este conjunto Creo que todos pueden encontrar un trabajo satisfactorio según la información de la entrevista.

Supongo que te gusta

Origin blog.csdn.net/wx17343624830/article/details/132838577
Recomendado
Clasificación