Las bibliotecas cliente de Google Cloud para Rust proporcionan ayudantes que simplifican la interacción con las operaciones de larga duración (LRO). Simular el comportamiento de las LRO en las pruebas de unidades implica comprender los detalles subyacentes que estos ayudantes abstraen. En esta guía, se muestra cómo escribir pruebas de unidades para el sondeo de LRO automático y manual, incluidos los casos de error.
Requisitos previos
En esta guía, se da por sentado que conoces las siguientes guías:
Prueba el sondeo automático
Supongamos que el código de la aplicación espera lro::Poller::until_done() (sondeo automático):
Debido a que la aplicación solo usa el resultado final de la LRO, no necesitas probar cómo controla los resultados de sondeo intermedios. Tu prueba puede devolver el resultado final de la LRO directamente desde la simulación.
Crea el longrunning::model::Operation
Supongamos que quieres que la llamada devuelva la siguiente respuesta:
El stub devuelve un longrunning::model::Operation en lugar de un
BatchRecognizeResponse. Empaqueta la respuesta esperada en Operation::result:
Establece el campo done en true para indicarle a Poller que la operación se completó, lo que finaliza el bucle de sondeo:
Escribe la prueba
Define la estructura de simulación, que implementa el atributo
speech::stub::Speech:En la prueba, crea el objeto ficticio y establece expectativas en él:
Crea un cliente a partir de la simulación, llama a la función y verifica la respuesta:
Prueba el sondeo manual con metadatos intermedios
Supongamos que el código de tu aplicación sondea de forma manual y procesa actualizaciones parciales:
Puedes simular cómo se comporta la aplicación cuando recibe metadatos intermedios devolviendo operaciones en curso desde la simulación.
Crea el longrunning::model::Operation
La RPC BatchRecognize devuelve resultados parciales como un
speech::model::OperationMetadata. Empaqueta estos metadatos en el campo Operation::metadata del longrunning::model::Operation que se muestra:
Escribe la prueba
Define la estructura simulada, que implementa el atributo
speech::stub::Speechy anulaget_operation():En la prueba, crea la simulación y establece expectativas para que devuelva resultados parciales (25%, 50%, 75%) seguidos del resultado final:
Ten en cuenta los siguientes detalles sobre cómo se configuran las expectativas:
- RPC iniciales frente a posteriores: La primera expectativa se establece en
batch_recognize(), mientras que todas las expectativas posteriores se establecen enget_operation(). La RPCBatchRecognizeinicial inicia la LRO en el servidor y devuelve un identificador de operación en el camponame(se omite del código de prueba para mayor brevedad). A partir de ese momento, la biblioteca cliente sondea el estado de esa LRO con la RPCGetOperation. - Orden de las llamadas: Las expectativas se registran en un
Sequence. Esto permite quemockallverifique el orden de las llamadas y determine qué expectativa deexpect_get_operationcoincide con cada sondeo.
- RPC iniciales frente a posteriores: La primera expectativa se establece en
Crea un cliente a partir de la simulación, llama a la función y verifica la respuesta:
Simula errores
Los errores pueden surgir en varios puntos durante una LRO.
Si tu aplicación usa el sondeo automático, todas las fuentes de error son equivalentes:
until_done() devuelve el error en Result, sin importar dónde se
originó.
Simular un error que inicia una LRO
produce la prueba más sencilla.
Simula un error que inicia una LRO
Para simular un error cuando se inicia una LRO, configura la solicitud inicial para que falle con un error:
Para el sondeo manual, la rama PollingResult::Completed recibe el error
de iniciar la LRO, lo que finaliza el bucle de sondeo:
Simula una LRO que genera un error
Para simular una LRO que falla después de devolver metadatos intermedios, devuelve el
error en el longrunning::model::Operation final:
Establece expectativas para devolver el Operation con errores de get_operation:
En el sondeo manual, la rama PollingResult::Completed recibe el resultado del error, lo que finaliza el bucle de sondeo:
Cómo simular un error de sondeo
Los bucles de sondeo también pueden salir cuando se agota la política de sondeo. Cuando esto sucede, la biblioteca cliente no puede determinar de forma definitiva si se completó la LRO.
Si tu aplicación tiene una lógica personalizada para controlar los errores de sondeo, puedes probarla
devolviendo un error directamente desde la expectativa get_operation:
En el sondeo manual, la rama PollingResult::PollingError recibe el
error de sondeo simulado:
Código de prueba completo
En las siguientes secciones, se muestra el código completo de las pruebas que se describen en esta guía.