Flow Test Engine - YAML API Reference

Versรฃo: 1.0 รšltima Atualizaรงรฃo: 10 de outubro de 2025 Status: Documentaรงรฃo Completa โœ…

๐Ÿ“š รndice Navegรกvel

๐Ÿ—๏ธ Estrutura e Configuraรงรฃo

๐Ÿ”„ Variรกveis e Interpolaรงรฃo

โœ… Validaรงรฃo e Assertions

๐Ÿ’ฌ Input e Interaรงรฃo

๐Ÿ” Controle de Fluxo

โš™๏ธ Configuraรงรตes Avanรงadas

๏ฟฝ Diagramas e Visualizaรงรตes

๏ฟฝ๐Ÿ“– Exemplos e Ajuda


๐Ÿš€ Quick Start

Estrutura Mรญnima

node_id: "meu-teste"
suite_name: "Meu Primeiro Teste"
base_url: "https://api.example.com"

steps:
  - name: "Fazer requisiรงรฃo"
    request:
      method: GET
      url: "/endpoint"
    assert:
      status_code: 200

Exemplo Completo

node_id: "user-management"
suite_name: "User Management Tests"
base_url: "{{api_base_url}}"
execution_mode: "sequential"

metadata:
  priority: "high"
  tags: ["users", "crud"]
  timeout: 30000

variables:
  test_user_email: "{{$faker.internet.email}}"

exports: ["created_user_id"]

depends:
  - path: "./auth-setup.yaml"
    required: true

steps:
  - name: "Create user"
    request:
      method: POST
      url: "/users"
      headers:
        Authorization: "Bearer {{auth-setup.token}}"
      body:
        email: "{{test_user_email}}"
        name: "{{$faker.person.fullName}}"
    assert:
      status_code: 201
      body:
        id: {exists: true}
        email: {equals: "{{test_user_email}}"}
    capture:
      created_user_id: "body.id"

1. TestSuite (Estrutura Base)

Propriedades Principais

PropriedadeTipoObrigatรณrioPadrรฃoDescriรงรฃo
node_idstringโœ…-Identificador รบnico (kebab-case)
suite_namestringโœ…-Nome descritivo da suรญte
descriptionstringโŒ-Descriรงรฃo detalhada
base_urlstringโŒ-URL base para requests relativos
execution_mode"sequential" | "parallel"โŒ"sequential"Modo de execuรงรฃo
variablesRecord<string, any>โŒ{}Variรกveis locais
exportsstring[]โŒ[]Variรกveis para exportar
exports_optionalstring[]โŒ[]Exports opcionais
dependsFlowDependency[]โŒ[]Dependรชncias
stepsTestStep[]โœ…-Passos de teste
metadataSuiteMetadataโŒ-Metadados

Suite Metadata

metadata:
  priority: "critical"        # critical|high|medium|low
  tags: ["smoke", "auth"]     # Categorizaรงรฃo
  timeout: 30000              # Timeout geral em ms
  estimated_duration_ms: 5000 # Duraรงรฃo estimada
  requires_user_input: false  # Flag para inputs

Flow Dependency

depends:
  # Caminho relativo (padrรฃo)
  - path: "./auth/login.yaml"
    required: true
    cache: 300  # TTL em segundos

  # Caminho absoluto (a partir de test_directory)
  - path: "common/setup.yaml"
    path_type: "absolute"
    required: true

  # Por node_id
  - node_id: "auth-setup"
    cache: true

  # Com condiรงรฃo
  - path: "./optional.yaml"
    condition: "environment == 'dev'"

  # Com variรกveis e retry
  - path: "./database-setup.yaml"
    variables:
      db_name: "test_db"
    retry:
      max_attempts: 3
      delay_ms: 1000

2. TestStep (Propriedades dos Steps)

Propriedades Principais

PropriedadeTipoObrigatรณrioDescriรงรฃo
namestringโœ…Nome do passo
step_idstringโŒID รบnico do passo
requestRequestDetailsCondicional*Configuraรงรฃo HTTP
assertAssertionsโŒValidaรงรตes
captureRecord<string, string>โŒExtraรงรตes JMESPath
inputInputConfig | InputConfig[]โŒInput interativo
callStepCallConfigโŒChamada cross-suite
iterateIterationConfigโŒLoop
scenariosConditionalScenario[]โŒCondicionais
continue_on_failurebooleanโŒContinuar em falha
metadataTestStepMetadataโŒMetadados

*request รฉ opcional apenas se houver input ou call

Request Details

request:
  method: POST              # GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS
  url: "/api/users"         # Absoluta ou relativa
  headers:
    Content-Type: "application/json"
    Authorization: "Bearer {{token}}"
  body:
    name: "John Doe"
    email: "john@example.com"
  params:                   # Query string
    page: 1
    limit: 10
  timeout: 30000            # ms

Step Metadata

metadata:
  priority: "high"
  tags: ["critical"]
  timeout: 10000
  retry:
    max_attempts: 3
    delay_ms: 1000
  depends_on: ["step-1", "step-2"]
  description: "Creates user account"
  skip: "{{environment}} === 'prod'"  # Condiรงรฃo para pular

