Saturday 19 May 2018

Aguarde as expectativas com a documentação do tempo limite


Aguarde as expectativas com a documentação em espera
Swift tem um problema especial para mostrar o ponto de quebra de exceção correto quando os closures estão presentes no mesmo escopo.
Eu vi o mesmo problema em um XCTestCase que usou dispatch_after e até mesmo através do ponto de interrupção de exceção era a mesma linha que waitForExpectationsWithTimeout o caso de teste estava falhando por causa de um downcast em um objeto nulo.
Eu sei que este não é o seu caso, mas sempre que isso acontece, sugiro remover as instruções uma linha de cada vez e executar o teste após cada remoção. Se o teste não falhar, você identificou o culpado. Infelizmente, essa é a melhor opção no momento em que este texto é escrito sempre que o Swift mostra um ponto de interrupção de exceção em uma linha que não faz sentido, especialmente a linha infame 0 de uma classe que você pode ver nas ferramentas de relatório de falhas.

Aguarde as expectativas com a documentação em espera
A documentação do XCTest waitForExpectationsWithTimeout: handler :, declara isso.
Apenas um - waitForExpectationsWithTimeout: handler: pode estar ativo a qualquer momento, mas várias sequências discretas de wait> podem ser encadeadas.
No entanto, não tenho ideia de como implementar isso, nem posso encontrar nenhum exemplo. Eu estou trabalhando em uma classe que primeiro precisa encontrar todas as portas seriais disponíveis, escolha a porta correta e, em seguida, conecte-se ao dispositivo conectado a essa porta. Então, estou trabalhando com pelo menos duas expectativas, XCTestExpectation * expectationAllAvailablePorts e * expectationConnectedToDevice. Como eu poderia acorrentar esses dois?

