Thursday, 22 March 2018

Espera as expectativas com o tempo certo


mokacoding.
Testando callbacks em Swift com XCTest.
Esta publicação será a primeira de uma série em Testes Práticos em Swift. Planejo que as postagens cubram um único tópico e sejam focadas na implementação do código. O plano é liberar pelo menos uma publicação por semana, e eu já tenho 5 tópicos sobre os quais eu gostaria de escrever. O feedback é muito apreciado.
Como você testa o código assíncrono que chama um retorno de chamada?
Diga que você tenha uma classe que execute uma operação assíncrona e executa um fechamento de retorno de encerramento passado como um parâmetro de método.
Você já pode ter experimentado que escrever testes de código como doSomethingAsync da maneira tradicional resultará em comportamentos inesperados e falsos positivos.
A razão pela qual isso acontece é porque, por padrão, o XCTest é síncrono, como a maioria do código do aplicativo que geralmente escrevemos, enquanto o que você está tentando testar é assíncrono. Isso significa que a execução dos testes vai para a próxima linha de código logo após o método assíncrono ser chamado e o teste completo termina antes do encerramento do retorno de chamada ser executado.
O framework XCTest fornece uma API útil para testar o comportamento do código assíncrono: XCTestExpectation.
Vamos dar uma olhada em como testar doSomethingAsync usando XCTestExpectation. Você também pode acompanhar o projeto de exemplo para esta publicação.
Como você pode ver, há três etapas no processo.
Defina uma expectativa com uma descrição significativa. Continue com as fases de configuração e exercício do teste, chamando o método assíncrono e cumprindo a expectativa no final do fechamento de retorno de chamada. Faça com que o corredor de teste aguarde que a expectativa seja cumprida, para que as operações assíncronas possam ser concluídas e as afirmações verificadas.
É importante fornecer uma descrição significativa porque essa descrição é relatada na mensagem de falha de uma expectativa não cumprida:
Quando o teste com mensagens de falha descritiva é muito importante para tornar seu futuro e o resto da equipe identificar o motivo de falha o mais rápido possível.
Espero que você tenha achado esta publicação útil e agradeceria muito os comentários sobre o formato nos comentários abaixo ou me enviando um ping no Twitter @mokagio.
Se você precisar de ajuda com seus testes assíncronos, não hesite em entrar em contato, eu ficaria feliz em ajudar.
Fique atento ao próximo artigo em que veremos como testar chamadas assíncronas de objetos delegados. Se você não quiser perder, certifique-se de se inscrever no boletim informativo.
Deixe a base do código melhor do que você encontrou.
mokacoding.
Oi, Giovanni Lodi e este é o meu blog. Eu escrevo aqui pelo menos uma vez por mês, em testes de software, produtividade e desenvolvimento de iOS.

Xctest espera expectativas anteriores com o tempo certo.
Avisos de fraude CFTC - CFTC.
Xctest espera expectativas anteriores com o tempo do forex bhubaneswar.
waitForExpectationsWithTimeout: manipulador: Espera até que todas as expectativas sejam cumpridas ou o tempo limite seja atingido. SDK. Xcode 7.2+. Estrutura. XCTest. Nesta página.
21 de julho de 2018. Esta semana, vamos ver o `XCTest`, a estrutura de teste incorporada no Xcode, bem como as novas adições emocionantes no Xcode 6:. 11 de julho de 2018. Passo 3: Informe o teste para esperar até que a expectativa seja cumprida waitForExpectationsWithTimeout (10). STep 4: faça asserção após a conclusão da chamada assíncrona.
12 de janeiro de 2018. O framework XCTest nos fornece uma API útil para testar o. Aguarde que a expectativa seja cumprida waitForExpectationsWithTimeout (1). Após uma discussão, escolhemos a XCTest como nossa estrutura de testes. Nosso código. Como o XCTest funciona. [self waitForExpectationsWithTimeout: 0.1 handler: nil]; 21 de setembro de 2018. Como extrair métodos auxiliares XCTest e manter mensagens de falhas sãs. . manipulador: nil) waitForExpectationsWithTimeout (5, handler: nil).
Sistema de comércio Aw.
19 de março de 2018. XCTestExpectation é a ferramenta da matriz de teste XCTest da Apple. 1, waitForExpectationsWithTimeout (maxWaitSeconds, handler: nil). 14 de outubro de 2018. waitForExpectationsWithTimeOut: handler: faz exatamente como é excessivamente detalhado, mas no nome do nariz implica. Passe um duplo e aguardará isso. 4 de agosto de 2018. waitForExpectationsWithTimeout (10, handler: nil). Eu tenho uma rápida implementação de um aqui, mas um incluído no XCTest seria ótimo.

