Capa do Ebook gratuito Postman na Prática: Testes de API, Coleções, Ambientes e Automação de Rotinas de QA

Postman na Prática: Testes de API, Coleções, Ambientes e Automação de Rotinas de QA

Novo curso

18 páginas

Organização de Collections para suites de testes reutilizáveis

Capítulo 5

Tempo estimado de leitura: 15 minutos

Audio Icon

Ouça em áudio

0:00 / 0:00

O que significa organizar Collections como suites de testes reutilizáveis

No Postman, uma Collection pode ser mais do que um “grupo de requisições”: ela pode representar uma suite de testes reutilizável, composta por fluxos, pré-requisitos, dados parametrizados e verificações automatizadas. Organizar Collections com esse objetivo significa estruturar pastas, nomes, variáveis, scripts e dependências de forma que você consiga: executar o mesmo conjunto de testes em diferentes ambientes, reaproveitar componentes (como validações e pré-requisições), reduzir duplicação e manter a manutenção simples quando a API evolui.

Uma suite reutilizável costuma ter três características: padronização (mesma forma de nomear e estruturar), parametrização (mesmos testes rodando com dados/ambientes diferentes) e modularidade (partes pequenas que podem ser combinadas). Em vez de criar uma Collection enorme e “monolítica”, a ideia é ter uma arquitetura de Collections e pastas que reflita o uso real em QA: smoke, regressão, contratos, fluxos críticos, e cenários por domínio.

Princípios de organização: modularidade, clareza e baixo acoplamento

Modularidade por domínio e por objetivo de teste

Um erro comum é organizar apenas por endpoints. Para suites reutilizáveis, é mais eficiente combinar duas dimensões: domínio (ex.: Users, Orders, Payments) e objetivo (ex.: Smoke, Regression, Contract). Isso evita que uma execução de smoke tenha que “garimpar” requests em meio a centenas de casos de regressão.

Uma abordagem prática é: uma Collection por domínio (ou por serviço) e, dentro dela, pastas por objetivo. Outra é: uma Collection por objetivo (Smoke Suite, Regression Suite) e, dentro, pastas por domínio. A escolha depende do tamanho do sistema e de como o time executa testes. Se o time roda smoke em vários serviços, “Collection por objetivo” costuma facilitar. Se o time mantém ownership por serviço, “Collection por domínio” tende a ser mais natural.

Baixo acoplamento: evitar dependências invisíveis

Suites reutilizáveis falham quando dependem de estado implícito: “essa request só funciona se você rodou aquela antes”. Para reduzir isso, explicite pré-condições e outputs. Em Postman, isso significa: usar scripts para salvar dados necessários em variáveis, documentar dependências no nome/pasta, e criar requests de setup/teardown quando aplicável.

Continue em nosso aplicativo

Você poderá ouvir o audiobook com a tela desligada, ganhar gratuitamente o certificado deste curso e ainda ter acesso a outros 5.000 cursos online gratuitos.

ou continue lendo abaixo...
Download App

Baixar o aplicativo

Exemplo de dependência explícita: uma pasta “Setup - Criar dados base” que cria entidades necessárias e salva IDs. A pasta de testes usa esses IDs, mas não assume que eles existem “por mágica”.

Padronização de nomes e tags para execução seletiva

Uma suite reutilizável precisa ser filtrável. Mesmo sem entrar em detalhes de ferramentas externas, no próprio Postman você ganha muito com nomes consistentes e tags no início do nome. Sugestões de padrões:

  • Prefixos por tipo: [SMOKE], [REG], [CONTRACT], [NEG] (negativo), [SEC] (segurança), [PERF] (sanidade de performance).
  • Formato de request: [SMOKE] Users - Get by id
  • Formato de pasta: 01 - Setup, 02 - Smoke, 03 - Regression, 99 - Teardown

Os números no início ajudam a manter ordem de execução e leitura, especialmente quando a suite depende de setup e teardown.

Arquitetura recomendada de pastas dentro de uma Collection