Teste assíncrono de interface do usuário do Xcode.
À medida que continuo a investigar os testes da interface do usuário do Xcode, estou começando a descobrir alguns dos benefícios e desvantagens menos divulgados da ferramenta. Uma nuance específica que chamou minha atenção é como lidar com o teste assíncrono da interface do usuário do Xcode. Os testes de interface do usuário do Xcode são assíncronos, pois simulam a interação do usuário final com seu aplicativo. A interação do usuário final aciona a animação (e, em alguns casos, espera em serviços remotos), e a animação não acontece instantaneamente. Há uma desconexão entre a velocidade na qual as linhas de código em seus testes podem ser executadas e se o simulador (onde o aplicativo em teste está localizado e em execução) pode ser atualizado ou não. Na maioria dos casos, o simulador não consegue acompanhar. Como resultado, você precisa instruir explicitamente seus testes para aguardar que o aplicativo alcance o simulador. Há duas maneiras de fazer isso que estou usando.
Espera Esperta.
waitForExpectationsWithTimeout (_: handler :)
Ao realizar testes assíncronos de interface do usuário do Xcode, muitas vezes é realmente útil verificar se algo apareceu na tela. Dessa forma, você sabe que o aplicativo é um determinado estado e pode continuar executando um script de teste. Por exemplo, imagine um aplicativo com uma barra de guias, selecionando uma guia diferente para mostrar um controlador de visualização diferente. Se você estava escrevendo um teste que dependia de recursos na segunda guia da barra de guias, é importante ter algumas garantias de que, ao instruir seu teste para tocar na segunda guia, a guia será exibida. Além disso, o ato de esperar por algo na tela também pode atuar como um teste em si. Se tocar na segunda guia na verdade não mostrar o que você espera, algo provavelmente deu errado e o teste deve falhar.
Inspirado na Cheat Sheet de Joe Masilotti para o teste Xcode UI, veja como você pode aproveitar waitForExpectationsWithTimeout (_: handler :) para verificar se algo apareceu na tela:
Aqui está uma explicação para este código:
Defina um NSPredicate para ser usado em um XCTestExpectation para verificar se o Go! botão existe no aplicativo. Toque no botão Pronto, defina & # 8230; botão. Aguarde o Go! botão para aparecer.
waitForExpectationsWithTimeout (_: handler :) tentará repetidamente que o NSPredicate seja verdadeiro dentro do tempo limite fornecido, neste caso 5 segundos.
Essa abordagem para verificar se algo existe na tela é incrivelmente útil. É muito parecido com a minha antiga API do KIF waitForViewWithAccessibilityLabel. A coisa é, não é perfeita.
Imperfeito.
Eu observei um número de casos em que o uso dessa abordagem levou a falsos positivos de que um elemento "existe" & # 8221; na tela. Essencialmente, a estrutura de interface do usuário do XCTest observa que o elemento existe, mas na verdade não é tocável, ou em um estado que um usuário final humano consideraria "na tela". # 8221; Se visto isso acontecer com mais freqüência quando essa técnica é usada em combinação com animações acontecendo em conjunto com a ação de teste. Por exemplo, se você tiver um aplicativo que toca um botão, que aciona um controlador de navegação para empurrar um novo controlador de visualização para a pilha, há uma animação relativamente lenta que acontece. Com a abordagem de predicados apresentada acima, o teste assíncrono da interface do Xcode na interface do usuário identificará os elementos da tela de entrada como "existente" & # 8221; antes de estarem no seu local de descanso final & # 8221; no final da animação. Portanto, se você encaminhar etapas adicionais do seu teste na presença de algo na tela, conforme determinado pela estrutura da interface do usuário do XCTest, obterá falsos positivos de que o elemento está na tela e pronto para interação posterior. Essencialmente, os testes da interface do Xcode irão lhe dizer: "Sim, esse botão existe na tela, & # 8221; mas na realidade ainda não está "na tela". # 8221; Não se preocupe, há uma solução, e é incrivelmente idiota.
Espera idiota.
Nesses casos, quando você precisa de uma pausa extra no teste assíncrono da interface do usuário do Xcode em resposta a um evento assíncrono, como uma animação, descobri que o uso de um sleep (1) é muito útil. Essencialmente, isso impedirá que seus testes continuem pelo período de tempo especificado, enquanto o aplicativo em teste pode continuar. Para atualizar o código de exemplo acima, adiciono o sleep (1) em conjunto com a técnica NSPredicate da seguinte forma:
Observe que o sono (1) acontece logo após o NSPredicate ser determinado como verdadeiro. Isso segue a minha descoberta de que os testes da interface do usuário do Xcode identificam as coisas como "& # 8220; existente & # 8221; antes que eles estejam realmente na tela. Usando a técnica NSPredicate com o sleep (1), você verifica a presença de especificar elementos da interface do usuário, além de dar tempo ao aplicativo para concluir tarefas de longa duração, como animações, antes de continuar.
O que é mais engraçado é que este código de exemplo mostrado na tela no WWDC 2016 chamou minha atenção:
Acontece que a Apple usa a mesma técnica!
Afirmações em Encerramentos.
Outra técnica útil no teste assíncrono de interface do usuário do Xcode é executar asserções nos elementos da interface do usuário em resposta à execução do encerramento. Muitas vezes, a indicação de conclusão de chamadas de longa duração, como recuperações de serviços da Web, será implementada com fechamentos. Escrevi testes de interface do usuário do Xcode que chamam explicitamente o serviço da web separado do aplicativo para verificar os dados retornados. Basicamente, asseguro que os dados que o serviço da web bruto retorna correspondem ao que está no aplicativo. Se este é o seu caso de uso ou não, você pode usar esse padrão para fazer asserções no encerramento da conclusão do retorno de chamada. O único requisito é que as chamadas da API da interface do usuário do Xcode precisem acontecer no thread principal:
Use as expectativas para manter o teste em execução enquanto a solicitação é carregada. Carregar dados de forma síncrona da API. Diga ao tópico principal para verificar o que está na tela. (Isso irá falhar se não for feito no thread principal). Explicitamente, o teste falhará se a revelação dos dados opcionais retornados da API falhar. Usando o XCTestExpectation, espere que o código assíncrono seja concluído.
Estes são apenas alguns truques que aprendi para o teste assíncrono de Xcode UI ao dar o primeiro mergulho na API. É sempre bom entrar e experimentar uma ferramenta além do que é mostrado na documentação ou nos vídeos, você tem um controle muito melhor para as nuances do que está disponível. Você criou alguma solução para esses desafios no teste assíncrono de interface do usuário do Xcode?

