Testes e qualidade de código

Guia completo dos planos de teste(Test Plan) do Xcode: execução por configuração

Planos de teste gerenciam, em arquivos .xctestplan, os testes a executar e suas condições. Este artigo resume por que a configuração do scheme não basta, seleção de alvos, configurações, cobertura, ordem, repetição e integração com xcodebuild.

9 min de leitura
Imagem de capa de Guia completo dos planos de teste(Test Plan) do Xcode: execução por configuração

Depois de acumular uma boa quantidade de código de teste, surge a dúvida: “Com que combinação devo executar estes testes?”

Executar tudo leva 20 minutos no CI(Continuous Integration, integração contínua). Executar só uma parte exige alternar opções manualmente.

Também pode ser difícil encontrar uma forma adequada de executar testes de UI em ambientes coreano e inglês.

Em resumo, a Apple criou o plano de teste(Test Plan) para resolver exatamente esse problema.

Planos de teste apresentados no Xcode 11separa em arquivo os “testes a executar” das “condições de execução”.

Hoje vamos resumir estrutura, configuração prática e integração com CI de uma vez.

Se escrever código de teste ainda é novidade, comece porComo escrever seu primeiro teste com os fundamentos de XCTest e Given-When-Then.

O que é um plano de teste

Um plano de teste é um arquivo com extensão.xctestplan. Seu conteúdo é JSON legível e, depois de adicionado ao projeto, é referenciado pelo scheme(Scheme).

Um arquivo contém duas coisas.

O importante é ser um arquivo. .xctestplanpode ser commitado no Git, permitindo compartilhar condições e revisar alterações de configuração.

Em equipe, é mais seguro versionar o plano junto com o scheme compartilhado que o referencia.

Por que configurar apenas o scheme não basta

Antes dos planos de teste, todas as condições ficavam na ação Test do scheme. Essa estrutura tem limitações.

Um scheme tem apenas uma configuração da ação Test. Para separar uma validação rápida de uma completa noturna, era preciso duplicá-lo.

A duplicação também copia configurações de build, execução e perfil. Você copia tudo para alterar uma condição de teste.

O plano de teste inverte essa relação. É possível associarvários planos a um scheme, e cada plano pode ter várias configurações.

Diagrama da hierarquia entre scheme e configurações de teste do Xcode, com ramificações Smoke, Regression e Nightly
Você pode ampliar as combinações de execução sem reescrever os testes

Criando um plano de teste

Com base emOrientação atual da Apple, o Xcode cria um plano padrão com todos os testes dos alvos de teste compilados pelo scheme.

  1. Abra e salve o plano padrão em Product > Scheme > Edit Test Plan
  2. Na aba Tests, escolha alvos por tags, suites e funções
  3. Na aba Configurations, adicione configurações compartilhadas e necessárias

Para criar mais planos, use Product > Test Plan > New Test Plan. Em schemes antigos, pode aparecerConvert to use Test Plans; isso éFluxo de conversão de configurações existentes apresentado no Xcode 11.

Se houver vários planos, escolha um como padrão(Default) em Product > Test Plan > Manage Test Plans. Ele será usado quando nenhum outro for especificado.

Ative o plano em Product > Test Plan. Ao executar Command + U, ou seja, Product > Test, o plano ativo roda uma vez por configuração. Diferencie o plano padrão do ativo.

Relação entre configurações compartilhadas e individuais

O editor do plano tem as abas Tests e Configurations. O ponto central é Configurations.

Essa aba tem duas camadas.

  • Shared Settings(configurações compartilhadas): valores padrão herdados por todas as configurações
  • Configuração individual: variação que sobrescreve apenas os itens necessários

É parecido com a herança do CSS: escreva as condições comuns uma vez e defina só as diferenças por configuração.

Itens sobrescritos aparecem em negrito no editor, deixando claro o que é diferente.

Há muitas opções, mas as mais usadas são estas.