3. Sistema de Interpolaรงรฃo

3.1 Sintaxe e Fontes

TipoSintaxeExemploResultado
Bรกsica{{var}}{{user_id}}Variรกvel local/capturada
Aninhada{{obj.field}}{{user.profile.name}}Acesso profundo
Array{{arr[i]}}{{items[0].id}}Por รญndice
Cross-suite{{suite-id.var}}{{auth.token}}Entre suites
Ambiente{{$env.VAR}}{{$env.API_KEY}}Lรช FLOW_TEST_API_KEY
Faker{{$faker.x.y}}{{$faker.internet.email}}Dados fake
JavaScript{{$js:expr}}{{$js:Date.now()}}Expressรฃo JS

3.2 Faker.js - Categorias Principais

CategoriaExemplosUso
personfirstName, lastName, fullNameNomes
internetemail, url, userName, passwordWeb
phonenumber, imeiTelefones
locationcity, country, streetAddressGeografia
commerceproductName, price, departmentComรฉrcio
companyname, catchPhrase, bsEmpresas
stringuuid, alphanumeric, numericStrings
numberint, float, binaryNรบmeros
datepast, future, recent, soonDatas
loremword, words, sentence, paragraphTexto
variables:
  user_email: "{{$faker.internet.email}}"           # test@example.com
  user_name: "{{$faker.person.fullName}}"           # John Doe
  user_phone: "{{$faker.phone.number}}"             # +1234567890
  product_price: "{{$faker.commerce.price}}"        # 49.99
  uuid: "{{$faker.string.uuid}}"                    # 123e4567-e89b...
  random_int: "{{$faker.number.int({min: 1, max: 100})}}"  # 42

3.3 JavaScript Expressions

computed:
  timestamp: "{{$js:Date.now()}}"                   # 1704110400000
  iso_date: "{{$js:new Date().toISOString()}}"      # 2024-01-01T12:00:00.000Z
  random: "{{$js:Math.random()}}"                   # 0.123456789
  calculation: "{{$js:{{price}} * {{quantity}}}}"   # Resultado do cรกlculo
  rounded: "{{$js:Math.round({{value}}\)}}}"        # Valor arredondado
  base64: "{{$js:Buffer.from('text').toString('base64')}}"  # dGV4dA==
  json_parse: "{{$js:JSON.parse('{{json_string}}')}}"       # Objeto parseado

4. Assertions (Validaรงรตes)

4.1 Estrutura de Assertions

assert:
  # Shorthand para status
  status_code: 200

  # Validaรงรตes do body
  body:
    user.id: {exists: true, type: "number"}
    user.email: {regex: "^[\\w.-]+@[\\w.-]+\\.\\w+$"}
    items: {length: {greater_than: 0}}

  # Headers
  headers:
    content-type: {contains: "json"}

  # Response time
  response_time_ms:
    less_than: 2000
    greater_than: 10

  # Custom
  custom:
    - name: "Valid ID"
      condition: "body.id > 0"
      message: "ID must be positive"

4.2 Operadores de Asserรงรฃo (AssertionChecks)

OperadorTipoDescriรงรฃoExemplo
equalsanyIgualdade exata{equals: 200}
not_equalsanyDiferente de{not_equals: null}
containsanyContรฉm valor{contains: "success"}
not_containsanyNรฃo contรฉm{not_contains: "error"}
greater_thannumberMaior que{greater_than: 0}
less_thannumberMenor que{less_than: 1000}
greater_than_or_equalnumberโ‰ฅ{greater_than_or_equal: 1}
less_than_or_equalnumberโ‰ค{less_than_or_equal: 100}
regexstringPadrรฃo regex{regex: "^[a-z]+$"}
patternstringAlias de regex{pattern: "\\d{3}"}
existsbooleanCampo existe{exists: true}
not_existsbooleanCampo nรฃo existe{exists: false}
typestringTipo do valor{type: "string"}
lengthobjectTamanho{length: {equals: 5}}
minLengthnumberTamanho mรญn.{minLength: 3}
notEmptybooleanNรฃo vazio{notEmpty: true}
inany[]Estรก na lista{in: ["active", "pending"]}
not_inany[]Nรฃo estรก na lista{not_in: ["deleted"]}

4.3 Tipos Suportados

  • "string" - Texto
  • "number" - Nรบmero (int/float)
  • "boolean" - Booleano
  • "array" - Lista
  • "object" - Objeto
  • "null" - Nulo

4.4 Validaรงรฃo de Length

body:
  items:
    length:
      equals: 10              # Exatamente 10
      greater_than: 0         # Mais de 0
      less_than: 100          # Menos de 100
      greater_than_or_equal: 5
      less_than_or_equal: 50

4.5 Custom Assertions

custom:
  - name: "Valid user ID format"
    condition: "body.user.id && typeof body.user.id === 'number'"
    message: "User ID must be a number"

  - name: "Email matches username"
    condition: "body.email.startsWith(body.username)"
    message: "Email should start with username"

5. Extraรงรฃo de Dados - Capture (JMESPath)

Sintaxe Bรกsica