Teste da interface do usuário: toque em () não acionar a ação do botão.
Olá. Eu tenho lutado para fazer alguns simples (e alguns não tão simples) testes de interface do usuário para iOS com o framework UITesting (XCUI). Embora eu tenha achado a falta de documentação oficial um pouco perturbadora, um obstáculo mais sério foi o. tap () que não acionou a ação do botão. Tenho experiência suficiente em codificação para não culpar os frameworks (especialmente os de grandes players como a Apple), mas não consigo ver onde está a falha em minha configuração, pois já li dezenas de amostras semelhantes na internet. Então, em poucas palavras, meu problema é: chamar app. buttons ["foo"]. Tap () ocasionalmente não ativa a ação do botão. Se eu limpar o material em DerivedData, faça um Clean e reinicie tudo, ele funcionará uma ou duas vezes e então começará a falhar 100% novamente. Por favor, encontre o meu caso de teste abaixo:
Eu tenho rodado isso no Xcode 9.3.1, simulador iOS, alvo de implantação: iOS 9.3.
Re: UI Testing: toque em () não acionando a ação do botão.
Ok, então parece que isso pode ser corrigido pelo kludge, adicionando um sleep (1); nas funções de configuração.

Testando com o Xcode.
Escrevendo classes e métodos de teste.
Quando você adiciona um destino de teste a um projeto com o navegador de teste, o Xcode exibe as classes e métodos de teste desse destino no navegador de teste. No alvo de teste, estão as classes de teste que contêm métodos de teste. Este capítulo explica como você cria classes de teste e escreve métodos de teste.
Testar alvos, testar bundles e o Navegador de teste.
Antes de criar classes de teste, vale a pena dar uma olhada no navegador de teste. Usá-lo é fundamental para criar e trabalhar com testes.
Adicionar um destino de teste a um projeto cria um pacote de teste. O navegador de teste apresenta os componentes do código-fonte de todos os bundles de teste no projeto, exibindo as classes de teste e os métodos de teste em uma lista hierárquica. Aqui está uma visualização do navegador de teste para um projeto que possui dois destinos de teste, mostrando a hierarquia aninhada de bundles de teste, classes de teste e métodos de teste.
Pacotes de teste podem conter várias classes de teste. Você pode usar classes de teste para segregar os testes em grupos relacionados, seja para fins funcionais ou organizacionais. Por exemplo, para o projeto de exemplo da calculadora, você pode criar as classes BasicFunctionsTests, AdvancedFunctionsTests e DisplayTests, todas as partes do pacote de teste Mac_Calc_Tests.
Alguns tipos de testes podem compartilhar determinados tipos de requisitos de configuração e desmontagem, tornando conveniente reunir esses testes em classes, em que um único conjunto de métodos de configuração e desmontagem pode minimizar a quantidade de código que você precisa escrever para cada método de teste.
Criando uma classe de teste.
Nota: Este capítulo se concentra nas classes e métodos de teste de unidade para fins de ilustração. Criar alvos, classes e métodos de teste de interface do usuário e como isso difere do trabalho com testes de unidade é discutido no Teste de Interface do Usuário.
Você usa o botão Adicionar (+) no navegador de teste para criar novas classes de teste.
Você pode optar por adicionar uma classe de teste de unidade ou uma classe de teste de interface do usuário. Depois de escolher um deles, o Xcode exibe um seletor de tipo de arquivo que possui o tipo de arquivo escolhido. Um modelo "Nova unidade de teste de unidade" é destacado na ilustração abaixo. Clique em Avançar para prosseguir com sua seleção.
Cada classe de teste adicionada resulta em um arquivo chamado TestClassName. m sendo adicionado ao projeto, com base no nome da classe de teste inserido na planilha de configuração.
Nota: Todas as classes de teste são subclasses do XCTestCase, fornecidas pelo framework XCTest.
Embora, por padrão, o Xcode organize os arquivos de implementação da classe de teste no grupo que ele criou para os destinos de teste do projeto, você pode organizar os arquivos em seu projeto da maneira que preferir. A folha padrão Xcode Add Files segue essa configuração quando você pressiona o botão Next.
Você usa a folha Adicionar arquivos da mesma maneira que ao adicionar novos arquivos ao projeto no navegador do projeto. Para obter detalhes sobre como usar a folha Adicionar arquivos, consulte Adicionando um arquivo ou uma pasta existente.
Nota: Quando você cria um novo projeto, um destino de teste e um pacote de teste associado são criados para você, por padrão, com nomes derivados do nome do seu projeto. Por exemplo, a criação de um novo projeto chamado MyApp gera automaticamente um pacote de teste chamado MyAppTests e uma classe de teste chamada MyAppTests com o arquivo de implementação MyAppTests. m associado.
Estrutura da Classe de Teste.
As classes de teste têm essa estrutura básica:
A classe de teste é implementada no Objective-C neste exemplo, mas também pode ser implementada no Swift.
Nota: Os exemplos de implementação neste texto estão todos escritos em Objective-C para consistência.
O Swift é totalmente compatível com o uso do XCTest e com a implementação de seus métodos de teste. Todos os recursos de implementação de linguagem cruzada Swift e Objective-C também podem ser usados.
Observe que a implementação contém métodos para instalação e desmontagem de instância com uma implementação básica; esses métodos não são necessários. Se todos os métodos de teste em uma classe exigirem o mesmo código, você poderá personalizar setUp e tearDown para incluí-lo. O código que você adiciona é executado antes e depois de cada método de teste ser executado. Opcionalmente, você pode adicionar métodos customizados para configuração de classes (+ (void) setUp) e desmontagem (+ (void) tearDown), que são executados antes e depois de todos os métodos de teste da classe.
Fluxo de Execução de Teste.
No caso padrão quando executa testes, o XCTest encontra todas as classes de teste e, para cada classe, executa todos os seus métodos de teste. (Todas as classes de teste herdam do XCTestCase.)
Nota: Existem opções disponíveis para alterar especificamente quais testes o XCTest executa. Você pode desativar os testes usando o navegador de teste ou editando o esquema. Você também pode executar apenas um teste ou um subconjunto de testes em um grupo usando os botões Executar no navegador de teste ou na medianiz do editor de origem.
Para cada classe, o teste começa executando o método de configuração de classe. Para cada método de teste, uma nova instância da classe é alocada e seu método de instalação da instância é executado. Depois disso, ele executa o método de teste e, depois disso, o método de desmembramento da instância. Essa sequência é repetida para todos os métodos de teste da classe. Depois que o último rascunho do método de teste na classe foi executado, o Xcode executa o método de desmontagem da classe e passa para a próxima classe. Essa seqüência é repetida até que todos os métodos de teste em todas as classes de teste tenham sido executados.
Escrevendo Métodos de Teste.
Você adiciona testes a uma classe de teste escrevendo métodos de teste. Um método de teste é um método de instância de uma classe de teste que começa com o teste de prefixo, não recebe parâmetros e retorna void, por exemplo, (void) testColorIsRed (). Um método de teste exerce código em seu projeto e, se esse código não produzir o resultado esperado, relata falhas usando um conjunto de APIs de asserção. Por exemplo, o valor de retorno de uma função pode ser comparado a um valor esperado ou seu teste pode afirmar que o uso indevido de um método em uma de suas classes lança uma exceção. XCTest Assertions descreve estas asserções.
Para um método de teste acessar o código a ser testado, importe os arquivos de cabeçalho correspondentes para sua classe de teste.
Quando o Xcode executa testes, ele invoca cada método de teste independentemente. Portanto, cada método deve preparar e limpar quaisquer variáveis ​​auxiliares, estruturas e objetos necessários para interagir com a API do assunto. Se esse código for comum a todos os métodos de teste da classe, você poderá adicioná-lo aos métodos de instância setUp e tearDown descritos na Estrutura da classe de teste.
Aqui está o modelo de um método de teste unitário:
E aqui está um exemplo de método de teste simples que verifica se a instância do CalcView foi criada com sucesso para o SampleCalc, o aplicativo mostrado no capítulo Início rápido:
Escrevendo Testes de Operações Assíncronas.
Os testes são executados de forma síncrona porque cada teste é chamado independentemente um após o outro. Mas cada vez mais código é executado de forma assíncrona. Para lidar com componentes de teste que chamam métodos e funções de execução assíncrona, o XCTest foi aprimorado no Xcode 6 para incluir a capacidade de serializar a execução assíncrona no método de teste, aguardando a conclusão de um retorno de chamada ou tempo limite assíncrono.
Um exemplo de fonte:
Para obter mais detalhes sobre como escrever métodos para operações assíncronas, consulte a documentação de referência do XCTestExpectation.
Escrevendo testes de desempenho.
Um teste de desempenho usa um bloco de código que você deseja avaliar e executa-o dez vezes, coletando o tempo médio de execução e o desvio padrão das execuções. A média dessas medições individuais forma um valor para o teste que pode ser comparado com uma linha de base para avaliar o sucesso ou a falha.
Nota: A linha de base é um valor que você especificou para ser usado na avaliação de aprovação ou falha de teste. A interface do usuário do relatório fornece um mecanismo para definir ou alterar o valor da linha de base.
Para implementar testes de medição de desempenho, você escreve métodos usando a nova API do XCTest no Xcode 6 e posterior.
O exemplo simples a seguir mostra um teste de desempenho escrito para testar a velocidade de adição com o aplicativo de amostra da calculadora. Um measureBlock: é adicionado junto com uma iteração do XCTest para time.
Testes de desempenho, uma vez executados, fornecem informações no editor de código-fonte ao visualizar o arquivo de implementação, no navegador de teste e no navegador de relatórios. Clicar nas informações apresenta valores de execução individuais. A exibição de resultados inclui controles para definir os resultados como a linha de base para futuras execuções dos testes. As linhas de base são armazenadas por configuração de dispositivo, para que você possa ter o mesmo teste sendo executado em vários dispositivos diferentes e manter uma linha de base diferente dependendo da velocidade, memória e assim por diante do processador da configuração específica.
Nota: Os testes de medição de desempenho sempre relatam falhas na primeira execução e até que um valor de linha de base seja definido em uma configuração de dispositivo específica.
Para obter mais detalhes sobre métodos de escrita para testes de medição de desempenho, consulte a documentação de referência do XCTestCase.
Escrevendo testes de interface do usuário.
A criação de testes de interface do usuário com o XCTest é uma extensão do mesmo modelo de programação que a criação de testes de unidade. Operações similares e metodologia de programação são usadas em geral. As diferenças no fluxo de trabalho e na implementação estão concentradas no uso da gravação da interface do usuário e nas APIs de teste da interface do usuário do XCTest, descritas em Teste da interface do usuário.
Escrevendo testes com o Swift.
O modelo de controle de acesso Swift, conforme descrito na seção Controle de acesso da Linguagem de programação Swift (Swift 4.1), impede que uma entidade externa acesse “qualquer coisa” declarada como interna em um aplicativo ou estrutura. Por padrão, para poder acessar esses itens a partir do seu código de teste, você precisaria elevar o nível de acesso deles para pelo menos o público, reduzindo os benefícios da segurança do tipo do Swift.
O Xcode fornece uma solução de duas partes para este problema:
Quando você define a configuração de compilação Ativar Testabilidade como Sim, que é verdadeira por padrão para compilações de teste em novos projetos, o Xcode inclui o sinalizador - enable-testing durante a compilação. Isso torna as entidades Swift declaradas no módulo compilado elegível para um nível mais alto de acesso.
Quando você adiciona o atributo @testable a uma instrução de importação para um módulo compilado com o teste ativado, você ativa o acesso elevado para esse módulo nesse escopo. Classes e membros da turma marcados como internos ou públicos se comportam como se fossem marcados como abertos. Outras entidades marcadas como ato interno como se fossem declaradas públicas.
Observe que você não altera seu código-fonte de nenhuma maneira. Você modifica somente a compilação (lançando um sinalizador) e o código de teste (modificando uma declaração de importação). Por exemplo, considere um módulo Swift como esta implementação AppDelegate para um aplicativo chamado "MySwiftApp".
Para escrever uma classe de teste que permita acesso à classe AppDelegate, modifique a instrução de importação em seu código de teste com o atributo @testable, da seguinte maneira:
Com esta solução, as funções internas do código do seu aplicativo Swift são totalmente acessíveis às suas classes e métodos de teste. O acesso concedido para @testable imports garante que outros clientes sem teste não violem as regras de controle de acesso do Swift, mesmo quando compilando para teste. Além disso, como o seu release não habilita a testabilidade, os consumidores regulares do seu módulo (por exemplo, se você distribuir uma estrutura) não podem obter acesso a entidades internas dessa maneira.
Nota: @testable fornece acesso somente para funções internas; Declarações privadas e privadas de arquivos não são visíveis fora de seu escopo usual ao usar @testable.
Asserções XCTest.
Seus métodos de teste usam asserções fornecidas pela estrutura XCTest para apresentar os resultados do teste que o Xcode exibe. Todas as asserções têm uma forma semelhante: itens para comparar ou uma expressão lógica, um formato de seqüência de resultado de falha e os parâmetros para inserir no formato de seqüência de caracteres.
Nota: O último parâmetro de todas as asserções é o formato. , uma string de formato e sua lista de parâmetros variáveis. O XCTest fornece uma string de resultado de falha padrão para todas as asserções, montadas usando os parâmetros passados ​​para a asserção. A string de formato oferece a capacidade de fornecer uma descrição adicional e personalizada da falha que você pode optar por fornecer além da descrição fornecida. Este parâmetro é opcional e pode ser omitido.
Por exemplo, observe esta afirmação no método testAddition apresentado em Início rápido:
XCTAssertEqualObjects ([calcViewController. displayField stringValue], @ "8", @ "Parte 1 falhou.");
Lendo isso como linguagem simples, diz: "Indique uma falha quando uma string criada a partir do valor do campo de exibição do controlador não é a mesma que a string de referência" 8 "." Xcode sinaliza com um indicador de falha no navegador de teste se a declaração falha e o Xcode também exibe uma falha com a sequência de descrição no navegador de ocorrências, no editor de origem e em outros locais. Um resultado típico no editor de código é assim:
Um método de teste pode incluir várias afirmações. O Xcode sinaliza uma falha no método de teste se qualquer uma das asserções contidas relatar uma falha.
As afirmações se enquadram em cinco categorias:
Falha Incondicional. Use isso quando simplesmente alcançar uma ramificação específica de código indica uma falha. A única afirmação nesta categoria é XCTFail.
Testes de Igualdade. Use-os para afirmar um relacionamento entre dois itens. Por exemplo, XCTAssertEqual afirma que duas expressões têm o mesmo valor, enquanto XCTAssertEqualWithAccuracy afirma que duas expressões têm o mesmo valor dentro de uma certa precisão. Esta categoria também inclui testes de desigualdade, como XCTAssertNotEqual e XCTAssertGreaterThan.
Testes Booleanos. Use-os para afirmar que uma expressão booleana avalia uma determinada maneira, por exemplo, usando XCTAssertTrue ou XCTAssertFalse.
Testes nulos. Use-os para afirmar que um item é ou não é nulo, por exemplo, usando XCTAssertNil ou XCTAssertNotNil.
Testes de Exceção. Use-os para afirmar que avaliar uma expressão gera uma exceção ou não. Você procura qualquer exceção a ser lançada com XCTAssertThrows ou pode procurar uma exceção específica com uma declaração como XCTAssertThrowsSpecific. Você também pode afirmar o inverso, que nenhuma exceção é lançada ao avaliar uma expressão, usando uma função como XCTAssertNoThrow.
O XCTest Framework Reference contém uma enumeração completa de todas as funções de asserção disponíveis.
Usando Assertions com Objective-C e Swift.
Ao usar as asserções XCTest, você deve conhecer as diferenças fundamentais na compatibilidade e comportamento das asserções ao escrever o código Objective-C (e outros idiomas baseados em C) e ao escrever o código Swift. Entender essas diferenças facilita a gravação e a depuração de seus testes.
As declarações do XCTest que realizam testes de igualdade são divididas entre aquelas que comparam objetos e aquelas que comparam objetos não-objetos. Por exemplo, XCTAssertEqualObjects testa a igualdade entre duas expressões que são resolvidas para um tipo de objeto, enquanto o XCTAssertEqual testa a igualdade entre duas expressões que são resolvidas para o valor de um tipo escalar. Essa diferença é marcada na listagem de asserções do XCTest, incluindo - este teste é para escalares - na descrição. Marcar afirmações com "escalar" desta forma informa sobre a distinção básica, mas não é uma descrição exata de quais tipos de expressões são compatíveis.
Para Objective-C, asserções marcadas para tipos escalares podem ser usadas com os tipos que podem ser usados ​​com os operadores de comparação de igualdade: ==,! =, & Lt; =, & lt; & gt; = e & gt; . Se a expressão resolver para qualquer tipo C, struct ou comparação de matriz que funcione com esses operadores, ela será considerada escalar.
Para o Swift, asserções marcadas para escalares podem ser usadas para comparar qualquer tipo de expressão que esteja de acordo com as asserções de protocolo Equable (para todos os "iguais" e "não iguais") e Comparable protocol (para o "maior que" e sem que "). Além disso, asserções marcadas para escalares têm overrides para [T] e para [K: V], onde T, K e V estão em conformidade com os protocolos Equable ou Comparable. Por exemplo, matrizes de um tipo equivalente são compatíveis com XCTAssertEqual (_: _: _: file: line :), e dicionários cujas chaves e valores são ambos tipos comparáveis ​​são compatíveis com XCTAssertLessThan (_: _: _: file: line: ).
O uso de asserções do XCTest em seus testes também difere entre o Objective-C e o Swift por causa de como as linguagens diferem no tratamento de tipos de dados e conversões implícitas.
Para Objective-C, o uso de conversões implícitas na implementação do XCTest permite que as comparações operem independentemente dos tipos de dados das expressões, e nenhuma verificação é feita dos tipos de dados de entrada.
Para o Swift, as conversões implícitas não são permitidas porque o Swift é mais rigoroso quanto à segurança de tipos; ambos os parâmetros para uma comparação devem ser do mesmo tipo. As incompatibilidades de tipo são sinalizadas em tempo de compilação e no editor de código-fonte.
Copyright & # x00a9; 2017 Apple Inc. Todos os direitos reservados. Termos de Uso | Política de Privacidade | Atualizado em: 2017-01-24.

wait For Expectations With Timeout: manipulador:
Aguarda até que todas as expectativas sejam atendidas ou o tempo limite seja atingido.
Declaração.
Parâmetros
A quantidade de tempo em que todas as expectativas devem ser atendidas.
Um bloco opcional do Manipulador de Conclusão do XCWait para invocar quando todas as expectativas tiverem sido atendidas ou quando o tempo limite de espera for acionado. (O tempo limite é sempre tratado como uma falha de teste.)
Discussão.
Este método cria um ponto de sincronização no fluxo de um teste. Apenas uma espera Por Expectativas Com Tempo Limite: manipulador: pode estar ativo a qualquer momento, mas várias sequências discretas de "criam expectativas e esperam que elas sejam atendidas". podem ser encadeados juntos.
Este método aguarda as expectativas criadas apenas com os métodos de conveniência do XCTest Case. Esse método não espera as expectativas criadas manualmente por meio de inicializadores no XCTest Expectation ou em suas subclasses.
Para aguardar expectativas criadas manualmente, use a opção esperar por expectativas: tempo limite: ou espere por expectativas: tempo limite: impor ordem: métodos ou os métodos correspondentes no XCTWaiter, passando uma lista explícita de expectativas.
Os clientes não devem manipular o loop de execução enquanto usam esta API.

No comments:

Post a Comment