As Google Cloud bibliotecas de cliente para Rust fornecem auxiliares que simplificam a interação com operações de longa duração (LROs). Para simular o comportamento de LROs em testes de unidade, é preciso entender os detalhes que esses auxiliares abstraem. Este guia mostra como escrever testes de unidade para sondagem de LRO automática e manual, incluindo cenários de erro.
Pré-requisitos
Este guia pressupõe que você conhece os seguintes guias:
Testar a sondagem automática
Suponha que o código do aplicativo aguarde lro::Poller::until_done() (pesquisa
automática):
Como o aplicativo usa apenas o resultado final da LRO, não é necessário testar como ele lida com resultados de sondagem intermediários. O teste pode retornar o resultado final da LRO diretamente do simulado.
Criar o longrunning::model::Operation
Suponha que você queira que a chamada retorne a seguinte resposta:
O stub retorna um longrunning::model::Operation em vez de um
BatchRecognizeResponse. Empacote a resposta esperada em Operation::result:
Defina o campo done como true para indicar ao Poller que a operação foi
concluída, encerrando o loop de sondagem:
Gravar o teste
Defina a struct simulada, que implementa a característica
speech::stub::Speech:No teste, crie o simulado e defina as expectativas para ele:
Crie um cliente com base no simulado, chame a função e verifique a resposta:
Testar a sondagem manual com metadados intermediários
Suponha que o código do aplicativo faça uma sondagem manual e processe atualizações parciais:
É possível simular como o aplicativo se comporta quando recebe metadados intermediários retornando operações em andamento do simulador.
Criar o longrunning::model::Operation
A RPC BatchRecognize retorna resultados parciais como um
speech::model::OperationMetadata. Empacote esses metadados no campo Operation::metadata do longrunning::model::Operation retornado:
Gravar o teste
Defina a struct simulada, que implementa a característica
speech::stub::Speeche substituiget_operation():No teste, crie o simulado e defina as expectativas para que ele retorne resultados parciais (25%, 50%, 75%) seguidos pelo resultado final:
Observe os seguintes detalhes sobre como as expectativas são configuradas:
- RPCs iniciais x subsequentes: a primeira expectativa é definida em
batch_recognize(), enquanto todas as expectativas subsequentes são definidas emget_operation(). A RPCBatchRecognizeinicial inicia a LRO no servidor e retorna um identificador de operação no camponame(omitido do código de teste para fins de brevidade). A partir de então, a biblioteca de cliente pesquisa o status dessa LRO usando a RPCGetOperation. - Ordenação de chamadas: as expectativas são registradas em um
Sequence. Isso permite que omockallverifique a ordem das chamadas e determine qual expectativa deexpect_get_operationcorresponde a cada sondagem.
- RPCs iniciais x subsequentes: a primeira expectativa é definida em
Crie um cliente com base no simulado, chame a função e verifique a resposta:
Simular erros
Os erros podem surgir em vários pontos durante uma LRO.
Se o aplicativo usa a sondagem automática, todas as origens de erro são equivalentes:
until_done() retorna o erro no Result, independentemente de onde ele
tenha se originado.
Simular um erro ao iniciar uma LRO
produz o teste mais simples.
Simular um erro ao iniciar uma LRO
Para simular um erro ao iniciar uma LRO, configure a solicitação inicial para falhar com um erro:
Para a sondagem manual, a ramificação PollingResult::Completed recebe o erro
ao iniciar a LRO, o que encerra o loop de sondagem:
Simular uma LRO que resulta em um erro
Para simular uma LRO que falha após retornar metadados intermediários, retorne o
erro no longrunning::model::Operation final:
Defina as expectativas para retornar o Operation com falha de get_operation:
Na sondagem manual, a ramificação PollingResult::Completed recebe o resultado do erro, encerrando o loop de sondagem:
Simular um erro de sondagem
Os loops de sondagem também podem ser encerrados quando a política de sondagem é esgotada. Quando isso acontece, a biblioteca de cliente não consegue determinar definitivamente se a LRO foi concluída.
Se o aplicativo tiver uma lógica personalizada para lidar com erros de sondagem, teste-a
retornando um erro diretamente da expectativa get_operation:
Na sondagem manual, a ramificação PollingResult::PollingError recebe o
erro de sondagem simulado:
Código de teste completo
As seções a seguir mostram o código completo dos testes descritos neste guia.