PadrรฃoDescriรงรฃoExemploResultado
Campo simplesAcesso diretobody.tokenValor do campo
AninhadoNavegaรงรฃobody.user.profile.nameValor profundo
Array รญndicePosicionalbody.items[0]Primeiro item
Array negativoReversobody.items[-1]รšltimo item
ProjeรงรฃoMapearbody.data[*].idArray de IDs
CompletoTudo@Resposta inteira
StatusHTTP codestatus200, 404, etc.
HeadersCabeรงalhosheaders.Content-TypeValor do header

Operaรงรตes Avanรงadas

capture:
  # Filtros
  active_users: "users[?status=='active']"
  expensive_items: "items[?price > `100`]"

  # Projeรงรตes customizadas
  user_list: "users[*].{id: id, name: name, email: email}"

  # Funรงรตes
  total_count: "length(items)"
  max_price: "max(products[*].price)"
  min_price: "min(products[*].price)"

  # Ordenaรงรฃo
  sorted_items: "sort_by(items, &created_at)"

  # Flatten
  all_tags: "posts[].tags[]"

  # Pipes
  first_five: "items | [0:5]"

  # Contains
  has_admin: "contains(roles, 'admin')"

6. Input Interativo (InputConfig)

6.1 Propriedades Base

input:
  prompt: "Enter your API key:"       # OBRIGATร“RIO
  variable: "api_key"                  # OBRIGATร“RIO
  type: "password"                     # OBRIGATร“RIO
  description: "API key for auth"
  default: "default_value"
  placeholder: "sk-..."
  required: true
  style: "boxed"                       # simple|boxed|highlighted
  timeout_seconds: 60
  condition: "{{status}} == 200"
  ci_default: "{{$env.CI_API_KEY}}"
  validation: {...}
  dynamic: {...}
  options: [...]                       # Para select/multiselect

6.2 Tipos de Input

TipoDescriรงรฃoUse Case
textTexto simplesNomes, IDs
passwordMascaradoSenhas, tokens
numberNumรฉricoQuantidades
emailEmail validadoEndereรงos
urlURL validadaLinks
selectSeleรงรฃo รบnicaEscolher opรงรฃo
multiselectMรบltipla seleรงรฃoVรกrias opรงรตes
confirmSim/NรฃoConfirmaรงรตes
multilineMultilinhaJSON, descriรงรตes

6.3 Options para Select

# Estรกtico
options:
  - {value: "dev", label: "Development"}
  - {value: "prod", label: "Production"}

# De variรกvel
options: "{{environments}}"
value_path: "id"
label_path: "name"

# JMESPath
options: "{{users[*].{value: id, label: name}}}"

6.4 Input Validation

validation:
  min_length: 5
  max_length: 100
  pattern: "^[a-zA-Z0-9]+$"
  min: 0
  max: 100
  custom_validation: "value.length > 3"
  expressions:
    - name: "Valid format"
      expression: "value.startsWith('sk-')"
      message: "Must start with sk-"
      severity: "error"      # error|warning

7. Iteraรงรฃo (IterationConfig)

7.1 Array Iteration

- name: "Process {{user.name}}"
  iterate:
    over: "{{test_users}}"    # Array ou expressรฃo
    as: "user"                # Nome da variรกvel
  request:
    method: POST
    url: "/users"
    body:
      name: "{{user.name}}"
      email: "{{user.email}}"

7.2 Range Iteration

- name: "Test page {{page}}"
  iterate:
    range: "1..10"            # start..end (inclusive)
    as: "page"
  request:
    method: GET
    url: "/items?page={{page}}"

Iteration Context

Durante a iteraรงรฃo, estรฃo disponรญveis:

  • {{<as_variable>}} - Valor atual
  • _iteration.index - รndice (0-based)
  • _iteration.isFirst - Primeira iteraรงรฃo
  • _iteration.isLast - รšltima iteraรงรฃo

8. Cenรกrios Condicionais (ConditionalScenario)

scenarios:
  - name: "Success path"
    condition: "status_code == `200`"  # JMESPath
    then:
      assert:
        body:
          success: {equals: true}
      capture:
        result_id: "body.id"
      variables:
        operation_succeeded: true
      steps:                             # Apenas em 'then'
        - name: "Verify result"
          request:
            method: GET
            url: "/verify/{{result_id}}"

  - name: "Error path"
    condition: "status_code >= `400`"
    then:
      assert:
        body:
          error: {exists: true}
      variables:
        operation_failed: true
    else:
      variables:
        operation_succeeded: true

Operadores em Condiรงรตes

  • ==, != - Igualdade
  • <, <=, >, >= - Comparaรงรฃo
  • && - E lรณgico
  • || - OU lรณgico
  • ! - Negaรงรฃo

Literais numรฉricos: `200` Strings: 'text'


9. Step Call Cross-Suite (StepCallConfig)

call:
  test: "../auth/login.yaml"          # Caminho do arquivo
  path_type: "relative"                # relative|absolute
  step: "login-step"                   # ID ou nome do step
  variables:                           # Injetar variรกveis
    username: "{{test_user}}"
    password: "{{test_pass}}"
  isolate_context: true                # Namespace de variรกveis
  on_error: "fail"                     # fail|continue|warn
  timeout: 30000
  retry:
    max_attempts: 3
    delay_ms: 1000

