Aguarde as expectativas com o tempo de espera 3


Waitforexpectationswithtime swift 3
Eu estava apenas praticando o TDD e escrevi uma função muito simples para um aplicativo de teste. A interface do usuário é simples: tem um botão com "0" como título inicialmente. No meu controlador de visão, eu tenho uma variável local "pontuação". Toda vez que eu toquei no botão, aumentaria a "pontuação". O título do botão será atualizado com o novo valor de "pontuação". A lógica de atualização do ui do botão está no observador da propriedade "didSet" "score".
Tudo é legal, exceto o teste de interface do usuário. Eu tenho duas funções de teste de ui, uma é tocar no botão uma vez e outra é tocar no botão duas vezes. Agora a coisa estranha acontece. Abaixo estão as imagens das minhas duas funções de teste ui.

Waitforexpectationswithtime swift 3
Estou tentando atualizar meus testes de unidade assíncrona para usar a nova interface XCTestExpectation em vez de girar manualmente o loop de execução.
Meus testes de unidade anteriormente utilizavam as funções waitForBlock, finishBlock e waitForTimeInterval: que é simplesmente um método de conveniência que chamava o finishBlock após o tempo especificado. Estou tentando atualizar essa configuração para usar as expectativas.
Os testes que estavam utilizando a semântica waitForBlock + finishBlock estão todos funcionando como esperado depois de serem substituídos por waitForExpectationsWithTime: handler: e fulfill, mas minha solução para substituir waitForTimeInterval: parece não estar funcionando.
Parece que o código realmente funciona. então isso foi provavelmente apenas o Xcode 6 transando comigo esta tarde.
Eu sinto que deve ser bastante direto: criar uma expectativa, configurar um bloco assíncrono que cumpre é e esperar. No entanto, o bloco dispatch_after nunca é chamado.
Meu palpite é que waitForExpectationsWithTimeout: handler: bloqueia seu thread atual, que é a fila principal, de forma que o loop de execução nunca chega aos seus blocos assíncronos. Isso parece razoável, mas estou tendo problemas para criar uma maneira diferente de implementar essa funcionalidade.
Eu estou procurando 1) informações adicionais sobre XCTestExpectation que possam revelar uma solução alternativa, ou 2) uma ideia diferente para implementar essa funcionalidade.