A seguir, um modelo de estrutura que funciona bem para suites reutilizáveis e escaláveis. Ajuste os nomes ao seu contexto, mas mantenha a intenção:

  • 00 - Docs: exemplos de payload, regras de negócio, links internos, observações de uso.
  • 01 - Setup: criação de dados mínimos, preparação de estado, captura de tokens/ids necessários para os testes (sem repetir conceitos de autenticação; aqui o foco é apenas “preparar variáveis e dados”).
  • 02 - Smoke: poucos testes, rápidos, cobrindo caminhos críticos.
  • 03 - Contract: validações de schema, campos obrigatórios, tipos e regras de contrato.
  • 04 - Regression: cenários mais completos, incluindo variações e casos negativos.
  • 05 - Utilities: requests utilitárias (healthcheck, reset de dados, endpoints de apoio), e também “requests template” para duplicar.
  • 99 - Teardown: limpeza de dados criados no setup, quando aplicável.

Mesmo que você não use teardown sempre, reservar o espaço ajuda a manter disciplina. Em APIs onde não é possível apagar dados, o teardown pode virar “marcação” ou “encerramento de contexto” (por exemplo, desativar um recurso criado).

Variáveis e parametrização para reutilização entre ambientes e cenários

Camadas de variáveis: Collection vs Environment vs Local

Para reutilização, você precisa decidir onde cada variável vive. Uma regra prática:

  • Environment variables: tudo que muda por ambiente (base URL, IDs fixos de referência, flags de feature, credenciais de teste quando aplicável).
  • Collection variables: valores padrão e “contratos” internos da suite (nomes de campos, caminhos, limites, valores default), além de variáveis temporárias que fazem sentido apenas dentro daquela Collection.
  • Local variables (em scripts): valores efêmeros usados dentro de uma request específica, para evitar poluir o escopo global.

O objetivo é: trocar de ambiente sem editar requests. Se você percebe que está alterando URL, headers ou parâmetros manualmente ao mudar de ambiente, a suite não está realmente reutilizável.

Convenção de nomes de variáveis

Padronize nomes para facilitar manutenção e evitar colisões. Exemplos:

  • baseUrl (ambiente)
  • featureFlag_newCheckout (ambiente)
  • test_userId, test_orderId (collection)
  • setup_createdIds (collection, como JSON string)

Evite nomes genéricos como id ou token em escopos amplos. Prefira nomes com contexto: users_userId, orders_orderId.

Reaproveitamento de scripts: “biblioteca” de asserts e helpers

Para não duplicar validações em dezenas de requests, crie uma pequena biblioteca de funções em uma variável de Collection e carregue-a nos scripts. Isso permite padronizar asserts e reduzir divergências entre requests.

Passo a passo: criar uma biblioteca simples de helpers

1) Crie uma variável de Collection chamada helpers contendo código JavaScript como string. Exemplo:

// Cole este conteúdo na variável de Collection: helpers
(function () {
  const helpers = {};

  helpers.expectStatus = function (expected) {
    pm.test('Status code is ' + expected, function () {
      pm.response.to.have.status(expected);
    });
  };

  helpers.expectJson = function () {
    pm.test('Response is JSON', function () {
      pm.response.to.be.json;
    });
  };

  helpers.expectHasKeys = function (obj, keys) {
    pm.test('Object has expected keys', function () {
      keys.forEach(k => pm.expect(obj).to.have.property(k));
    });
  };

  return helpers;
})();

2) Em cada request, no script de Tests, “carregue” os helpers com eval e use as funções. Exemplo:

const helpers = eval(pm.collectionVariables.get('helpers'));
helpers.expectStatus(200);
helpers.expectJson();

const body = pm.response.json();
helpers.expectHasKeys(body, ['id', 'name']);

3) Quando você precisar mudar um padrão (por exemplo, como validar status ou estrutura), edite apenas a variável helpers, e todas as requests passam a usar a mesma regra.

Observação prática: use essa técnica com parcimônia e mantenha o código pequeno e bem nomeado. O ganho é grande em suites com muitas requests, especialmente em regressão.

Separação entre requests “template” e requests “executáveis”

Para reutilização, é útil ter requests modelo (templates) que servem como base para novos testes, sem necessariamente entrar na execução padrão. Você pode criar uma pasta 05 - Utilities com subpasta Templates, contendo:

  • Template de GET com asserts básicos
  • Template de POST com captura de ID e validações
  • Template de testes negativos (validação de erro)

Esses templates aceleram a criação de novos casos e mantêm consistência. Para evitar que sejam executados por engano, use prefixo no nome, por exemplo: [TEMPLATE] POST - Create resource.

