Sunday 15 April 2018

Waitforexpectationswithtimeout example


Ashton-W.
O teste assíncrono foi feito muito mais fácil no Xcode com a introdução das expectativas ea classe XCTestExpectation. Além do suporte básico de expectativa incluído, há métodos auxiliares para testar KVO, Notificações e usar Predicados. As expectativas são criadas por métodos auxiliares no XCTestCase.
Principios básicos da expectativa.
Esta é a expectativa básica, você chama de preenchimento () nela.
Você precisa esperar que as expectativas sejam cumpridas por qualquer processo assíncrono que você está testando. Como o nome indica que ele aguardará todas as expectativas que você criou no teste. Eu geralmente só tenho um.
Expectativas complexas.
Eu escrevi o código de teste para uma NSNotification uma vez - sugada e foi uma perda de tempo. Existem alguns bons métodos de fábrica de expectativa, desde que cobrem alguns casos complicados que você definitivamente deve pensar em usar primeiro, não só faz seu teste mais enxuto, mas está escrito para você.
Expectativas do KVO.
Se o teste do cumprimento do KVO definitivamente usa uma expectativa do KVO. Mesmo se não testar explicitamente o KVO, considere se seu teste está interagindo com um objeto compatível com o KVO. HopeValue pode ser nulo para esperar que o valor mude para qualquer outro valor. As expectativas com manipuladores opcionais serão preenchidas se não forem fornecidas. Se você usar seu próprio retorno de manipulador para cumprir a expectativa.
Expectativas de notificação.
Espere um NSNotification em uma linha. Se você não especificar um manipulador, ele será preenchido pela primeira notificação correspondente do objeto especificado, caso contrário, o manipulador deve retornar verdadeiro para atender a expectativa.
Predicar Expectativas.
Durante o teste, o NSPredicate será periodicamente avaliado. Uma vez que é verdade, a expectativa será cumprida, a menos que você especifique um manipulador, caso em que seu manipulador também deve retornar.
É isso mesmo para as expectativas padrão. Gostaria que houvesse uma expectativa de delegado na biblioteca padrão, que iria amarrar as coisas bem e ter os testes assíncronos mais comuns cobertos. Eu tenho uma rápida implementação de um aqui, mas um incluído no XCTest seria ótimo.

Waitforexpectationswithtimeout exemplo
Obter através da App Store Leia esta publicação em nosso aplicativo!
Como desencadear o teste falhado no tempo limite com waitForExpectations ()?
Quero testar um tempo limite usando waitForExpectations (). Isso deve imitar um longo processo de execução que expirou. Para fazer isso, configurei um comando sleep () na função chamada que é mais longo que o tempo limite em waitForExpectations ().
No entanto, o sleep () não tem nenhum efeito. O teste sempre passa. Eu tentei colocar o sono () antes da conclusão (verdadeiro), mas isso não altera o resultado (ou seja, teste passado).
Alguma ideia do que estou executando para desencadear uma falha de teste no tempo limite?
O seu teste passa porque você está chamando de conclusão antes de dormir, então sua expectativa está sendo cumprida quase que imediatamente - antes de esperar por 5 segundos; enquanto o bloco de conclusão é executado de forma assíncrona, é provável que termine em menos de um segundo.

Waitforexpectationswithtimeout exemplo
Obter através da App Store Leia esta publicação em nosso aplicativo!
waitForExpectationsWithTimeout falha.
Estou tentando testar um pedido assíncrono com XCTest e, portanto, usando expectationWithDescription :. No entanto, quando waitForExpectationsWithTimeout é chamado, ele imediatamente trava mesmo sem esperar o tempo limite. Eu até tentei colocar a operação de preenchimento logo após apenas excluir uma questão de tempo limite, mas não altera as coisas; Esta é a minha função:
O mesmo comportamento acontece em outras funções. Se eu tirar a operação waitForExpectationsWithTimeout e manter a operação expectationWithDescription, ela falha no final da função. Em ambos os casos, o crash repot é o seguinte:
Você pode tentar fornecer a implementação para o manipulador. De acordo com o parâmetro handler do docs não é opcional em waitForExpectationsWithTimeout markup:
Portanto, você pode tentar fornecer um manipulador descompactado explicitamente (mesmo um vazio irá fazer o trabalho):
Além disso, você pode tentar seguir esta postagem e ver se você obtém um registro de falhas mais apropriado.
Eu assisti a conversa específica na WWDC14 e saiu com a seguinte implementação:
é muito semelhante ao original, mas para a posição do comando waitForExpectationsWithTimeout, que parece ser crucial.

