Como executar e depurar testes de unidade para um aplicativo do iPhone

NOTA: Atualmente, o teste de unidade é muito mais fácil de configurar. Este tutorial não é realmente relevante para o Xcode versão 5 e posterior.

Demorei algum tempo, mas finalmente consegui fazê-lo funcionar no meu projeto. Para criar os testes "lógicos", seguiDiretrizes da Apple sobre a criação de testes lógicos. Isso funciona bem quando você entende que os testes lógicos são executados durante a compilação.

Para poder depurar esses testes, é necessário criar um executável personalizado que os chamará. O artigo deSean Miceli no blog Grokking Cocoa fornece todas as informações para fazer isso. Segui-lo, no entanto, não produziu sucesso imediato e precisou de alguns ajustes.

Vou abordar as principais etapas apresentadas no tutorial de Sean, fornecendo alguns tópicos "para manequins", que levaram algum tempo para descobrir:

Configure um destino que contenha os testes de unidade, mas NÃO os executeConfigure o executável otest para executar os testesConfigure as variáveis de ambiente otest para que otest possa encontrar seus testes de unidade

O seguinte foi realizado comXCode 3.2.5

Nota para o XCode 4

No XCode 4, é possível depurar seus testes de unidade DIRETAMENTE. Basta escrever seu teste, adicioná-lo ao seu destino como um dos testes e definir um ponto de interrupção nele. Isso é tudo. Mais virá.

Etapa 1 - Configurando o alvoDuplique o destino dos testes de unidade localizado nos alvos do seu projeto. Isso também criará uma duplicata do seu produto de testes de unidade (arquivo .octest). Na figura abaixo, "LogicTest" é o destino original.Renomeie o destino dos testes de unidade e o produto de testes de unidade (arquivo .octest) com o mesmo nome. Na figura abaixo, "LogicTestsDebug" é o destino duplicado.Exclua a fase RunScript do novo destino

O nome de ambos pode ser qualquer coisa, mas eu evitaria espaços.

Etapa 2 - Configurando otest

O ponto mais importante aqui é obter o otest correto, ou seja, o do iOS atual e não a versão padrão do Mac. Isso está bem descrito no tutorial de Sean. Aqui estão mais alguns detalhes que me ajudaram a acertar as coisas:

Vá em Projeto-> Novo Executável Personalizado. Isso abrirá uma janela solicitando que você digite um Nome de Executável e um Caminho de Executável.Digite o que desejar para o nome.Copie e cole o caminho para o seu executável otest do iOS. No meu caso, era /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.2.sdk/Developer/usr/bin/otestPressione Enter. Isso o levará à página de configuração do seu executável.A única coisa a mudar neste momento é selecionar "Tipo de caminho: relativo ao SDK atual". Não digite o caminho, isso foi feito na etapa 3.Etapa 3 - Configurando os melhores argumentos e variáveis de ambiente

A maioria dos argumentos é simples de configurar ... Mas este provou ser o meu maior problema. Inicialmente, eu havia chamado meu destino de teste lógico "LogicTests Debug". Com esse nome e "LogicTests Debug.octest" (entre aspas) como argumento para otest, eu continuava tendo otest terminando com o código de saída 1 e NUNCA parando no meu código ...

A solução: sem espaço no nome do seu destino!

Os argumentos para otest são:

-SenTest Self (ou All ou um nome de teste - digite man otest no terminal para obter a lista){LogicTestsDebug} .octest - Onde {LogicTestsDebug} precisa ser substituído pelo seu nome do pacote de teste lógico.

Aqui está a lista de variáveis de ambiente para copiar / colar:

DYLD_ROOT_PATH: $ SDKROOTDYLD_FRAMEWORK_PATH: "$ {BUILD_PRODUCTS_DIR}: $ {SDK_ROOT}: $ {DYLD_FRAMEWORK_PATH}"IPHONE_SIMULATOR_ROOT: $ SDKROOTCFFIXED_USER_HOME: "$ {HOME} / Biblioteca / Suporte a aplicativos / Simulador de iPhone / Usuário"DYLD_LIBRARY_PATH: $ {BUILD_PRODUCTS_DIR}: $ {DYLD_LIBRARY_PATH}DYLD_NEW_LOCAL_SHARED_REGIONS: SIMDYLD_NO_FIX_PREBINDING: SIM

Observe que eu também experimentei o DYLD_FORCE_FLAT_NAMESPACE, mas isso simplesmente causou um acidente.

Etapa 4 - Executando seu executável otest

Para executar seu otest executável e começar a depurar seus testes, você precisa:

Defina seu destino ativo para o seu destino de teste de unidade (LogicTestsDebug no meu caso)Defina o executável ativo como o executável otest

Você pode criar e executar seu executável e depurar seus testes com pontos de interrupção.

Como uma observação lateral, se você estiver tendo problemas para executar o executável otest, isso pode estar relacionado a:

Caminho defeituoso. Inicialmente, tive muitos problemas porque estava apontando para o mac otest. Eu continuei travando no lançamento com o código de rescisão 6.Argumentos defeituosos. Até remover o espaço do nome do pacote (.octest), eu continuava tendo a falha mais comum com o código de saída 1.Caminho incorreto nas variáveis de ambiente. O tutorial de Sean tem muitas perguntas de acompanhamento, dando algumas dicas sobre o que as outras pessoas tentaram. O conjunto que tenho agora parece funcionar, então sugiro que você comece com isso.

Você pode receber alguma mensagem no console que pode levar você a pensar que algo está errado com suas variáveis de ambiente. Você pode perceber uma mensagem sobre as CFPreferences. Esta mensagem não está impedindo que os testes sejam executados corretamente; portanto, não se concentre nela se você tiver problemas para executar o melhor possível.

Por último, quando tudo estiver funcionando, você poderá parar nos pontos de interrupção de seus testes.

Uma última coisa...

Li em muitos blogs que a principal limitação do XCode SenTestKit integrado é que os testes não podem ser executados durante a criação do aplicativo. Bem, como se vê, isso é realmente fácil de gerenciar. Você só precisa adicionar seu pacote de testes lógicos como uma dependência ao seu projeto de aplicativo. Isso garantirá que o pacote de testes lógicos seja criado, ou seja, todos os testes sejam executados antes da criação do aplicativo.

Para fazer isso, você pode arrastar e soltar seu pacote de teste lógico no destino do aplicativo.

questionAnswers(2)

yourAnswerToTheQuestion