Design de suites: Smoke, Contract e Regression sem duplicar trabalho

Smoke: poucos testes, alto valor

Smoke deve ser pequeno e confiável. Em organização de Collections, isso significa: uma pasta com poucas requests, cada uma com asserts essenciais e baixa dependência de dados. Se o smoke depende de muitos dados, ele vira regressão e perde o propósito.

Uma prática útil é: smoke usar dados criados no próprio setup da pasta (ou dados fixos do ambiente), e não depender de execução de regressão anterior.

Contract: validação de forma, não de regra de negócio

Testes de contrato focam em garantir que a API continua respondendo com a estrutura esperada (campos, tipos, obrigatoriedade). Para reutilização, padronize asserts de schema e mantenha-os separados de regras de negócio. Assim, quando uma regra muda, você não quebra o contrato; e quando o contrato muda, você sabe exatamente onde ajustar.

Uma forma prática é criar uma pasta Contract com requests que chamam endpoints e validam apenas: status, tipo de resposta, presença de campos e tipos básicos. Evite asserts muito específicos de valores, a menos que sejam invariantes.

Regression: variações e negativos organizados por cenários

Regressão cresce rápido. Para manter reutilizável, organize por subpastas de cenário, não apenas por endpoint. Exemplo:

  • Regression
    • Users - Validations
    • Users - Pagination and filters
    • Orders - State transitions
    • Orders - Negative cases

Isso facilita rodar um subconjunto quando um domínio específico muda, e também facilita manutenção por squads.

Passo a passo: montar uma Collection reutilizável do zero (modelo prático)

1) Criar a Collection e definir o padrão de pastas

Crie uma nova Collection com nome que indique objetivo e escopo, por exemplo: API - Test Suite. Em seguida, crie as pastas: 00 - Docs, 01 - Setup, 02 - Smoke, 03 - Contract, 04 - Regression, 05 - Utilities, 99 - Teardown.

2) Definir variáveis essenciais na Collection

Crie variáveis de Collection para itens comuns, por exemplo:

  • defaultTimeoutMs (se você usa em scripts)
  • helpers (biblioteca de asserts)
  • testData (um JSON string com dados padrão de criação)

Exemplo de testData como JSON string:

{
  "user": {"name": "User QA", "email": "qa+{{timestamp}}@example.com"},
  "order": {"notes": "order created by postman suite"}
}

Repare no uso de {{timestamp}}: você pode gerar e salvar um timestamp no setup para evitar colisão de dados.

3) Criar o Setup com geração de dados e captura de variáveis

Dentro de 01 - Setup, crie uma request “Setup - Init” que não precisa chamar endpoint necessariamente; ela pode apenas preparar variáveis. No Pre-request Script, gere um timestamp e salve em variável:

const ts = Date.now().toString();
pm.collectionVariables.set('timestamp', ts);

// Exemplo: guardar uma lista de IDs criados para teardown
pm.collectionVariables.set('setup_createdIds', JSON.stringify({ users: [], orders: [] }));

Depois, crie requests de setup que criem dados mínimos (por exemplo, criar um usuário de teste) e salvem o ID. No Tests:

const helpers = eval(pm.collectionVariables.get('helpers'));
helpers.expectStatus(201);

const body = pm.response.json();
pm.collectionVariables.set('users_userId', body.id);

const created = JSON.parse(pm.collectionVariables.get('setup_createdIds'));
created.users.push(body.id);
pm.collectionVariables.set('setup_createdIds', JSON.stringify(created));

Com isso, qualquer request posterior pode usar {{users_userId}} sem depender de valores hardcoded.

4) Construir a pasta Smoke com asserts mínimos e robustos

Crie 3 a 8 requests no máximo (ajuste conforme o sistema). Cada uma deve validar status e alguns campos essenciais. Evite asserts frágeis como “o nome é exatamente X”, a menos que seja um dado controlado pelo setup.

Exemplo de Tests para um GET por ID:

const helpers = eval(pm.collectionVariables.get('helpers'));
helpers.expectStatus(200);
helpers.expectJson();

const body = pm.response.json();
helpers.expectHasKeys(body, ['id', 'name', 'email']);

pm.test('id matches setup userId', function () {
  pm.expect(body.id).to.eql(pm.collectionVariables.get('users_userId'));
});

