artigo
pipeline de deploy, testes automatizados e Update Sets: como entregar sem rezar
ATF, gates de promoção entre ambientes e as boas práticas de Update Set que separam um deploy tranquilo de um incidente às 23h de sexta.
Todo consultor ServiceNow com alguns anos de estrada já viveu os dois lados dessa história. Do lado bom: um deploy em produção que passa batido, ninguém liga para o help desk, e às 17h você já esqueceu que aconteceu. Do lado ruim: um Update Set com nome "atualização final v2" que alguém importa direto em produção numa sexta, e às 23h você está no celular tentando entender o que quebrou e como desfazer.
#o motivo de isso não ser burocracia
É tentador tratar pipeline e testes como papelada que atrasa a entrega. Só que a alternativa não é "entregar mais rápido" — é descobrir o problema depois, com o usuário como sensor de qualidade. Numa plataforma onde uma Business Rule mal escrita pode travar formulário de centenas de pessoas ao mesmo tempo, o custo de pular uma etapa de validação não é abstrato.
#ATF: testes que moram na plataforma, não ao lado dela
O Automated Test Framework é o mecanismo nativo de teste do ServiceNow. A vantagem competitiva dele sobre uma suíte de testes externa é estrutural: um teste ATF é um registro, então ele viaja dentro do próprio Update Set (ou do commit, se você usa Source Control) junto com o código que testa. Não existe risco de "o teste ficou para trás" porque alguém esqueceu de sincronizar um repositório separado.
Na prática, um teste ATF é montado visualmente por steps — criar registro, definir campo, impersonar usuário, e no final comparar o resultado esperado com o real:
Suite: "Gestão de Incidentes — Regressão"
Passo 1 — Impersonate User: itsm.analyst@test.acme.com
(nunca rode teste funcional como admin — admin ignora ACL e mascara bug de permissão)
Passo 2 — Create Record: incident
short_description: "ATF Test — não acionar"
impact: 2 | urgency: 2
Passo 3 — Assert Field Value: priority == 3
Passo 4 — Update Record: impact: 1
Passo 5 — Assert Field Value: priority == 2 (recalculado pela regra de negócio)
Passo 6 (teardown) — Delete: registros criados por este testeUma ressalva importante que vale a pena checar antes de bater o martelo: a própria documentação da ServiceNow recomenda o ATF para teste funcional, de regressão e de UI — não como ferramenta de unit test no sentido estrito (testar um método isolado de um Script Include, sem tocar em banco ou tela). Dá para usar o step "Run Server Script" para rodar gs.assertTrue() contra um método específico, e isso é útil como smoke test rápido de lógica — mas se você está pensando em unit test disciplinado ao estilo Jest/JUnit, ATF não foi desenhado para isso, e forçar a barra aí tende a produzir suítes lentas e difíceis de manter. Use ATF para o que ele faz bem: simular o comportamento real de ponta a ponta.
#o pipeline: portões entre você e o desastre
Um pipeline decente tem pelo menos quatro paradas, cada uma com um critério de saída que não é opinião — é sim/não:
| etapa | o que acontece | critério de saída |
|---|---|---|
| dev | implementação + testes unitários de lógica + revisão de código | revisão aprovada, testes locais verdes |
| qa | import do Update Set + suíte de regressão ATF completa | 100% da regressão verde, zero conflito no preview |
| uat | dados representativos de produção + validação pelo negócio | critérios de aceite aprovados formalmente |
| prod | import + smoke test imediato + change aprovada | smoke test verde, ninguém abrindo incidente na primeira meia hora |
#Update Sets: fácil de usar, fácil de usar mal
Update Set é provavelmente o recurso do ServiceNow com a curva de aprendizado mais enganosa — dá para clicar "Complete" em cinco minutos, e é exatamente por isso que a maioria dos incidentes de deploy nasce ali:
| prática | o que fazer | o que acontece quando você não faz |
|---|---|---|
| nomenclatura | [escopo]-[tipo]-[descrição]-[ano-mês], ex. ITSM-FEAT-AprovacaoMultinivel-2026-07 | Update Sets chamados "Default" ou "teste" são impossíveis de auditar depois |
| tamanho | um Update Set = uma entrega coesa (não existe limite oficial de artefatos — o critério é escopo, não contagem) | com centenas de artefatos misturados, o preview de importação vira um labirinto e rollback seletivo fica inviável |
| dependências | descrever no campo Description o que precisa estar importado antes | importar fora de ordem quebra referência entre artefatos silenciosamente |
| plano de rollback | escrito antes do deploy, não inventado depois do incidente | improviso sob pressão, com gestor cobrando resposta em tempo real |
Repare que nenhuma dessas quatro linhas exige ferramenta nova ou permissão especial — é inteiramente disciplina de processo. É também por isso que costuma ser a primeira coisa a ceder quando o prazo aperta, e a primeira coisa que devia ser inegociável.
#Update Set ou Source Control?
Para aplicações com escopo (Scoped Applications), o ServiceNow também oferece integração com repositório Git externo — histórico de commits, branches e Pull Request antes de integrar, a mesma disciplina que qualquer time de software já usa fora da plataforma. Vale uma distinção que costuma confundir: isso é diferente do App Repository, que é o mecanismo nativo do próprio ServiceNow para publicar e instalar versões de um app com escopo entre instâncias (sem depender de Git nenhum). São dois caminhos possíveis para o mesmo problema — mover artefatos entre ambientes — e não a mesma coisa com nome diferente.
#e agora?
- Pegue uma Business Rule ou Script Include que você já mantém e escreva um teste ATF de regressão para o fluxo mais crítico dele — nem que seja só criar registro, mudar um campo e conferir o resultado. É o tipo de coisa que só parece trabalho extra até o dia em que evita um regression bug silencioso.
- Da próxima vez que fechar um Update Set, escreva o plano de rollback no campo Description antes de mandar para QA, não depois que alguém perguntar "e se der errado?".
- Se você já leu sobre Flow Designer ou Business Rules, este capítulo fecha o ciclo: não adianta arquitetura elegante se o caminho até produção for no improviso.