Comportamento de Isolamento

isolate_contextComportamento
true (padrรฃo)Variรกveis em {{step-id.variable}}
falseVariรกveis mesclam no escopo pai

10. Tipos de Dados e Valores Especiais

Primitivos

variables:
  text: "Hello"              # string
  number: 42                 # number
  decimal: 3.14              # number
  active: true               # boolean
  empty: null                # null
  list: [1, 2, 3]            # array
  object:                    # object
    key: "value"

Response Object

{
  status: 200,               // Cรณdigo HTTP
  status_code: 200,          // Alias
  headers: {...},            // Headers da resposta
  body: {...},               // Corpo parseado
  data: {...},               // Alias para body (axios)
  response_time_ms: 123      // Tempo de resposta
}

11. Configuraรงรฃo de Retry

# No step metadata
metadata:
  retry:
    max_attempts: 3
    delay_ms: 1000

# Em dependency
depends:
  - path: "./setup.yaml"
    retry:
      max_attempts: 2
      delay_ms: 500

# Em call
call:
  test: "./external.yaml"
  step: "api-call"
  retry:
    max_attempts: 5
    delay_ms: 2000

12. Timeouts

NรญvelPropriedadeEscopoPadrรฃo
Globalconfig.timeoutTodas requisiรงรตesConfig
Suitemetadata.timeoutSuite inteiraSem limite
Stepmetadata.timeoutStep especรญficoHerda
Requestrequest.timeoutHTTP individual30000 ms
Inputinput.timeout_secondsInput interativoSem limite
Callcall.timeoutCross-suiteHerda

13. Resoluรงรฃo de URLs

URL no StepBase URLResultado
/api/usershttps://api.example.comhttps://api.example.com/api/users
usershttps://api.example.comhttps://api.example.com/users
https://other.com/apiQualquerhttps://other.com/api
http://localhost:8080Qualquerhttp://localhost:8080

14. Escopo de Variรกveis

EscopoDefiniรงรฃoAcessoPersistรชncia
LocalvariablesSuite atualDuraรงรฃo da suite
RuntimeCapturadasSteps seguintesDuraรงรฃo da suite
Globalexports{{suite-id.var}}Toda execuรงรฃo
EnvironmentSistema{{$env.VAR}}Permanente
DynamicInputConforme configConfigurรกvel

Ordem de Precedรชncia (maior โ†’ menor)

  1. Variรกveis runtime (step atual)
  2. Variรกveis de iteraรงรฃo (as)
  3. Variรกveis locais
  4. Variรกveis de dependencies
  5. Variรกveis globais (exports)
  6. Variรกveis de ambiente

15. Response Object Structure

interface Response {
  status: number;              // 200, 404, etc.
  status_code: number;         // Alias
  headers: Record<string, string>;
  body: any;                   // JSON parseado ou string
  data: any;                   // Alias para body
  response_time_ms: number;    // Tempo de resposta
}

16. Execution Modes

ModeDescriรงรฃoUse CaseRestriรงรตes
sequentialOrdem sequencialCom dependรชnciasNenhuma
parallelSimultรขneoIndependentesSem input

17. Priority Levels

NรญvelUso
criticalSmoke tests, core
highFuncionalidades importantes
mediumRegression padrรฃo
lowEdge cases
npx flow-test-engine --priority critical,high

18. Tags

Exemplos comuns:

  • smoke, regression, auth
  • api, e2e, integration
  • performance, security
npx flow-test-engine --tags smoke,auth

19. Diagramas e Fluxos de Execuรงรฃo

19.1 Fluxo de Execuรงรฃo Geral

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    FLOW TEST ENGINE                             โ”‚
โ”‚                     Ciclo de Vida                               โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    โ”‚   Discovery  โ”‚  1. Descobre arquivos .yaml
    โ”‚   (Config)   โ”‚  2. Valida estrutura
    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  3. Resolve dependรชncias
           โ”‚
           โ–ผ
    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    โ”‚ Dependency   โ”‚  4. Ordena por depends
    โ”‚  Resolution  โ”‚  5. Detecta ciclos
    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  6. Valida cache
           โ”‚
           โ–ผ
    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    โ”‚  Variables   โ”‚  7. Carrega env vars
    โ”‚    Setup     โ”‚  8. Inicializa variables
    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  9. Processa Faker/JS
           โ”‚
           โ–ผ
    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    โ”‚ Step-by-Step โ”‚  10. Executa cada step
    โ”‚  Execution   โ”‚  11. Interpola variรกveis
    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  12. HTTP request
           โ”‚
           โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
           โ”‚              โ–ผ
           โ”‚       โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
           โ”‚       โ”‚  Assertions  โ”‚  13. Valida status
           โ”‚       โ”‚  Validation  โ”‚  14. Valida body
           โ”‚       โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  15. Valida headers
           โ”‚              โ”‚
           โ”‚              โ–ผ
           โ”‚       โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
           โ”‚       โ”‚   Capture    โ”‚  16. Extrai dados (JMESPath)
           โ”‚       โ”‚   & Export   โ”‚  17. Armazena variรกveis
           โ”‚       โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  18. Exporta globais
           โ”‚              โ”‚
           โ”‚              โ–ผ
           โ”‚       โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
           โ”‚       โ”‚  Scenarios   โ”‚  19. Avalia condiรงรตes
           โ”‚       โ”‚  Evaluation  โ”‚  20. Executa then/else
           โ”‚       โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
           โ”‚
           โ–ผ
    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    โ”‚   Reporting  โ”‚  21. Gera resultados JSON
    โ”‚  Generation  โ”‚  22. Cria relatรณrio HTML
    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  23. Exibe sumรกrio

