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
๐ 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
| Propriedade | Tipo | Obrigatรณrio | Padrรฃo | Descriรงรฃo |
|---|
node_id | string | โ
| - | Identificador รบnico (kebab-case) |
suite_name | string | โ
| - | Nome descritivo da suรญte |
description | string | โ | - | Descriรงรฃo detalhada |
base_url | string | โ | - | URL base para requests relativos |
execution_mode | "sequential" | "parallel" | โ | "sequential" | Modo de execuรงรฃo |
variables | Record<string, any> | โ | {} | Variรกveis locais |
exports | string[] | โ | [] | Variรกveis para exportar |
exports_optional | string[] | โ | [] | Exports opcionais |
depends | FlowDependency[] | โ | [] | Dependรชncias |
steps | TestStep[] | โ
| - | Passos de teste |
metadata | SuiteMetadata | โ | - | Metadados |
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
| Propriedade | Tipo | Obrigatรณrio | Descriรงรฃo |
|---|
name | string | โ
| Nome do passo |
step_id | string | โ | ID รบnico do passo |
request | RequestDetails | Condicional* | Configuraรงรฃo HTTP |
assert | Assertions | โ | Validaรงรตes |
capture | Record<string, string> | โ | Extraรงรตes JMESPath |
input | InputConfig | InputConfig[] | โ | Input interativo |
call | StepCallConfig | โ | Chamada cross-suite |
iterate | IterationConfig | โ | Loop |
scenarios | ConditionalScenario[] | โ | Condicionais |
continue_on_failure | boolean | โ | Continuar em falha |
metadata | TestStepMetadata | โ | 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
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
| Tipo | Sintaxe | Exemplo | Resultado |
|---|
| 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
| Categoria | Exemplos | Uso |
|---|
person | firstName, lastName, fullName | Nomes |
internet | email, url, userName, password | Web |
phone | number, imei | Telefones |
location | city, country, streetAddress | Geografia |
commerce | productName, price, department | Comรฉrcio |
company | name, catchPhrase, bs | Empresas |
string | uuid, alphanumeric, numeric | Strings |
number | int, float, binary | Nรบmeros |
date | past, future, recent, soon | Datas |
lorem | word, words, sentence, paragraph | Texto |
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)
| Operador | Tipo | Descriรงรฃo | Exemplo |
|---|
equals | any | Igualdade exata | {equals: 200} |
not_equals | any | Diferente de | {not_equals: null} |
contains | any | Contรฉm valor | {contains: "success"} |
not_contains | any | Nรฃo contรฉm | {not_contains: "error"} |
greater_than | number | Maior que | {greater_than: 0} |
less_than | number | Menor que | {less_than: 1000} |
greater_than_or_equal | number | โฅ | {greater_than_or_equal: 1} |
less_than_or_equal | number | โค | {less_than_or_equal: 100} |
regex | string | Padrรฃo regex | {regex: "^[a-z]+$"} |
pattern | string | Alias de regex | {pattern: "\\d{3}"} |
exists | boolean | Campo existe | {exists: true} |
not_exists | boolean | Campo nรฃo existe | {exists: false} |
type | string | Tipo do valor | {type: "string"} |
length | object | Tamanho | {length: {equals: 5}} |
minLength | number | Tamanho mรญn. | {minLength: 3} |
notEmpty | boolean | Nรฃo vazio | {notEmpty: true} |
in | any[] | Estรก na lista | {in: ["active", "pending"]} |
not_in | any[] | 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"
Sintaxe Bรกsica
| Padrรฃo | Descriรงรฃo | Exemplo | Resultado |
|---|
| Campo simples | Acesso direto | body.token | Valor do campo |
| Aninhado | Navegaรงรฃo | body.user.profile.name | Valor profundo |
| Array รญndice | Posicional | body.items[0] | Primeiro item |
| Array negativo | Reverso | body.items[-1] | รltimo item |
| Projeรงรฃo | Mapear | body.data[*].id | Array de IDs |
| Completo | Tudo | @ | Resposta inteira |
| Status | HTTP code | status | 200, 404, etc. |
| Headers | Cabeรงalhos | headers.Content-Type | Valor 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.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
| Tipo | Descriรงรฃo | Use Case |
|---|
text | Texto simples | Nomes, IDs |
password | Mascarado | Senhas, tokens |
number | Numรฉrico | Quantidades |
email | Email validado | Endereรงos |
url | URL validada | Links |
select | Seleรงรฃo รบnica | Escolher opรงรฃo |
multiselect | Mรบltipla seleรงรฃo | Vรกrias opรงรตes |
confirm | Sim/Nรฃo | Confirmaรงรตes |
multiline | Multilinha | JSON, 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}}}"
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_context | Comportamento |
|---|
true (padrรฃo) | Variรกveis em {{step-id.variable}} |
false | Variรก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รญvel | Propriedade | Escopo | Padrรฃo |
|---|
| Global | config.timeout | Todas requisiรงรตes | Config |
| Suite | metadata.timeout | Suite inteira | Sem limite |
| Step | metadata.timeout | Step especรญfico | Herda |
| Request | request.timeout | HTTP individual | 30000 ms |
| Input | input.timeout_seconds | Input interativo | Sem limite |
| Call | call.timeout | Cross-suite | Herda |
13. Resoluรงรฃo de URLs
| URL no Step | Base URL | Resultado |
|---|
/api/users | https://api.example.com | https://api.example.com/api/users |
users | https://api.example.com | https://api.example.com/users |
https://other.com/api | Qualquer | https://other.com/api |
http://localhost:8080 | Qualquer | http://localhost:8080 |
14. Escopo de Variรกveis
| Escopo | Definiรงรฃo | Acesso | Persistรชncia |
|---|
| Local | variables | Suite atual | Duraรงรฃo da suite |
| Runtime | Capturadas | Steps seguintes | Duraรงรฃo da suite |
| Global | exports | {{suite-id.var}} | Toda execuรงรฃo |
| Environment | Sistema | {{$env.VAR}} | Permanente |
| Dynamic | Input | Conforme config | Configurรกvel |
Ordem de Precedรชncia (maior โ menor)
- Variรกveis runtime (step atual)
- Variรกveis de iteraรงรฃo (
as)
- Variรกveis locais
- Variรกveis de dependencies
- Variรกveis globais (
exports)
- 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
| Mode | Descriรงรฃo | Use Case | Restriรงรตes |
|---|
sequential | Ordem sequencial | Com dependรชncias | Nenhuma |
parallel | Simultรขneo | Independentes | Sem input |
17. Priority Levels
| Nรญvel | Uso |
|---|
critical | Smoke tests, core |
high | Funcionalidades importantes |
medium | Regression padrรฃo |
low | Edge cases |
npx flow-test-engine --priority critical,high
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
| Problema | Soluรงรฃo |
|---|
Variable {{var}} not found | Verificar definiรงรฃo ou capture anterior |
JMESPath evaluation failed | Testar em https://jmespath.org/ |
URL resolution error | Verificar base_url e tipo de URL |
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
| 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รงรฃo | Workaround |
|---|
| Input sรณ em sequential | Usar execution_mode: sequential |
| Variรกvel de iteraรงรฃo tem escopo limitado | Capturar antes do fim |
| Cross-suite requer execuรงรฃo prรฉvia | Usar depends |
| Timeout nรฃo รฉ por assertion | Usar 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