Teste iOS assíncrono no Swift com o XCWaiter.
A Apple recentemente anunciou o snapshot de desenvolvimento do Swift 3.1 e o XCode 8.3 para os desenvolvedores. Há algumas classes úteis adicionadas à estrutura do XCTest para ativar o Asynchronous Testing para aplicativos iOS e macOS. Nesta postagem, veremos como podemos realizar testes assíncronos usando o XCWaiter.
Swift 3.1-Dev.
Novas classes adicionadas estão disponíveis no Xcode 8.3, que está atualmente disponível para o download se você tiver uma conta de desenvolvedor da Apple. Você pode obtê-lo na seção Downloads da conta do desenvolvedor. O Xcode 8.3 precisa do MacOS versão 10.12 e superior. Você pode baixar o arquivo XIP compactado que tem cerca de 4,52 GB. Se você já tem uma versão anterior do Xcode, remova-a ou poderá mantê-la, mas terá que alternar entre o Xcode DEVLOPER_DIR. Uma vez baixado, você pode extrair o arquivo para instalar o Xcode 8.3 beta e aguardar a instalação do Xcode e das ferramentas de linha de comando. Uma vez que o Xcode 8.3 esteja totalmente instalado com todas as ferramentas de linha de comando, podemos arrastá-lo para o caminho / Applications. Agora, temos que mudar para a nova versão do Xcode executando o seguinte comando.
Isso definirá o novo DEVELOPER_DIR e estamos prontos para usar o Xcode 8.3. Certifique-se de estar usando o toolchain correto usando o comando xcrun - find swift, que mostra a corrente de ferramentas atual que você está usando.
Agora, certifique-se de exportar o toolchain e usar a versão correta do Swift, que é o Apple Swift versão 3.1-dev no momento. Você pode facilmente fazer isso executando os seguintes comandos.
Isso garantirá que você esteja usando o Swift 3.1. Agora estamos prontos para testar os novos recursos do XCTest Framework.
Espera atual no teste XCUI.
O framework XCTest permite que os desenvolvedores gravem testes de unidade e UI para aplicativos iOS, macOS. A Apple introduziu o teste de interface do usuário do Xcode no WWDC 2015, que nos permite escrever testes de interface do usuário no Xcode. Como parte do lançamento do Xcode 8.3, a Apple adicionou algumas novas classes ao framework XCTest para suportar testes assíncronos. Isso significa que não há manipuladores envolvidos enquanto aguardam a exibição do XCUIElement. Anteriormente, tínhamos waitForExpectations (timeout: handler :) método combinado com XCTestExpectation para testar código assíncrono que se parece com isso:
Essa parte do código aguardará 3 segundos para encontrar o botão e ele falhará após 3 segundos se não encontrar elemento. Nós passamos de zero para o manipulador que invoca o erro quando o tempo limite é atingido. Esse teste de causa falha, assim como o erro gerado é muito genérico e nem sempre é útil durante a depuração. Felizmente, agora temos melhor controle sobre erros e manipuladores com o XCWaiter.
XCTestWaiter.
O XCTest Framework agora possui a classe XCTWaiter para aguardar o elemento. A lista das classes e subclasses adicionadas recentemente é a seguinte:
XCTWaiter: assume o controle da estratégia de espera. XCTNSPredicateExpectation: Expectativa legível ao escrever testes automatizados XCTKVOExpectativa: Expectativa legível ao gravar testes automatizados XCTDarwinNotificationExpectation: Outra expectativa legível para notificações.
A classe XCWaiter retorna resultados das expectativas na forma de booleano. Ele retorna uma enumeração de quatro possíveis situações que são pleted,.timedOut,.incorrectOrder ou. invertedFulFilment. Podemos simplesmente adicionar extensão ao XCUIElement ou adicionar uma função simples que retorna o resultado da função waiter que retorna um dos resultados do XCWaiter.
Não há bloco 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. Vamos passar rapidamente por cada um dos resultados booleanos retornados pelo XCTWaiterResult para entender o que está fazendo.
Isso retorna true quando expectativas definidas são preenchidas ou completadas. Ele retorna false quando as expectativas não são atendidas dentro do tempo limite especificado. Os testes provavelmente falharão quando as expectativas não forem atendidas.
Isso retornará verdadeiro quando as expectativas não forem atendidas no tempo limite. Podemos definir como falhar nosso caso de teste, fornecendo uma mensagem de erro útil para depuração.
Ordem Incorreta.
Isso nos diz quais são as expectativas que são bem sucedidas e quais ainda estão esperando para ter sucesso. Sabemos que o que está demorando para diagnosticar o problema.
Enchimento Invertido.
Não totalmente certo de como isso funciona, mas de acordo com os documentos. Se uma expectativa for configurada para ter comportamento invertido, o preenchimento terá um efeito similar que não atenderá a uma expectativa convencional.
Expectativas legíveis.
Existem algumas novas expectativas adicionadas ao XCTest Framework, que são XCTNSPredicateExpectation, XCTKVOExpectation e XCTDarwinNotificationExpectation. Acho que a ideia por trás disso é tornar as expectativas mais legíveis e personalizáveis. Anteriormente, temos que traçar as expectativas com os manipuladores. Agora podemos escrever expectativa assim:
Podemos então passar essa expectativa para o XCWaiter para obter um resultado booleano. Você pode encontrar alguns exemplos no repositório de demonstração aqui.
Qual é o benefício do XCWaiter.
Melhor estratégia de espera.
O XCWaiter nos fornece resultados booleanos de cada expectativa, o que nos permite definir nosso XCTest com melhor controle. Isso pode ajudar a lidar com a escassez dos testes. Os resultados do XCWaiter simplesmente retornam se o elemento apareceu ou não.
Capacidade de definir múltiplas expectativas.
Podemos definir mais de uma expectativa e esperar que o XCWaiter retorne o resultado para cada uma delas. Como mencionado acima, as expectativas podem ser escritas de maneira mais legível.
Lidando com o tempo limite & amp; Erro.
Anteriormente, o XCtest costumava falhar se as expectativas não fossem atendidas dentro do tempo limite especificado e o erro era muito genérico. Agora nós temos o resultado do TimerOut do XCWaiter para que possamos controlar a falha do teste com a mensagem de erro apropriada.
Reduzir a flacidez.
O XCWaiter nos dá mais controle sobre como queremos definir falhas nos testes. Isso reduzirá a quantidade de testes escamosos. Os resultados do XCWaiter também podem nos dar a capacidade de falhar ou passar nos testes com a mensagem de erro adequada.
Realce problemas de desempenho.
O XCWaiter nos dá a capacidade de definir múltiplas expectativas e cada expectativa tentou ser cumprida dentro do período de tempo limite. Há resultado do XCWaiter. incorrectO ORDER nos diz quantas expectativas foram atendidas e quantas ainda estão esperando para serem atendidas. Isso nos dá uma indicação de por que essas expectativas são lentas e podem ter alguns problemas de desempenho. Podemos diagnosticar a lentidão para tornar o teste e a aplicação mais rápidos.
GitHub Repo XCWaiter Demo.
Eu criei o repo Xcode83_Demo do GitHub com um aplicativo iOS de exemplo para dar ao XCWaiter uma experiência com os recursos do XCWaiter. Sinta-se à vontade para clonar e tentar.
Originalmente publicado no meu blog pessoal: XCBlog-Shashikant Jagtap.

