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 cache
la escritura y lectura de datos de caché.
request.config.cache
Los estudiantes que aún no lo entiendan request fixture
pueden 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_01
se token
almacenará en caché cuando se ejecute el código y el valor test_02
se 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. debug
Después de la ejecución, debug
el 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_cache
el 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 cache
lo que se devuelve es Cache
un objeto, veamos Cache
có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.
- 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.key
value
path
/
- 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_already
establece enTrue
; de lo contrario, verifica si el directorio de caché existe y si el directorio de caché ya existe, secache_dir_exists_already
establece enTrue
; de lo contrario, crea el directorio de caché. - 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é. - Serialice los datos y escríbalos en un archivo:
value
serialice 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:
- 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.key
path
/
- 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. - 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 (
ValueError
y ) y se devuelve el valor predeterminado ( ).OSError
default
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:
-
__init__(self, cachedir: Path, config: Config, *, _ispytest: bool = False) -> None
:- Método de inicialización, utilizado para establecer las propiedades de la clase
_cachedir
y_config
.
- Método de inicialización, utilizado para establecer las propiedades de la clase
-
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
cacheclear
está establecido enTrue
y el directorio de caché existe, llameclear_cache
al método para borrar el caché. - Finalmente,
Cache
se devuelve una nueva instancia.
- Método de clase que crea y devuelve una instancia basada en la información de configuración dada
-
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
cachedir
yrm_rf
elimine el directorio de forma recursiva usando la función.
-
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_str
la función para analizarlaPath
y devolverla como un objeto.
-
warn(self, fmt: str, *, _ispytest: bool = False, **args: object) -> None
:- Una forma de emitir advertencias de caché.
- Utilice
warnings.warn
la función para emitir un mensaje de advertencia y especificar el tipo de advertenciaPytestCacheWarning
. - 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.
-
mkdir(self, name: str) -> Path
:- Cree un objeto de ruta de directorio y cree el directorio en el directorio de caché.
- El parámetro
name
es 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.joinpath
el método para crear la ruta completa del directorio ymkdir
el método para crear el directorio. - Devuelve el objeto de ruta del directorio creado.
-
_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_VALUES
como prefijo de subdirectorio.
-
_ensure_supporting_files(self) -> None
:- Cree archivos de soporte en el directorio de caché.
- Cree
README.md
un archivo que describa el propósito del directorio de caché. - Cree
.gitignore
el archivo, ignorando todos los archivos en el directorio de caché. - Cree
CACHEDIR.TAG
un archivo que marque el directorio de caché.
por fin
cache
Las 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 token
pueda 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.