19.2 Fluxo de Variรกveis

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚               ESCOPO E PRECEDรŠNCIA DE VARIรVEIS                  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Precedรชncia (do maior para o menor):
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”

1. โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ† MAIOR PRIORIDADE
   โ”‚   Runtime Variables     โ”‚
   โ”‚   (step atual)          โ”‚
   โ”‚   โ€ข capture: {...}      โ”‚
   โ”‚   โ€ข computed: {...}     โ”‚
   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

2. โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
   โ”‚  Iteration Variables    โ”‚
   โ”‚  (durante loop)         โ”‚
   โ”‚  โ€ข as: "item"           โ”‚
   โ”‚  โ€ข _iteration.index     โ”‚
   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

3. โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
   โ”‚   Suite Variables       โ”‚
   โ”‚   (locais)              โ”‚
   โ”‚   variables:            โ”‚
   โ”‚     user_id: 123        โ”‚
   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

4. โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
   โ”‚  Dependency Variables   โ”‚
   โ”‚  (de depends)           โ”‚
   โ”‚  {{suite-id.var}}       โ”‚
   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

5. โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
   โ”‚   Global Variables      โ”‚
   โ”‚   (exports)             โ”‚
   โ”‚   {{suite-id.var}}      โ”‚
   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

6. โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ† MENOR PRIORIDADE
   โ”‚  Environment Variables  โ”‚
   โ”‚  (sistema)              โ”‚
   โ”‚  {{$env.VAR}}           โ”‚
   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”

Fluxo de Dados:
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€

Suite A                    Suite B
  โ†“                          โ†“
variables:            depends: [Suite A]
  local_var: 1              โ†“
  โ†“                    {{suite-a.exported}}
exports: [exported]         โ†“
  โ†“                    variables:
capture:                    uses_export: true
  api_result: "..."         โ†“
  โ†“                    steps: [...]
{{api_result}}

19.3 Interpolaรงรฃo de Variรกveis - Processo

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚            PROCESSO DE INTERPOLAร‡รƒO {{variable}}                 โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Input String:
"Hello {{user.name}}, your ID is {{user_id}}"
       โ†“
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  1. Detecรงรฃo         โ”‚  Regex: /\{\{([^}]+)\}\}/g
โ”‚     de Padrรตes       โ”‚  Encontra: ["{{user.name}}", "{{user_id}}"]
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
       โ”‚
       โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  2. Classificaรงรฃo    โ”‚  user.name โ†’ Objeto aninhado
โ”‚     de Tipo          โ”‚  user_id   โ†’ Variรกvel simples
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
       โ”‚
       โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
       โ–ผ                      โ–ผ                    โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Variรกvel     โ”‚   โ”‚  Ambiente    โ”‚    โ”‚   Faker.js   โ”‚
โ”‚ Simples      โ”‚   โ”‚  $env.VAR    โ”‚    โ”‚ $faker.x.y   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
       โ”‚                  โ”‚                    โ”‚
       โ–ผ                  โ–ผ                    โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Cross-Suite  โ”‚   โ”‚  JavaScript  โ”‚    โ”‚   JMESPath   โ”‚
โ”‚ suite.var    โ”‚   โ”‚  $js:expr    โ”‚    โ”‚  (capture)   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
       โ”‚                  โ”‚                    โ”‚
       โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                         โ”‚
                         โ–ผ
              โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
              โ”‚  3. Resoluรงรฃo       โ”‚
              โ”‚     de Valor        โ”‚
              โ”‚  โ€ข Busca em escopo  โ”‚
              โ”‚  โ€ข Executa funรงรฃo   โ”‚
              โ”‚  โ€ข Avalia expressรฃo โ”‚
              โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                         โ”‚
                         โ–ผ
              โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
              โ”‚  4. Substituiรงรฃo    โ”‚
              โ”‚     no String       โ”‚
              โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                         โ”‚
                         โ–ผ
Output String:
"Hello John Doe, your ID is 12345"

19.4 Fluxo de Cenรกrios Condicionais

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    CENรRIOS CONDICIONAIS                         โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Step Executado
     โ”‚
     โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ HTTP Response   โ”‚
โ”‚ {status: 200,   โ”‚
โ”‚  body: {...}}   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
         โ”‚
         โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Cenรกrio 1: Success Path            โ”‚