Teste assíncrono.
O Teste Assíncrono ficou muito mais fácil com a introdução de expectativas e com a classe XCTestExpectation. Além do suporte de expectativa básica incluído, estão os métodos auxiliares para testar KVO, Notificações e Predicados. As expectativas são criadas pelos métodos auxiliares no XCTestCase.
Noções básicas de expectativas.
Esta é a expectativa básica, você chama fulfill () nela.
Você precisa esperar que as expectativas sejam atendidas por qualquer processo assíncrono que esteja testando. Como o nome indica, ele irá esperar por todas as expectativas que você criou dentro do teste. Eu normalmente só tenho um.
Expectativas complexas.
Eu escrevi o código de teste para um NSNotification uma vez - foi uma droga e foi uma perda de tempo. Existem alguns métodos de fábrica de expectativas construídos, desde que cubram alguns casos complicados que você definitivamente deveria pensar em usar primeiro, não apenas tornando o teste mais enxuto, como também está escrito para você.
Expectativas da KVO.
Se o teste de conformidade com o KVO definitivamente usar uma expectativa de KVO. Mesmo que não esteja testando explicitamente o KVO, considere se o seu teste está interagindo com um objeto compatível com KVO. expectedValue pode ser nulo para esperar que o valor seja alterado para qualquer outro valor. Expectativas com manipuladores opcionais se cumprirão se não forem fornecidas. Se você usar seu próprio manipulador, retorne true para atender à expectativa.
Expectativas de notificação.
Espere uma NSNotification em uma linha. Se você não especificar um manipulador, ele será atendido pela primeira notificação correspondente do objeto especificado, caso contrário, o manipulador deverá retornar como verdadeiro para atender à expectativa.
Expectativas predicadas.
Durante o teste, o NSPredicate será avaliado periodicamente. Uma vez que é verdade, a expectativa será satisfeita, a menos que você especifique um manipulador, caso em que seu manipulador deve retornar true também.
É isso para as expectativas padrão. Eu gostaria que houvesse um auxiliar de expectativa de delegado na biblioteca padrão, ele 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.

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 setUp e tearDown da instância 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 para o XCTest no tempo.
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 permite 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, ele 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. Essa 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 "scalar" 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.

Комментарии