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 esperaforexpectationswithtimeout
Obter através da App Store Leia esta publicação em nosso aplicativo!
Teste XCTest e assíncrono no Xcode 6.
Então, a Apple disse na nota de lançamento do Xcode 6 que agora podemos fazer testes assíncronos diretamente com o XCTest.
Alguém sabe como fazê-lo usando o Xcode 6 Beta 3 (usando o objetivo-C ou Swift)? Não quero o conhecido método de semáforo, mas o novo caminho da Apple.
Procurei na nota lançada e mais, mas não encontrei nada. O cabeçalho XCTest também não é muito explícito.
O vídeo das sessões é perfeito, basicamente você quer fazer algo assim.
A sessão 414 cobre o teste assíncrono no Xcode6.
Como eu fiz no swift2.
Passo 1: define a expectativa.
Passo 2: informe o teste para cumprir a expectativa logo abaixo, onde você captura a resposta.
Passo 3: Diga ao teste que aguarde até que a expectativa seja cumprida.
STep 4: faça asserção após a conclusão da chamada assíncrona.
Como usar as Expectativas de iOS para testar funções assíncronas sem um método de retorno de chamada.
A estrutura de testes da Apple deu grandes passos nos últimos anos. Tornou-se maduro até o ponto em que o desenvolvimento orientado por teste (TDD) não é apenas viável, mas agradável. A introdução das expectativas resolveu um dos maiores obstáculos quando se tratava de testes: operações assíncronas. Acompanhe-se enquanto falamos sobre o caso de uso comum para métodos assíncronos com blocos de conclusão (também conhecido como XCTestExpectation). Também veremos como podemos usar XCTestExpectation para testar processos assíncronos que não possuem um método de retorno de chamada.
Como as expectativas melhoram o TDD.
Antes das expectativas, testar qualquer código que possuísse um componente assíncrono exigisse uma webwork de código que provavelmente provavelmente precisava ser testado, ou mais valioso, o uso de uma biblioteca de teste de terceiros (por exemplo, Kiwi, specta). Embora as expectativas chegassem tarde à festa, esses desenvolvedores de gênio na Apple os adicionaram de uma maneira graciosa e intuitiva que os fez parecer ter sido parte da família de teste por gerações.
Quão gracioso? Vamos pegar esse snippet, por exemplo:
O resultado do acima será pior do que o teste falhando, já que o método de teste irá sair mesmo que haja um manipulador de conclusão com um afirmativo que lhe dirá que o teste passou e tudo é legal. Usando expectativas, no entanto, apenas adicionamos algumas linhas de código:
Com a expectativa definida na primeira linha, podemos executar com segurança nosso método. Quando recebemos nossa resposta no manipulador de conclusão, nossa afirmação é testada e nós chamamos cumprimento da expectativa. Até o preenchimento é chamado o método de teste é considerado concluído, então nosso método tem muito tempo para iniciar sua consulta e retornar uma matriz. Em seguida, atingimos nossa afirmação e chamamos de cumprir se a afirmação é verdadeira ou não.
E se a consulta persistir lá? Não é isso.
Um teste de falha? Iniciando o resto dos testes?
Bem, é o que nosso último pequeno código faz. waitForExpectationsWithTimeOut: handler: faz exatamente como é excessivamente detalhado, mas no nome do nariz implica. Passe um duplo e espera que muitos segundos para que a expectativa seja cumprida. Se esse tempo (neste caso, cinco segundos) passar, você receberá uma mensagem de falha informando a expectativa expirada.
Os aplicativos modernos tornaram-se dependentes da rede, relógios rápidos UI, o que significa que um monte de trabalho de grunhir é feito de forma assíncrona, quer aguardando uma resposta de rede, ou empurrado para uma linha de fundo. As expectativas oferecem uma maneira intuitiva de testar esses métodos, oferecendo uma razão menor para evitar a criação de testes em seus aplicativos.
Como testar funções assíncronas sem um método de retorno de chamada.
E se eu não trouxesse um manipulador de conclusão para essa festa de teste? As expectativas funcionam perfeitamente para funções assíncronas que possuem um manipulador de conclusão de algum tipo. Esse não é o caso das funções assíncronas que não possuem blocos. Como podemos testar estes sem recorrer a adicionar um bloco apenas para fins de teste?
Poderíamos, naturalmente, voltar ao DDBE (Dreary Days Before Expectations) e alavancar semáforos ou distribuir grupos para resolver isso. Mas então, estaríamos se afastando da "Alegria do TDD" para os testes excessivamente complexos que tentamos evitar desde o início. Bem, não tenha medo! Coloque Grand Central Dispatch de volta à sua caverna e sente-se ao redor do resplendor das expectativas mais uma vez!
Digamos que temos uma classe de fonte de dados para nossa visão de tabela cujo init desencadeia um método que questiona nosso db remoto e preenche uma matriz com os resultados. Queremos testar isso, depois de chamar init, a matriz do objeto resultante é preenchida, mas não queremos testar isso logo após a chamada init. Assim:
Ao combinar uma expectativa com dispatch_after, você tem uma maneira de aplicar testes a um método ou propriedade que depende de operações seguras privadas, sem precisar expor métodos ou jerry-rig, um manipulador de conclusão apenas para fins de teste.
Nota final.
A equipe da Apple fez um ótimo trabalho para fazer das expectativas uma maneira intuitiva de testar operações assíncronas. Integrá-los em seu processo de teste é indolor, enquanto aqueles que estão apenas começando com o teste provavelmente assumirão que a XCTestExpectation existe desde o primeiro dia.
Junte-se a mais de 20000 leitores.
Inscreva-se para receber notificações de novas postagens de blog e seja o primeiro a receber informações úteis do aplicativo Savvy Apps!
O Jaz é um desenvolvedor de aplicativos que gosta de criar interações de bom gosto, frotas de bots dominantes do mundo e. trocadilhos.
Artigos recomendados.
Custos de desenvolvimento de aplicativos: o que separa uma aplicação de US $ 10.000 de uma aplicação de US $ 100.000?
Ainda há confusão no mercado sobre o motivo pelo qual o custo para desenvolver um aplicativo pode variar tanto de uma empresa para outra. Enquanto Savvy.
7 Perguntas Startups Precisa responder antes de criar uma aplicação.
Nos sete anos, Savvy Apps criou aplicativos premiados, trabalhamos extensivamente com empreendimentos iniciais e empreendimentos iniciais. Se era um empresário que.
28 Metrics That Matter for Your App.
Você gastou tempo e dinheiro criando seu aplicativo, agora você precisa começar a avaliar como está fazendo. Excluímos 28 das métricas mais úteis.
Quanto tempo leva para fazer uma aplicação?
Embora varie muito, a resposta geral que fornecemos às pessoas nos perguntando quanto tempo leva para criar um aplicativo é de 4-6 meses. Que.
Outras pessoas estão lendo.
Artigos recentes.
Quer trabalhar conosco?
O Savvy Apps é uma empresa de desenvolvimento e desenvolvimento móvel de Washington, D. C. que atende marcas globais e startups de ponta. Somos uma equipe de produtos para aluguel que é conduzida pela vida, um aplicativo por vez.
1850 Centennial Park Drive.
Reston, Virginia 20191.
&cópia de; 2009-2018 Savvy Apps, LLC Todos os direitos reservados.
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.
Tutorial assíncrono de teste da unidade iOS.
Por padrão, os testes de unidade iOS no Xcode são executados exatamente como qualquer outro método, de cima para baixo, em ordem serial. Isso é bom na maioria das vezes. Ocasionalmente, você encontrará a necessidade de escrever um teste de unidade para o código assíncrono. E com a prevalência de fechamentos em Swift, escrever um teste de unidade iOS assíncrona será um lugar ainda mais comum.
O método a ser testado.
Considere este método sob teste:
Isso requer alguma imaginação, mas imagina que este é algum tipo de rotina de análise complicada que leva muito tempo para ser concluída. Dependendo do resultado da análise da entrada, um sucesso de encerramento () ou & # 8216; falha () `(que são fornecidos ao método) são garantidos para ser chamado em algum ponto assíncrono e não determinista no futuro.
Por que isso é difícil de testar.
No núcleo deste método, uma string de entrada será analisada, provavelmente em um segmento diferente. Em alguns casos, isso irá passar, e em alguns casos, isso irá falhar. Precisamos descobrir como escrever testes para verificar isso.
Inicialmente, pode-se pensar em tentar um teste como este:
O problema com esta abordagem é que assumindo que o código de execução longa na análise (_: sucesso: falha) é executado em outro tópico, `testParse_Sucwards () & # 8217; provavelmente irá completar antes que a análise seja concluída, e nunca dar ao teste a chance de realizar a verificação real. Isso resultará em falsos positivos, sem nenhuma maneira de ver o teste falhar.
A solução & # 8211; Expectativas.
Existe uma API realmente legal fornecida em uma extensão XCTestCase que torna possível o teste de código assíncrono.
Aqui, é como você pode usar isso com o exemplo anterior para verificar o código assíncrono:
Olhando para esta linha por linha:
Crie uma expectativa de análise para ter sucesso Quando a análise for bem-sucedida, marque a expectativa conforme cumprida (e, opcionalmente, execute qualquer outra verificação) Falha explícita no teste se a análise não for bem-sucedida. Diga ao XCTest que aguarde 1,0 segundo para que a expectativa seja cumprida ou teste. (Bom, o tempo limite é configurável).
Isso é, agora você pode escrever uma teste de unidade iOS assíncrona!
Obtendo mais limpo.
Agora, você sabe como escrever um teste de unidade iOS assíncrona. Leve um minuto para experimentar estas extensões doces no XCTestCase. Eu acho que você encontrará muitos usos criativos para eles. Tenha em mente que não precisará necessariamente ser um código longo que precisa dessa solução, mas sim qualquer código que vai ser executado de forma assíncrona. Você teste as suas chamadas de API do serviço web?
Deixe uma resposta Cancelar resposta.
Pós-navegação.
The Clean Swifter.
Meu nome é Andy. Eu aspirai a escrever código Swift de alta qualidade e compartilhe minhas aprendizagens com você. Consulte Mais informação…
Комментариев нет:
Отправить комментарий