Esperando no XCTest.
Esperar é difícil, e esperar no Xcode não é exceção. Mesmo escolher entre as inúmeras opções que Xcode e XCTest oferecem podem ser difíceis. Continue lendo para aprender uma abordagem fácil e direta para aguardar expectativas com novas classes introduzidas no Xcode 8.3.
Antes do Xcode 8.3.
Xcode 7 introduziu uma série de novos métodos para ajudar a testar o código assíncrono, ou seja, waitForExpectations (timeout: handler :). Este método pode ser usado para, bem, aguardar as expectativas.
Uma XCTestExpectation é uma classe XCTest que avalia continuamente uma expressão até que ela seja cumprida ou o tempo limite seja atingido. Isso pode ser usado para aguardar a finalização das animações, elementos a serem exibidos, ou mesmo valores-chave para mudar via KVO.
Aqui é um breve exemplo da minha UI Testing Cheat Sheet post.
Este código é usado em um Teste de UI para aguardar que um elemento específico apareça na tela. Você passa no XCUIElement e o helper tenta encontrar o elemento por cinco segundos.
O ajudante waitForExpectations é ótimo, mas vem com uma advertência. Ele levanta uma exceção e falha no teste se o tempo limite for atingido. Isso limita sua funcionalidade aos casos em que sabemos absolutamente que as expectativas serão atendidas.
The Expectation Completion Handler.
Tome nota que eu ignorei nil para o manipulador: parâmetro na amostra de código.
manipulador: um bloco XCWaitCompletionHandler opcional para invocar quando todas as expectativas foram cumpridas ou quando o tempo limite de espera é disparado. (O tempo limite é sempre tratado como uma falha de teste).
E esse manipulador é um alias simples para envolver um erro opcional em um bloco.
Um bloco a ser chamado quando uma chamada para waitForExpectations (tempo limite: manipulador: todas as expectativas são cumpridas ou expiradas).
typealias XCWaitCompletionHandler = (Erro?) - & gt; Vazio.
À primeira vista, esta definição é emocionante, é fácil inferir que o erro irá conter todo tipo de informações úteis. No entanto, na prática, esse não é o caso. Muito raramente tem sido algo mais que um erro genérico sem descrição (localizada). рџ~ћ.
Lucky para nós, o Xcode 8.3 adicionou algumas novas classes e ajudantes para tornar a compreensão do fracasso um pouco mais fácil de entender.
O restante desta publicação relaciona a nova funcionalidade introduzida no Xcode 8.3 Beta.
Digite XCTestWaiter.
Gerenciar espera - pausando o contexto de execução atual - para uma matriz XCTestExpectations. Os garçons podem ser usados ​​com ou sem um delegado para responder a eventos como conclusão, tempo limite ou cumprimento da expectativa inválida. O XCTestCase está em conformidade com o protocolo de delegado e informará automaticamente os tempos limite e outros eventos inesperados como falhas de teste.
Os garçons podem ser usados ​​sem um delegado ou qualquer associação com uma instância de caso de teste. Isso permite que as bibliotecas de suporte de teste forneçam métodos convenientes para a espera sem ter que passar em casos de teste por meio dessas APIs.
À primeira vista, XCTestWaiter é simplesmente uma nova abordagem para aguardar a realização de XCTestExpectations s. No entanto, existem algumas gemas escondidas debaixo da superfície.
Primeiro, vamos converter o & quot; antigo? amostra para usar a nova classe.
wait (for: timeout :) retorna um XCTestWaiterResult, um enum que representa o resultado do teste. Pode ser um dos quatro valores possíveis: concluído, timedOut, incorrectOrder, ou invertidoFulfillment. Somente o primeiro, concluído, indica que o elemento foi encontrado com sucesso dentro do tempo limite atribuído.
Uma grande vantagem desta abordagem é que o conjunto de testes lê como um fluxo síncrono. Não há bloqueio de retorno de chamada ou manipulador de conclusão. O método auxiliar simplesmente retorna um booleano indicando se o elemento apareceu ou não.
Expectativas não cumpridas não faltam automaticamente рџ~ ...
Na minha opinião, esta é a maior melhoria do quadro. Agora você está completamente no controle de quando e como falhar seus testes se uma expectativa não cumprir. Isso permite a espera de elementos opcionais, como uma tela de login ou uma caixa de diálogo de autorização de serviços de localização.
Você também pode dividir cada tipo de XCTestWaiterResult e falhá-los com mensagens de erro individuais. Por exemplo,.timedOut pode mencionar quanto tempo o tempo limite foi enquanto o incorretoOrder pode usar as Expectativas preenchidas para anotar quais foram bem-sucedidos e nos quais ainda estamos aguardando.
Expectativas múltiplas.
Mais de uma XCTestExpectation pode ser passada para o garçom que pode ser usada em dois cenários diferentes.
Qualquer uma das expectativas precisa ser cumprida - assim que uma é cumprida, o garçom pára de esperar Todas as expectativas precisam ser cumpridas - o garçom continua a aguardar até que todos sejam cumpridos.
Para indicar que todas as expectativas são importantes, basta chamar de espera (para: timeout: enforceOrder :). O último parâmetro indicará a estrutura se a ordem de cumprimento também for importante.
Novas subclasses XCTestExpectation.
Junto com a nova classe de garçons, XCTestExpectations foi subclasse para tornar as expectativas específicas um pouco mais fáceis de escrever. Eu sugiro usar isso sempre que possível, a legibilidade vai um longo caminho na escrita de um conjunto de teste sustentável.
XCTPredicateExpectation.
XCTKVOExpectativa.
XCTNSNotificationExpectation.
Eu não consigo que este trabalhe рџ џ. Se alguém tiver sucesso com esta subclasse, avise-me nos comentários.
Obrigado pela ajuda, Brian!
Xcode 8.4 e Além.
Isso é reconfortante para ver o reinvestimento da Apple em sua estrutura de testes; Não houve muita atividade para o XCTest desde a sua renovação no Xcode 7. Estou ansioso para experimentar tudo o que vem com a próxima versão!

No comments:

Post a Comment