Item O que define
Arguments / Environment Variables Argumentos de execução e variáveis de ambiente
Application Language / Region Idioma e região em que o app será executado
Code Coverage Se haverá coleta de cobertura e quais alvos serão cobertos
Execution Order Executar em ordem alfabética ou embaralhar a cada execução
Test Repetition Mode Forma de repetir os testes
Test Timeouts Tempo máximo permitido para cada teste
Runtime Sanitization Address·Thread·Undefined Behavior Sanitizer
Memory Management Malloc Scribble, Malloc Guard Edges, Zombie Objects
Automatic Screen Capture Se uma captura de tela será anexada automaticamente em caso de falha

O comum fica no compartilhado; as diferenças, na configuração. Assim o plano continua administrável mesmo crescendo.

Exemplo prático de divisão de configurações

O caso mais comum é separar por idioma. Em apps multilíngues, o layout frequentemente quebra conforme o idioma; configurações separadas repetem automaticamente o mesmo teste de UI.

  • Configuração compartilhada: ativar cobertura e salvar capturas em caso de falha
  • Configuração A “Korean”: Application Language em coreano
  • Configuração B “English”: Application Language em inglês
  • Configuração C “RTL Pseudolanguage”: validação de idiomas escritos da direita para a esquerda

Ao executar este plano uma vez, O teste selecionado é executado uma vez em cada configuração, e o relatório também separa os resultados por configuração. Fica claro em qual idioma ocorreu a falha.

O mesmo vale para a verificação de memória. Segundo a documentação da Apple, o Address Sanitizer pode usar 2 a 3 vezes mais memória e deixar o código 2 a 5 vezes mais lento, é preciso considerar o custo de execução.

Deixe os sanitizers desligados na configuração normal e crie configurações de diagnóstico separadas. Separe Address Sanitizer e Thread Sanitizer e execute-os no build noturno.

Cobertura, ordem aleatória e repetição

Vamos destacar três opções especialmente úteis nas configurações.

A cobertura de códigonão é só ativar: primeiro defina o que medir. Misturar bibliotecas dependentes no mesmo número pode dificultar a leitura das mudanças no código do app.

Escolha “some targets” para indicar apenas os alvos do seu app e obter uma métrica relevante.

EmExecution Order, escolha Alphabetical ou Random. Não generalize que Alphabetical seja o padrão de todos os testes.

No plano do XCTest, escolher Random embaralha a ordem a cada execução. JáO Swift Testing executa funções de teste em paralelo por padrão e também randomiza a ordem. É preciso distinguir o comportamento dos dois frameworks.

Se mudar a ordem causa falha, provavelmente há dependência do estado deixado pelo teste anterior. É um sinal útil de acoplamento oculto entre testes. Essa independência também é central emO princípio FIRST de bons testes unitários.

Test RepetitionéOpção adicionada no Xcode 13e permite escolher estas formas de repetição.

Modo Comportamento Uso
Up Until Maximum Repetitions Repetir até o máximo definido, independentemente do resultado Medir a taxa de reprodução de falhas intermitentes
Repetir até falhar(-run-tests-until-failure) Repetir até ocorrer uma falha Rastrear testes que falham ocasionalmente
Retry on Failure Em caso de falha, tentar novamente até o número definido Proteger a taxa de aprovação no CI de testes de UI instáveis

SegundoNotas da versão do Xcode 13,Maximum Test Repetitionsdeve receber um inteiro positivo. A documentação oficial não confirma “padrão de 3 vezes”; confira diretamente o valor salvo no plano.

Na linha de comando,-test-iterationsdefine a quantidade. Você pode combinar com-run-tests-until-failureou-retry-tests-on-failure. Essa configuração tem prioridade sobre a do plano.

Retry on Failure é conveniente, mas use com cuidado. Passar por uma nova tentativa mantém um teste instável no projeto.

Use temporariamente e investigue separadamente a causa da instabilidade.