โ”‚  condition: "status_code == `200`"  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
         โ”‚
         โ”œโ”€โ”€ Avalia โ†’ TRUE โ”€โ”€โ”
         โ”‚                   โ–ผ
         โ”‚           โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
         โ”‚           โ”‚  then:        โ”‚
         โ”‚           โ”‚  โ€ข assert     โ”‚
         โ”‚           โ”‚  โ€ข capture    โ”‚
         โ”‚           โ”‚  โ€ข variables  โ”‚
         โ”‚           โ”‚  โ€ข steps[]    โ”‚
         โ”‚           โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
         โ”‚
         โ””โ”€โ”€ Avalia โ†’ FALSE
                     โ”‚
                     โ–ผ
         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
         โ”‚  Cenรกrio 2: Error Path              โ”‚
         โ”‚  condition: "status_code >= `400`"  โ”‚
         โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                  โ”‚
                  โ”œโ”€โ”€ Avalia โ†’ TRUE โ”€โ”€โ”
                  โ”‚                   โ–ผ
                  โ”‚           โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                  โ”‚           โ”‚  then:        โ”‚
                  โ”‚           โ”‚  โ€ข assert     โ”‚
                  โ”‚           โ”‚  โ€ข variables  โ”‚
                  โ”‚           โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                  โ”‚                   โ”‚
                  โ”‚           โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                  โ”‚           โ”‚  else:        โ”‚
                  โ”‚           โ”‚  (opcional)   โ”‚
                  โ”‚           โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                  โ”‚
                  โ””โ”€โ”€ Avalia โ†’ FALSE
                              โ”‚
                              โ–ผ
                  Prรณximo Step ou Fim

19.5 Iteraรงรฃo - Fluxo

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                      ITERAร‡รƒO (LOOP)                             โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  iterate:       โ”‚
โ”‚    over: arr    โ”‚  Array: [item1, item2, item3]
โ”‚    as: "item"   โ”‚  ou
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  Range: "1..5"
         โ”‚
         โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Iteration Context Setup                โ”‚
โ”‚  โ€ข index = 0                            โ”‚
โ”‚  โ€ข isFirst = true                       โ”‚
โ”‚  โ€ข isLast = false                       โ”‚
โ”‚  โ€ข variableName = "item"                โ”‚
โ”‚  โ€ข value = <current>                    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
         โ”‚
    โ•”โ•โ•โ•โ•โ–ผโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
    โ•‘  Loop Iteration N                       โ•‘
    โ•‘                                         โ•‘
    โ•‘  Variables Available:                   โ•‘
    โ•‘  โ€ข {{item}} = current value             โ•‘
    โ•‘  โ€ข {{_iteration.index}} = N             โ•‘
    โ•‘  โ€ข {{_iteration.isFirst}} = boolean     โ•‘
    โ•‘  โ€ข {{_iteration.isLast}} = boolean      โ•‘
    โ•‘                                         โ•‘
    โ•‘  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”       โ•‘
    โ•‘  โ”‚  1. Interpola variรกveis     โ”‚       โ•‘
    โ•‘  โ”‚     com contexto atual      โ”‚       โ•‘
    โ•‘  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜       โ•‘
    โ•‘             โ–ผ                           โ•‘
    โ•‘  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”       โ•‘
    โ•‘  โ”‚  2. Executa Request         โ”‚       โ•‘
    โ•‘  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜       โ•‘
    โ•‘             โ–ผ                           โ•‘
    โ•‘  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”       โ•‘
    โ•‘  โ”‚  3. Assertions              โ”‚       โ•‘
    โ•‘  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜       โ•‘
    โ•‘             โ–ผ                           โ•‘
    โ•‘  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”       โ•‘
    โ•‘  โ”‚  4. Capture                 โ”‚       โ•‘
    โ•‘  โ”‚     "result_{{index}}"      โ”‚       โ•‘
    โ•‘  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜       โ•‘
    โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
         โ”‚
         โ”œโ”€โ”€โ”€ Mais itens? โ†’ Sim โ”€โ”€โ”
         โ”‚                        โ”‚
         โ”‚                        โ””โ”€โ†’ Loop++
         โ”‚
         โ””โ”€โ”€โ”€ Nรฃo mais itens
              โ”‚
              โ–ผ
         Prรณximo Step

19.6 Dependency Resolution

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                  RESOLUร‡รƒO DE DEPENDรŠNCIAS                       โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Suites Descobertas:
  โ€ข suite-a.yaml
  โ€ข suite-b.yaml
  โ€ข suite-c.yaml
  โ€ข suite-d.yaml

Dependรชncias Declaradas:
  suite-b โ†’ depends: [suite-a]
  suite-c โ†’ depends: [suite-a, suite-b]
  suite-d โ†’ depends: [suite-c]

         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
         โ”‚   DAG Builder   โ”‚  (Directed Acyclic Graph)
         โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                  โ”‚
                  โ–ผ
         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
         โ”‚ Cycle Detection โ”‚  Verifica loops
         โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                  โ”‚
                  โ”œโ”€โ”€โ”€ Ciclo? โ†’ Sim โ†’ โŒ ERROR
                  โ”‚
                  โ””โ”€โ”€โ”€ Nรฃo
                       โ”‚
                       โ–ผ
         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
         โ”‚ Topological Sort    โ”‚
         โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                  โ”‚
                  โ–ผ

