Waitforexpectationswithtimeout Objective C Compiler


Issue 7 28 Jan 2016 Esta semana nos trouxe o Xcode 7.3 beta2, a primeira versão oficial do Xcode que inclui o Swift 2.2 e inclui contribuições da comunidade open source da Swift. org. Eu nunca pensei que veria notas de versão como esta. É realmente incrível ver as mudanças conduzidas pela comunidade nas seções Whats New com links para o GitHub. Claramente, o próximo grande passo para a Apple deve ser open source Xcode. Repositórios Você notou o novo repositório de swift-integração-testes no GitHub De acordo com a história parece que este repo tem sido em torno desde o anúncio de fonte aberta inicial, mas até agora tem sido privado. Como você pode imaginar, inclui testes. Mais especificamente, os testes automatizados para validar os snapshots Swift gerados comportam-se corretamente. Mas espere, há mais Outro novo repositório apareceu na semana passada, rápido-internos. Ele contém este site. De acordo com a página de boas-vindas, o site hospeda a documentação interna do compilador Swift e da biblioteca padrão, assim como a versão de desenvolvimento das Diretrizes Swift API. . Infelizmente, ele contém apenas as diretrizes da API no momento. Documentação para o compilador Swift soa como seria ótimo para contribuidores. Além disso, isso significa que o Nate Cook pode desligar SwiftDoc. org. Começa e puxa solicitações Doug Gregor começou e terminou a implementação da proposta SE-0021. Nomeando Funções com Argumento Labels. Doug Gregor também implementou SE-0022. Referenciando o seletor Objective-C de um método. (Sim, foi aceito.) Não mais stringly-typed Objective-C seletores Eu gostei da experiência de tweeting ao vivo. Você pode verificar os compromissos aqui: dccf315. 7c0e087. 89834f8. F7407f6. Greg Titus melhorou a qualidade das mensagens de diagnósticos, e tem sido geralmente em um rolo com solicitações pull. Brian Gesiak submeteu uma solicitação pull que implementa a API de teste assíncrono em corelibs-xctest. Ele espelha a API do Objective-C XCTest, adicionando os métodos conhecidos expecttationWithDescription () e waitForExpectationsWithTimeout (). O Nate Cook adicionou um tipo de intercalação no local à biblioteca padrão. Da descrição: Este algoritmo de classificação é estável e oferece um aumento significativo de velocidade (1,5x-10x ou mais) em muitos cenários de classificação comuns. William Dillon adicionou suporte para ARMv6 (original Raspberry Pi) e corrigiu alguns bugs ARMv7. Brian Croom enviou uma solicitação de pull para o corelibs-xctest para discutir a compatibilidade entre Darwin XCTest e corelibs-xctest. Propostas Erica Sadun propôs a Eliminar Swifts Screaming Snake Case Identifiers e, portanto, dizer adeus a outro vestígio de C. gtThis proposta visa eliminar Swifts screaming snake caso como FILE e FUNÇÃO e substituindo instâncias com um comum octothorpe prefixo camelo inferior Case sourceLocalização representação. A proposta SE-0013. Remover a aplicação parcial de métodos Super não-final. foi rejeitado . As três propostas seguintes estão agora a ser analisadas. Essas propostas estão relacionadas e, portanto, as revisões estão sendo executadas simultaneamente: SE-0023. API Design Guidelines SE-0006. Aplicar Diretrizes da API à Biblioteca Padrão SE-0005. Melhor tradução de APIs do Objective-C em listas de distribuição Swift Nicole Jacque observa que há um novo formato de nomeação de instantâneo. A partir de agora, os snapshots da versão de desenvolvimento começarão com o swift-DEVELOPMENT-SNAPSHOT para distinguir claramente entre instantâneos de versão. Dmitri Gribenko investigou e reduziu significativamente o tempo de construção de StdlibUnittest. StdlibUnittest é uma biblioteca interna que é usada para gravar testes para o stdlib, partes do tempo de execução eo compilador. GtBut há um problema: hoje, StdlibUnittest leva muito tempo para construir. Gt Estas medições de tempo mostram que o tempo de construção do módulo combinado é maior do que a soma dos tempos de construção das peças e muito mais quando a otimização é ativada. Podemos fazer uma conjectura de que o otimizador não está escalando bem com o tamanho do módulo. Finalmente E finalmente se você sente como Swift está mudando muito rápido ou se você está simplesmente interessado em tentar algo novo, posso sugerir TrumpScript. Deixa a programação grande again. AWS SDK 2.2, iOS 9, Xcode 7 8211 Aventuras em Aprendizagem Bem, it8217s foram três anos e meio, mas I8217ve finalmente chegou ao redor para chegar a um ponto de escrever um aplicativo iOS. Eu não aguentaria a sua respiração esperando para obter uma cópia, embora fosse puramente para meu uso particular, para ajudar na monitoração e administração do projeto IES. Depois de fazer tutoriais suficientes e exercícios similares para ser confortável na construção do aplicativo e da interface do usuário, eu tenho ao redor de tentar chamadas para a infra-estrutura AWS. Isso se revelou um pouco mais difícil do que eu esperava, portanto, este aide-mmoire. Este isn8217t vai ser útil para desenvolvedores não iOS, e eu duvido it8217s vai ter nada de novo para mais experiente iOS desenvolvedor iOS noobs como eu preciso se preocupar. Configurando as bibliotecas Obter o SDK. Primeiro, eu precisava obter um porão do AWS SDK para iOS. Simplesmente 8211 simples eu baixá-lo como notado em seu site. Tente usar o SDK Segundo, eu criei um novo aplicativo de iOS em uma única página para usar como código de pico. Meu objetivo com esta aplicação é puramente para aprender a integrar o SDK AWS vinculação na biblioteca e fazer uma chamada para fora. Para este pico, eu não preciso fazer nada fantasia listando as regiões AWS é um bom começo 1. Mas antes de fazer qualquer um desses, eu preciso ser capaz de criar credenciais 2. Para isso, eu abri o ViewController. swift gerado automaticamente. Definir constantes para o Access AWS e chaves secretas e, em seguida, tentar criar minhas credenciais. Não surpreendentemente, este trabalho didn8217t 8211 neste momento, eu haven8217t adicionado o AWS SDK para o meu projeto. Este processo acabou por ser irritante o suficiente para me fazer perder Maven weve sido estragado em Java-terra. Link na biblioteca (também conhecido como 8216Fix os erros do compilador8217) A página SDS do AWS para iOS inclui instruções para fazer isso. Mas eles estão desatualizados e não funcionam para mim. A maneira preferida 8211 usando CocoaPods 8211 didn8217t trabalho para mim eu couldn8217t instalá-lo. Assim que deixou o caminho manual. Mas o Xcode 7 mudou sua configuração o suficiente para que eu simplesmente não pudesse seguir as instruções. O que funcionou para mim. Adicionando as estruturas 8211 Selecionei o arquivo de projeto no navegador do projeto, que me permitiu editar as configurações de construção do projeto e do destino. Ao selecionar o destino para o aplicativo principal, consegui selecionar a página 8216Build Phases8217. Isso incluiu uma seção 8220Link binário com bibliotecas8221. Eu então arrastar e soltar os frameworks AWS para essa seção (tudo o que eu preciso agora são as estruturas AWSCore e AWSEC2). Em seguida, adicionei as outras bibliotecas mencionadas na documentação AWS 8211 libsqlite3.tbd. Libz. tbd ea estrutura de configuração do sistema. Aparentemente tbd é o novo formato de biblioteca dinâmica Tentando construir ainda resulta em erros, embora 8282 Xcode can8217t encontrar as estruturas AWSCore e AWSEC2. Para corrigir isso, preciso alterar o caminho do link. Para fazer isso, eu selecionei o arquivo de projeto novamente, desta vez selecionando o projeto em si e acessando a página 8216Build Settings8217 para o projeto. Nessa página, há um grupo chamado 8220Search Paths8221. Lá, há uma seção 8220Framework Search Paths8221 Eu adicionei o AWS SDK que eu baixei aqui. Edifício novamente limpa o erro linker 8211 mas Xcode ainda doesn8217t saber sobre as classes AWS. Swift código isn8217t como Java 8211 there8217s nenhum caminho de classe que torna as classes disponíveis. Nem é exatamente como C ou Objective-C, onde você importa cabeçalhos em cada arquivo. Para incluir frameworks baseados em Objective-C (como este) no meu projeto baseado em Swift, preciso criar um cabeçalho de ponte. Levei um par de tentativas para obter este um 8211 a maneira fácil é simplesmente para adicionar um arquivo Objective C para o projeto (você pode excluí-lo mais tarde) Xcode, em seguida, pede-lhe para adicionar o cabeçalho de ponte automaticamente. Uma vez que o cabeçalho de ponte foi criado, eu poderia importar as bibliotecas necessárias: Testando as credenciais Neste ponto, eu poderia construir e executar o projeto no simulador do iOS. Lembre-se, ele doesn8217t exatamente fazer nada yet8230 assim que o próximo passo é obtê-lo para fazer a descrição de Regiões pedido. O código de exemplo fornecido com o SDK do AWS não inclui exemplos do EC2, mas não era fácil descobrir o que o código deveria ser. Acaba com algo como isto: Então crie e execute o projeto, e tudo simplesmente funciona, certo, eu desejo. 8230 nada é sempre simples. O método viewDidLoad é chamado, naturalmente, logo após a exibição principal para esta aplicação de spike é carregada no iOS Simulator. As instruções de impressão ir para o console, visível no IDE. O pedido de descrição de regiões é enviado apenas fino 8211, mas ele retorna um erro: 8220 Um erro SSL ocorreu e uma conexão segura com o servidor não pode ser feita8221 Acontece que, no iOS 9, a Apple apertou a camada de segurança de rede 8211 todas as chamadas de saída Passam agora por uma camada de segurança de transporte de aplicativos. Por padrão, isso significa que todas as conexões precisam atender a certas condições que o AWS Web Service não (e provavelmente não será possível em breve). Para corrigir isto, precisamos adicionar uma exceção às regras de segurança. E agora ele funciona Quando eu abrir o aplicativo no simulador, eu vejo as regiões listadas no console. Obviamente, preciso fazer mais (talvez, por exemplo, mostrá-los em uma tabela ou em um menu suspenso onde o usuário pode selecionar sua região preferida), mas isso resolve o problema técnico de falar com a AWS. Então, como eu testa este material? Mais um teste thing8230. Eventualmente, I8217ll envolverá a comunicação AWS com uma fachada específica de domínio. A maior parte do meu código, quando eu testá-lo, vai falar com uma fachada simulada. Mas I8217m vai precisar de ser capaz de testar a fachada real 8211 o que significa que I8217m vai precisar fazer essas chamadas no meu código de teste. Xcode criou uma classe de teste de espaço reservado classe para mim, então eu mover o código AWS lá. Mas quando eu vou construir e executar os testes, recebo um monte de erros linker Acontece que a fase de construção de teste doesn8217t obter automaticamente as mesmas dependências que a fase principal 8211, então eu preciso repetir adicionando as estruturas na fase de construção de teste . Agora, o teste cria e executa o 8211, mas termina antes de retornar o pedido de Região de descrição. Isso ocorre porque o AWS SDK para iOS é assíncrono por padrão o thread de teste doesn8217t aguardar o pedido, por isso termina cedo. Felizmente, um dos livros que li ao aprender iOS programação iOS 8 Desenvolvimento SDK cobriu isso perfeitamente: Enrolá-lo Neste ponto, I8217ve conseguiu obter o código no aplicativo principal para falar com a AWS, bem como o código nos casos de teste. Este é o principal ponto técnico necessário para o meu aplicativo de administração de back-office agora mesmo. A maior parte do que ele precisa fazer é fazer chamadas da AWS e mostrar os resultados. It8217s principalmente indo para falar com SimpleDB e CloudWatch, ambos os quais têm iOS APIs disponíveis Eu poderia usar uma API OpsWork, bem como, mas um doesn8217t existem (ainda 8211 talvez I8217ll escrever um se eu realmente precisar dele). O outro pico técnico que preciso fazer é como pegar as chaves AWS e colocá-las em KeyChain (talvez com TouchID também) 8211, mas that8217s para outro dia. Na verdade, I8217d preferem usar uma chamada para o AWS Identity amp Access Management API (IAM) para recuperar, por exemplo, o nome do usuário. Mas IAM é uma das muitas APIs que a Amazon ainda construiu um wrapper para iOS. O Describe Region faz um bom substituto, especialmente porque provavelmente vou querer ser capaz de selecionar a região de uma lista em algum momento.1608617 Para o que estou tentando fazer agora, I8217m se estabelecendo para a abordagem fácil, mas não recomendada De usar o Static Credentials Provider, e hardcoding minhas chaves AWS que I8217m não mostrando. A médio prazo, vou entrar nesses através da interface do usuário e armazená-los no keychain prazo mais longo que eu poderia até mesmo mudar para a abordagem mais difícil, mas recomendado de usar o serviço AWS Cognito. Robert Watkins Meu nome é Robert Watkins . Eu sou um desenvolvedor de software e foram por mais de 18 anos agora. Eu atualmente trabalho para as pessoas, mas as minhas opiniões aqui não são de forma alguma aprovado por eles (que é legal suas opiniões arent endossado por mim). Meus principais interesses profissionais estão no desenvolvimento de Java, usando métodos Agile, com um foco histórico na construção de aplicativos baseados na web. Im também um Mac-fã e amo meu iPhone, que Im atualmente aprendendo a codificar para. Eu vivo e trabalho em Brisbane, Austrália, mas eu cresci no Território do Norte, e ainda encontrar Brisbane muito frio (depois de 16 anos aqui). Eu sou casado, com dois filhos e um gato. Minha política é socialista em tendência, minha afiliação religiosa é ateia (aka nenhuma das anteriores), minha atitude é condescendente e minha posição moral está deitada. Ver todas as postagens de Robert Watkins Deixe uma resposta Cancelar respostaTestando em Swift Transcrição de vídeo abaixo fornecido pela Realm. Realm Swift é um substituto para SQLite Core Dados escritos para Swift Swift promete-nos o melhor de ambas as linguagens imperativas e funcionais, mas isso irá afectar a forma como testamos as nossas aplicações. Nesta conversa, Jan Riehn compartilha sua experiência de testes do mundo real Swift, incluindo um aplicativo Swift de 15.000 linhas com quase 100 testes de cobertura, iniciado apenas duas semanas após o lançamento do Swift. Você pode visualizar os testes de amostra do Jans no GitHub. Escrever seu primeiro teste (0:00) Acredito que o teste é uma arte. Ela desafia você, e suas habilidades. Exige imaginação, criatividade e habilidades técnicas realmente sólidas. Praticamente, isso ajuda você a escrever código bom, e eu acho que o bom código vive nos detalhes. Se você nunca escreveu um teste antes, é muito fácil. Você cria um teste usando Xcode, e lá você vai Seu primeiro teste. Para testar em Swift, você terá que importar XCTest. Apples testing framework. Seu teste terá que herdar de XCTestCase. Então você faz alguma inicialização para setUp e tearDown. Criar o seu mocks, e configurar o seu teste: Aqui, temos lá muito, muito simples testExample. Que apenas afirma verdadeiro. Você também tem uma mensagem, que pode ajudá-lo a encontrar um erro, especialmente em um ambiente automatizado. Você também pode fazer testes de desempenho Xcode fornece um encerramento, que você pode ver no measureBlock. Conta o tempo entre as execuções. Um teste de exemplo (2:41) Agora você pode começar a testar em Swift. Vamos dizer que queremos testar uma simples chamada HTTP, talvez um HTTP GET para swiftsummit. Para isso, eu uso NSURLSession. Você pode ver que temos dados, uma resposta e um erro, e que o processamos no encerramento. Em seguida, você começaria a escrever um teste: Isto é como você iria envolvê-lo em um caso de teste. Você precisa do URL. A Apple fornece uma expectativa, que você pode usar para aguardar tarefas assíncronas. No fechamento, armazenamos os dados que recebemos em uma variável, que será inicializada como uma opção de NSData. Depois disso, há uma linha muito importante de código que é waitForExpectationsWithTimeout. Isso irá esperar exatamente cinco segundos antes do teste a espera irá interromper e falhar. Você também pode fazer alguma manipulação de código de erro dentro do manipulador. Depois disso, você pode afirmar que os dados que você recebeu não são nulos. Isso é como você iria testar chamadas assíncronas. Reflexão (4:18) No primeiro dia da Cúpula Rápida, tivemos muitas discussões muito interessantes sobre reflexão. Por que todo o barulho Na minha opinião, para o teste você vai precisar de algumas coisas importantes: você vai precisar de piadas, tocos e falsificações todas as coisas que você encontra em um quadro de zombaria, que será baseado na reflexão. Você usa quadros de simulação porque torna o ambiente de teste muito fácil, muito útil e muito legível. Swift oferece alguma reflexão muito básica, que não é parte da API pública (por isso, não use este é o seu código de produção). A parte principal desta API privada é um método refletir func reflectltTgt (x: T) - gt MirrorType que retorna um MirrorType. Ambos são baseados fora da API padrão. Theres também um protocolo chamado Reflectable: Seu muito básico, mas ele ajuda você a obter o valor de um objeto durante o tempo de execução. Você pode iterar sobre todas as propriedades, mas não métodos, e há somente um getter, nenhum setter. Além disso, devo dizer que não há nada de novo aqui, exceto o que esquecemos e estamos redescobrindo. Testar é testar. Se você o fizer em Swift, se você o fizer em Objective-C, se você fizer isso em JavaScript, se você fizer em Java, você precisa ter um bom conhecimento de certas coisas, e você precisa ter um determinado ambiente. Com Swift, no momento tudo o que temos é XCTest, e apenas uma reflexão muito básica, por isso precisamos cuidar de nossos tocos, burlas e falsificações por nós mesmos. Lições Aprendidas com Produção Rápida (6:57) Em seguida, quero compartilhar as lições que aprendi. Em nosso projeto, começamos a usar o Swift em produção apenas duas semanas depois de ter sido lançado. Em junho de 2014 Para um cliente, como de falar temos quase 15.000 linhas de código de produção, ea mesma quantidade de código de teste eu diria que estamos muito perto de 100 cobertura de teste. Como se sente É divertido, muito divertido. Ele também pode ser irritante, mas o que eu aprendi é que se você fizer testes pesados ​​em Swift, você é obrigado a escrever código limpo, de modo que os aborrecimentos valem a pena. É muito fácil para um iniciante começar a testar. Swift torna muito fácil, porque você pode começar a escrever seus mocks inline nos métodos que você está testando. Isso é muito novo, e torna muito fácil experimentar algo. Já tínhamos a oportunidade de usar quadros zombadores com o Objective-C, com frameworks como o Mockito, adaptado para o Objective-C pelo OCMockito. Nós podemos usar isso para Swift também. Este é um exemplo de algo que você pode escrever se você quiser zombar de uma conexão de servidor. Existem algumas limitações: os testes têm de ser escritos em Objective-C, e os objectos que pretende simular têm de herdar do NSObject. As referências e isso é muito chato ter que implementar um protocolo. E, infelizmente, não sou capaz de stub, esperar ou verificar métodos de classe. Mas com esta configuração muito simples em suas classes Swift, você pode criar mocks como este. Você não tem que escrever seus próprios stubs, você não tem que escrever seus próprios mocks. Este código só cria stubs. Ele diz que eu quero um stub, o método busca dados, e ele deve retornar a string stubbed. Ao fazer isso, eu posso ter um controlador onde eu basta ligar o meu simulador e eu chamo o método. O mock envolve minha implementação real e retorna o que eu esperava. Escrevendo seus próprios mocks e falsificações (10:12) Se você escrever mocks e fakes por conta própria, é importante lembrar que a configuração do teste é a chave para o sucesso. Você deve ser capaz de entender a classe de teste dentro de alguns segundos, ele não deve demorar mais. Você vai ter um monte de boilerplate, mas é por isso que você deve ir para mocks reutilizáveis. Você deve separar as classes de teste para diferentes casos de uso. Vamos imaginar que você tem um cliente HTTP que é muito grande, com uma classe de teste para casos de sucesso e uma classe de teste para casos de falha, apenas para dividi-lo. Uma coisa muito importante é que você tem que separar o puro do impuro e stateful a velha lição sobre separar a interface do usuário do código de negócios. Vá para controladores de vista fina. Não modifique estados externos, e não produzir efeitos colaterais, porque isso faz testes realmente, muito difícil. Compile Times (12:13) A outra grande coisa quando testar com Swift é compilar o tempo, especialmente se você tem que construir para Swift 1.1. Incluindo testes, podemos ter 30.000 linhas de código. Demora 60 segundos para compilar, o que é muito lento. E especialmente se você estiver usando Test Driven Development. É uma ótima maneira de fazer tempo para ler seus e-mails, ou ir para uma caminhada. Há duas coisas que eu posso recomendar a você. Em primeiro lugar, se possível, construir com Swift 1.2. A Apple adicionou a capacidade de compilar com construções incrementais, o que dá um enorme impulso de desempenho. Em segundo lugar, não adicione o seu código de produção como um membro da sua meta de teste. Se o fizer, o código de produção será compilado duas vezes. Que ocuparia um terço do tempo de compilação. Frameworks (13:27) Id gostaria de mencionar Hamcrest para Swift. Ele tem alguns realmente, realmente impressionante afirma. Muito fácil de usar, especialmente com opcionais. Outra coisa que eu recomendo é UIAutomation. Especialmente para testes funcionais. Definitivamente tentar isso como parte do Xcode. E para terminar, uma previsão para o futuro do teste Swift: a reflexão está chegando. Em breve, receberemos muitas melhorias do compilador e veremos muitas novas ferramentas. Muito obrigado Você pode ver testes de exemplo Jans no GitHub.

Comments

Popular Posts