Ilustração de pipeline de testes com o texto CI PIPELINE, dividido entre pull request, merge e build noturno
Leve no PR, pesado à noite: dividir planos permite isso

Usando planos de teste no CI

Planos de teste também funcionam na linha de comando. Primeiro, confirme o plano ligado ao scheme comxcodebuild -scheme MyApp -showTestPlans. Em-testPlan, passe o nome do plano, não o caminho do arquivo.

xcodebuild test \
  -project MyApp.xcodeproj \
  -scheme MyApp \
  -testPlan Smoke \
  -destination 'platform=iOS Simulator,name=iPhone 16'

Mantenha o mesmo scheme e altere apenas o nome do plano para dividir o escopo dos jobs de CI. Por exemplo:

  • A cada PR(Pull Request): -testPlan Smoke — foco nos testes unitários essenciais
  • Merge na branch principal: -testPlan Regression — todos os testes unitários e de UI
  • Agendamento noturno: -testPlan Nightly — inclui sanitizers e configurações multilíngues

Também é possível dividir ainda mais por configuração.

Como emExemplo atual de linha de comando da Apple,--only-test-configurationexecuta apenas as configurações indicadas. Já--skip-test-configurationexecuta tudo, exceto as indicadas. As duas opções usam dois hífens.

Se o plano tiver cinco configurações de idioma, o CI pode criar cinco jobs e atribuir uma configuração a cada um. Porém, essa distribuição paralela é responsabilidade do CI; o plano não divide máquinas nem reduz o tempo automaticamente.

xcodebuild test \
  -scheme MyApp \
  -testPlan Localization \
  --only-test-configuration Korean \
  -destination 'platform=iOS Simulator,name=iPhone 16'

Perguntas frequentes

P. O arquivo do plano de teste deve ir para o Git?

R. Para compartilhar as mesmas condições na equipe, é melhor fazer commit. Mas enviar ao Git não é requisito do Xcode. Gerencie juntos o plano e o scheme compartilhado que o referencia.

Como é JSON, editar simultaneamente gera conflitos. Separar arquivos por finalidade reduz sua frequência.

P. Criar várias configurações não dobra o tempo?

R. Sim. Os testes são repetidos conforme o número de configurações.

Por isso, configurações pesadas, como multilíngue e sanitizers, devem sair do plano normal e ir para o plano noturno.

P. Posso colocar testes unitários e de UI no mesmo plano?

R. Pode. Mas testes unitários levam segundos e testes de UI, minutos; a velocidade do feedback é bem diferente.

Separá-los em planos rápido e lento combina melhor com o fluxo de desenvolvimento.

P. Testes feitos com Swift Testing entram no plano?

R. Sim. Se o alvo selecionado tiver testes XCTest e Swift Testing, ambos podem rodar no mesmo plano. Conhecer tambémTags e execução paralela do Swift Testingfacilita dividir os planos.

P. E se eu quiser excluir apenas alguns testes?

R. Na aba Tests, desmarque alvos, suites, funções ou casos parametrizados individuais.No Xcode 16 ou posterior, também é possível escolher o escopo com Include Tags e Exclude Tags do Swift Testing.

Isso fica apenas no arquivo do plano, sem alterar o código; os outros planos continuam executando os testes.


O plano de teste não é uma ferramenta para criar testes. Ele define quais testes existentes executar e sob quais condições.

Se você dividia condições duplicando schemes, salve o plano padrão e organize planos por finalidade. No CI, explicitar plano e configuração por job esclarece o escopo, mas a redução real depende do número de runners e do paralelismo.

Primeiro salve o plano padrão em Product > Scheme > Edit Test Plan e crie um plano Smoke. Depois, adicionar configurações será bem mais fácil.


Fontes e critérios de verificação

A data de referência é 16 de agosto de 2026. Os nomes de menus e a sintaxe de linha de comando seguem a documentação oficial atual da Apple; não afirmamos quantidade padrão de repetições nem redução de tempo no CI sem confirmação documental.