Ordem de Execuรงรฃo:

Level 0:  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
          โ”‚  suite-a  โ”‚  (sem dependรชncias)
          โ””โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜
                โ”‚
                โ–ผ
Level 1:  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
          โ”‚  suite-b  โ”‚  (depende de suite-a)
          โ””โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜
                โ”‚
                โ–ผ
Level 2:  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
          โ”‚  suite-c  โ”‚  (depende de suite-a + suite-b)
          โ””โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜
                โ”‚
                โ–ผ
Level 3:  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
          โ”‚  suite-d  โ”‚  (depende de suite-c)
          โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Cache Strategy:
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ suite-a executa โ†’ exports cached        โ”‚
โ”‚    โ†“                                    โ”‚
โ”‚ suite-b usa cache โ†’ nรฃo reexecuta       โ”‚
โ”‚    โ†“                                    โ”‚
โ”‚ suite-c usa cache โ†’ nรฃo reexecuta       โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

19.7 Step Call Cross-Suite

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    STEP CALL CROSS-SUITE                         โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Suite Caller (main.yaml)
     โ”‚
     โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Step com call:                     โ”‚
โ”‚    call:                            โ”‚
โ”‚      test: "./auth/login.yaml"      โ”‚
โ”‚      step: "login-step"             โ”‚
โ”‚      variables:                     โ”‚
โ”‚        user: "{{test_user}}"        โ”‚
โ”‚      isolate_context: true          โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
         โ”‚
         โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  1. Resolve Path                    โ”‚
โ”‚     Relativo ou Absoluto            โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
         โ”‚
         โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  2. Load Target Suite               โ”‚
โ”‚     (auth/login.yaml)               โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
         โ”‚
         โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  3. Find Step by ID                 โ”‚
โ”‚     step_id: "login-step"           โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
         โ”‚
         โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  4. Inject Variables                โ”‚
โ”‚     Mescla com contexto             โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
         โ”‚
         โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  5. Execute Step                    โ”‚
โ”‚     โ€ข Request                       โ”‚
โ”‚     โ€ข Assertions                    โ”‚
โ”‚     โ€ข Captures                      โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
         โ”‚
         โ”œโ”€โ”€โ”€โ”€โ”€โ”€ isolate_context: true โ”€โ”€โ”
         โ”‚                                โ–ผ
         โ”‚                    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
         โ”‚                    โ”‚  Variรกveis em          โ”‚
         โ”‚                    โ”‚  namespace:            โ”‚
         โ”‚                    โ”‚  {{step-id.variable}}  โ”‚
         โ”‚                    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
         โ”‚
         โ””โ”€โ”€โ”€โ”€โ”€โ”€ isolate_context: false โ”€โ”
                                          โ–ผ
                              โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                              โ”‚  Variรกveis mesclam    โ”‚
                              โ”‚  diretamente no       โ”‚
                              โ”‚  escopo do caller     โ”‚
                              โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
         โ”‚
         โ–ผ
Continua execuรงรฃo em Suite Caller

19.8 Retry Logic

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                      RETRY MECHANISM                             โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Step com Retry:
  metadata:
    retry:
      max_attempts: 3
      delay_ms: 1000

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Attempt 1      โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
         โ”‚
         โ”œโ”€โ”€โ”€ โœ… Success โ†’ Continue
         โ”‚
         โ””โ”€โ”€โ”€ โŒ Failure
              โ”‚
              โ–ผ
         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
         โ”‚  Delay      โ”‚  Wait 1000ms
         โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                โ”‚
                โ–ผ
         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
         โ”‚  Attempt 2      โ”‚
         โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                  โ”‚
                  โ”œโ”€โ”€โ”€ โœ… Success โ†’ Continue
                  โ”‚
                  โ””โ”€โ”€โ”€ โŒ Failure
                       โ”‚
                       โ–ผ
                  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                  โ”‚  Delay      โ”‚  Wait 1000ms
                  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                         โ”‚
                         โ–ผ
                  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                  โ”‚  Attempt 3      โ”‚  (max_attempts)
                  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                           โ”‚
                           โ”œโ”€โ”€โ”€ โœ… Success โ†’ Continue
                           โ”‚
                           โ””โ”€โ”€โ”€ โŒ Failure
                                โ”‚
                                โ–ผ
                           โŒ FINAL ERROR
                           (max attempts reached)

Retry aplicรกvel em:
  โ€ข Request HTTP (timeout, 5xx errors)
  โ€ข Dependencies (falha na execuรงรฃo)
  โ€ข Step Call (erro no step chamado)

20. Exemplos Prรกticos Completos

20.1 Autenticaรงรฃo Bรกsica

node_id: "auth-basic"
suite_name: "Basic Authentication"
base_url: "{{api_url}}"

variables:
  username: "{{$env.TEST_USERNAME}}"
  password: "{{$env.TEST_PASSWORD}}"

exports: ["auth_token"]

steps:
  - name: "Login"
    request:
      method: POST
      url: "/auth/login"
      body:
        username: "{{username}}"
        password: "{{password}}"
    assert:
      status_code: 200
      body:
        token: {exists: true}
    capture:
      auth_token: "body.token"