5) Construir Contract com validações padronizadas

Para cada endpoint crítico, crie uma request na pasta Contract. Padronize o que é “contrato” para o time: por exemplo, sempre validar que campos obrigatórios existem e que tipos são coerentes.

Exemplo simples de validação de tipos:

const helpers = eval(pm.collectionVariables.get('helpers'));
helpers.expectStatus(200);

const body = pm.response.json();

pm.test('Contract: types', function () {
  pm.expect(body.id).to.be.a('string');
  pm.expect(body.name).to.be.a('string');
  pm.expect(body.email).to.be.a('string');
});

Se a resposta for lista, valide que é array e que pelo menos o primeiro item segue o contrato mínimo, sem depender de tamanho fixo.

6) Construir Regression por cenários e reutilizar setup

Em Regression, crie subpastas por cenário. Para casos negativos, padronize asserts de erro (status e estrutura do erro). Exemplo:

const helpers = eval(pm.collectionVariables.get('helpers'));
helpers.expectStatus(400);

const body = pm.response.json();
pm.test('Error has message', function () {
  pm.expect(body).to.have.property('message');
});

Para evitar duplicação, use o mesmo setup sempre que possível. Se um cenário exige dados específicos, crie um setup local dentro da subpasta (por exemplo, “Setup - Scenario X”) e mantenha o escopo claro.

7) Teardown: limpar o que foi criado (quando aplicável)

Na pasta 99 - Teardown, crie requests que removem ou desativam recursos criados no setup. Use a lista setup_createdIds para iterar manualmente (Postman não tem loop nativo em request, mas você pode criar múltiplas requests de delete usando variáveis, ou preparar um endpoint de limpeza se existir).

Mesmo quando não há delete, você pode registrar o que foi criado e marcar como “dados de teste” para auditoria, mantendo rastreabilidade.

Estratégias para reduzir duplicação entre Collections

Collection “Core” de utilitários compartilhados

Quando você tem múltiplas suites (por exemplo, uma por serviço), é comum repetir helpers e templates. Uma estratégia é manter uma Collection “Core - Utilities” com:

  • Requests template
  • Exemplos de asserts
  • Snippets de scripts (helpers)

O time copia (ou sincroniza manualmente) apenas o necessário para cada suite. O ponto central é manter um “padrão de referência” para novos testes, reduzindo divergência.

Evitar “copiar e colar” de requests com URLs fixas

Ao duplicar requests, garanta que a URL use variáveis (por exemplo, {{baseUrl}}) e que parâmetros dinâmicos usem variáveis de Collection/Environment. Antes de considerar a request “pronta”, faça um checklist rápido:

  • URL parametrizada?
  • Headers essenciais padronizados?
  • Scripts usam helpers?
  • IDs e dados vêm de setup/variáveis?
  • Nome segue padrão?

Checklist de qualidade para uma suite realmente reutilizável

Checklist de estrutura

  • Pastas com ordem e propósito claros (Setup, Smoke, Contract, Regression, Teardown).
  • Nomes com prefixos/tags para facilitar seleção.
  • Templates separados de casos executáveis.

Checklist de parametrização

  • Nenhuma URL hardcoded que impeça troca de ambiente.
  • Variáveis com nomes contextuais (sem id genérico).
  • Dados gerados para evitar colisão (timestamp, sufixos).

Checklist de manutenção

  • Helpers centralizados para asserts comuns.
  • Dependências explícitas (setup claro, variáveis salvas).
  • Casos negativos padronizados (estrutura de erro validada).

Agora responda o exercício sobre o conteúdo:

Qual prática torna uma Collection no Postman mais reutilizável ao ser executada em diferentes ambientes sem editar requests?

Você acertou! Parabéns, agora siga para a próxima página

Você errou! Tente novamente.

Para reutilizar a suite em diferentes ambientes, o ideal é parametrizar URLs e dados usando variáveis e colocar no Environment tudo que muda por ambiente. Assim, você troca o ambiente sem precisar editar as requests.

Próximo capitúlo

Ambientes e variáveis no Postman: scopes e estratégias de parametrização

Arrow Right Icon
Baixe o app para ganhar Certificação grátis e ouvir os cursos em background, mesmo com a tela desligada.