Teste assíncrono com Xcode 6.
Em 2018, a Apple enviou uma plataforma de teste renovada no Xcode chamada XCTest, e houve muita alegria. A estrutura antiga não tinha sido atualizada há anos, e várias ferramentas e frameworks de teste de terceiros surgiram para fornecer novos recursos e recursos. Foi bom ver as ferramentas incorporadas recebendo algum amor novamente, e este ano, a Apple está enviando alguns recursos com o Xcode 6 que faltavam na atualização do ano passado. Um que particularmente me agrada ver é o suporte para testes assíncronos.
Se tivermos um teste que tenha que iniciar uma tarefa assíncrona, seja executado em outro tópico ou no runloop do thread principal, como podemos testá-lo?
Considere uma solicitação na web. Poderíamos iniciar uma solicitação na web e passar em um bloco de conclusão, depois fazer as nossas afirmações de teste, seja no manipulador de conclusão ou não. No entanto, como o pedido na Web ainda não foi feito, muito menos uma resposta recebida nem o nosso bloqueio de conclusão foi chamado, nosso método de teste vai sair antes que as afirmações sejam testadas.
Vamos ver um teste para uma classe que faz o download de páginas da web. Normalmente, não queremos fazer pedidos reais na web em testes. Em vez disso, nós superamos os pedidos usando alguma ferramenta (eu sou parcial para OHHTTPStubs). Mas para os propósitos desses exemplos, iremos quebrar algumas regras e fazer pedidos reais da web.
Podemos dar à classe em teste um URL e bloco de manipulação de conclusão, e irá baixar a página e chamar o bloco, passando por uma seqüência de caracteres contendo a página da web ou uma string vazia se ocorrer uma falha. Não é uma ótima API, mas, novamente, estamos quebrando algumas regras. No entanto, o código de teste abaixo nunca falhará. O método de teste retornará sem dar a conclusão do bloqueio de Handler uma chance de ser chamado.
Antes da versão do XCódigo 6 da XCTest, apenas usando o que vem na lata com Xcode, poderíamos sentar e girar em um ciclo de tempo que chama o loop de execução do thread principal até a resposta chegar ou algum período de tempo limite tenha decorrido. Aqui está o código de teste de trabalho, o antigo caminho.
O loop while roda o loop de execução do thread principal por 10 milissegundos de cada vez até a resposta chegar, ou até 5 segundos decorrer sem que ele tenha chegado. Isso é útil. Não é terrível. Não é o fim do mundo do desenvolvimento de software ", mas não é ótimo.
Agora, é uma maneira melhor.
Altas expectativas.
Com Xcode 6, a Apple adicionou expectativas de teste ao framework XCTest na forma da classe XCTestExpectation. Quando criamos uma expectativa de teste, a estrutura de teste espera que ela seja cumprida em algum momento no futuro. Nosso código de teste cumpre a expectativa no bloco de conclusão com uma chamada para o método XCTestExpectation. Isso toma o lugar de definir uma bandeira como responseHasArrived no exemplo anterior. Em seguida, contamos que o framework de teste espera (com um tempo limite) para que suas expectativas sejam cumpridas através do método XCTestCase waitForExpectationsWithTimeout: handler:. Se o manipulador de conclusão for executado dentro do tempo limite e as chamadas forem cumpridas, todas as expectativas do teste serão cumpridas. Caso contrário, o teste irá viver uma existência triste, solitária, não cumprida, até que se torne fora do escopo. E vivendo uma existência triste, solitária e insatisfeita, quero dizer que a expectativa falha no teste após o tempo limite.
A expectativa falhada não deveria se sentir tão abatida. Lembre-se de que um resultado falido não é o sinal de um teste ruim; um resultado indeterminado é. Essa expectativa pode sentir orgulho, pois declara falha.
Aqui é um exemplo usando XCTestExpectation:
Crie a expectativa com uma descrição para tornar os resultados mais legíveis. No bloco de conclusão, chame [expectativa preenchida] para dizer o teste que esta expectativa, de fato, foi cumprida. Então, saia no waitForExpectationsWithTimeout: manipulador: até que a solicitação seja enviada, a resposta chega e o nosso manipulador de conclusão é chamado ou o tempo limite ocorre.
Isso é bom, objetivo-C, mas também podemos fazê-lo na nova e brilhante linguagem swift da Apple.
E isso é isso. É uma classe fácil de usar para testar o código assíncrono.
Não podemos obter informações suficientes sobre iOS 8 e Swift? Junte-se a nós para o início do iOS com Swift e Advanced iOS bootcamps.
Cursos iOS Big Nerd Ranch.
Interessado em aprender mais sobre nossos cursos básicos e avançados de iOS?
Aprenda com os especialistas em um Bootcamp Big Nerd Ranch!
Big Nerd Ranch Screencasts.
Interessado em nivelar suas habilidades de codificação dos mesmos autores do Big Nerd Ranch Guide? Assine a The Frontier hoje!
Posts Relacionados:
Charles Brian Quinn.
Comentários recentes.
Desenvolvimento de aplicativos.
Treinamento em equipe.
Empresa.
Direitos autorais e cópia; 1998 - 2018 Big Nerd Ranch, LLC. Todos os direitos reservados. | Política de Privacidade.

Waitforexpectationswithtimeout
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.

Teste assíncrono.
O teste assíncrono foi feito muito mais fácil com a introdução das expectativas ea classe XCTestExpectation. Além do suporte básico de expectativa, incluem 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.
Este foi originalmente postado para Ashton-W.
Ao bater palmas mais ou menos, você pode nos indicar quais são as histórias que realmente se destacam.

No comments:

Post a Comment