20.2 CRUD Completo

node_id: "user-crud"
suite_name: "User CRUD Operations"
base_url: "{{api_url}}"

depends:
  - path: "./auth-basic.yaml"

variables:
  test_user:
    name: "{{$faker.person.fullName}}"
    email: "{{$faker.internet.email}}"

steps:
  # Create
  - name: "Create user"
    request:
      method: POST
      url: "/users"
      headers:
        Authorization: "Bearer {{auth-basic.auth_token}}"
      body:
        name: "{{test_user.name}}"
        email: "{{test_user.email}}"
    assert:
      status_code: 201
      body:
        id: {exists: true}
    capture:
      user_id: "body.id"

  # Read
  - name: "Get user"
    request:
      method: GET
      url: "/users/{{user_id}}"
      headers:
        Authorization: "Bearer {{auth-basic.auth_token}}"
    assert:
      status_code: 200
      body:
        id: {equals: "{{user_id}}"}
        email: {equals: "{{test_user.email}}"}

  # Update
  - name: "Update user"
    request:
      method: PUT
      url: "/users/{{user_id}}"
      headers:
        Authorization: "Bearer {{auth-basic.auth_token}}"
      body:
        name: "Updated Name"
    assert:
      status_code: 200

  # Delete
  - name: "Delete user"
    request:
      method: DELETE
      url: "/users/{{user_id}}"
      headers:
        Authorization: "Bearer {{auth-basic.auth_token}}"
    assert:
      status_code: 204

20.3 Data-Driven Testing

node_id: "validation-test"
suite_name: "Email Validation Tests"
base_url: "{{api_url}}"

variables:
  test_cases:
    - {email: "valid@example.com", expected: 200}
    - {email: "invalid", expected: 400}
    - {email: "", expected: 400}
    - {email: "no-at-sign.com", expected: 400}

steps:
  - name: "Test: {{test.email}}"
    iterate:
      over: "{{test_cases}}"
      as: "test"
    request:
      method: POST
      url: "/validate-email"
      body:
        email: "{{test.email}}"
    assert:
      status_code: "{{test.expected}}"

21. Guia de Troubleshooting

Problemas Comuns

ProblemaSoluรงรฃo
Variable {{var}} not foundVerificar definiรงรฃo ou capture anterior
JMESPath evaluation failedTestar em https://jmespath.org/
URL resolution errorVerificar base_url e tipo de URL
Assertion failedAdicionar scenarios para mรบltiplos casos
Timeout exceededAumentar timeout
Circular dependencyRevisar cadeia de depends
Input timeoutDefinir ci_default e timeout_seconds
Iteration failedValidar array nรฃo estรก vazio

Debug Tips

# Capturar tudo para debug
capture:
  debug_full: "@"
  debug_status: "status"
  debug_headers: "headers"
  debug_body: "body"

# Assertions verbosas
assert:
  custom:
    - name: "Debug"
      condition: "body"
      message: "Response: {{body}}"

CLI รšteis

# Dry run
npx flow-test-engine --dry-run tests/suite.yaml

# Verbose
npx flow-test-engine --verbose tests/suite.yaml

# Listar testes
npx flow-test-engine --list

22. Limitaรงรตes Conhecidas

| Assertion failed | Adicionar scenarios para mรบltiplos casos | | Timeout exceeded | Aumentar timeout | | Circular dependency | Revisar cadeia de depends | | Input timeout | Definir ci_default e timeout_seconds | | Iteration failed | Validar array nรฃo estรก vazio |

Debug Tips

# Capturar tudo para debug
capture:
  debug_full: "@"
  debug_status: "status"
  debug_headers: "headers"
  debug_body: "body"

# Assertions verbosas
assert:
  custom:
    - name: "Debug"
      condition: "body"
      message: "Response: {{body}}"

CLI รšteis

# Dry run
npx flow-test-engine --dry-run tests/suite.yaml

# Verbose
npx flow-test-engine --verbose tests/suite.yaml

# Listar testes
npx flow-test-engine --list

22. Limitaรงรตes Conhecidas

Tรฉcnicas

LimitaรงรฃoWorkaround
Input sรณ em sequentialUsar execution_mode: sequential
Variรกvel de iteraรงรฃo tem escopo limitadoCapturar antes do fim
Cross-suite requer execuรงรฃo prรฉviaUsar depends
Timeout nรฃo รฉ por assertionUsar no step/request

Boas Prรกticas

โœ… DO:

  • Usar node_id รบnicos
  • Definir ci_default para inputs
  • Capturar variรกveis essenciais
  • Validar com mรบltiplas assertions

โŒ DONโ€™T:

  • Parallel com input
  • Dependรชncias circulares
  • Timeouts muito curtos em CI
  • Ignorar falhas sem motivo

๐Ÿ“š Recursos Adicionais


Flow Test Engine v1.0 - Documentaรงรฃo Oficial Copyright ยฉ 2025 - Todos os direitos reservados

Flow Test Engine
ยฉ 2025 Flow Test Engine. Dynamic Reporting System.