@maestro-ai/mcp-server 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +266 -227
- package/dist/content/design-system/README.md +231 -231
- package/dist/content/design-system/indexes/README.md +211 -211
- package/dist/content/design-system/indexes/colors-index.md +156 -156
- package/dist/content/design-system/indexes/quick-search.md +111 -111
- package/dist/content/design-system/indexes/stacks-index.md +341 -341
- package/dist/content/examples/Exemplo de Fluxo Completo com Java e Spring Boot.md +249 -249
- package/dist/content/examples/Exemplo de Fluxo Completo com Laravel e Filament.md +277 -277
- package/dist/content/examples/Exemplo de Fluxo Completo com Laravel e Livewire.md +260 -260
- package/dist/content/examples/Exemplo de Fluxo Completo com Node e NestJS.md +257 -257
- package/dist/content/guides/Cat/303/241logo de Stacks para Cloud Moderna.md" +119 -119
- package/dist/content/guides/Cat/303/241logo de Stacks para Hospedagem Compartilhada.md" +147 -147
- package/dist/content/guides/Checklist Mestre de Entrega.md +68 -68
- package/dist/content/guides/Gates de Qualidade.md +209 -209
- package/dist/content/guides/Guia de Adi/303/247/303/243o de Novas Funcionalidades.md" +355 -355
- package/dist/content/guides/Guia de Chaos Engineering.md +267 -267
- package/dist/content/guides/Guia de Debugging com IA.md +135 -135
- package/dist/content/guides/Guia de Estrat/303/251gias de Cache.md" +352 -352
- package/dist/content/guides/Guia de Migrations Zero-Downtime.md +311 -311
- package/dist/content/guides/Guia de Multi-tenancy.md +368 -368
- package/dist/content/guides/Guia de Otimiza/303/247/303/243o de Custos Cloud.md" +195 -195
- package/dist/content/guides/Guia de Refatora/303/247/303/243o de C/303/263digo Legado com IA.md" +162 -162
- package/dist/content/guides/Guia de SLOs e Error Budgets.md +315 -315
- package/dist/content/guides/M/303/251tricas de Efici/303/252ncia do Desenvolvimento com IA.md" +93 -93
- package/dist/content/guides/Rules base.md +90 -90
- package/dist/content/playbook/Playbook de Desenvolvimento com IA.md +364 -364
- package/dist/content/prompts/README.md +203 -203
- package/dist/content/prompts/acessibilidade/analise-acessibilidade.md +257 -257
- package/dist/content/prompts/apis/design-api-rest.md +303 -303
- package/dist/content/prompts/apis/idempotencia.md +254 -254
- package/dist/content/prompts/apis/versionamento.md +313 -313
- package/dist/content/prompts/arquitetura/arquitetura-c4-completo.md +190 -190
- package/dist/content/prompts/arquitetura/clean-architecture.md +151 -151
- package/dist/content/prompts/arquitetura/ddd-bounded-contexts.md +183 -183
- package/dist/content/prompts/arquitetura/ddd-cqrs.md +176 -176
- package/dist/content/prompts/arquitetura/modelo-dominio.md +207 -207
- package/dist/content/prompts/arquitetura/multi-tenancy.md +235 -235
- package/dist/content/prompts/database/migrations-zero-downtime.md +192 -192
- package/dist/content/prompts/database/otimizacao-queries.md +296 -296
- package/dist/content/prompts/desenvolvimento/code-review.md +301 -301
- package/dist/content/prompts/desenvolvimento/gerar-servico.md +271 -271
- package/dist/content/prompts/devops/docker-compose.md +336 -336
- package/dist/content/prompts/devops/feature-flags.md +374 -374
- package/dist/content/prompts/devops/kubernetes-deploy.md +460 -460
- package/dist/content/prompts/devops/pipeline-cicd.md +358 -358
- package/dist/content/prompts/devops/terraform-iac.md +502 -502
- package/dist/content/prompts/escalabilidade/analise-performance.md +240 -240
- package/dist/content/prompts/escalabilidade/analise-performance.txt +94 -94
- package/dist/content/prompts/escalabilidade/caching.md +255 -255
- package/dist/content/prompts/observabilidade/chaos-testing.md +237 -237
- package/dist/content/prompts/observabilidade/estrategia-observabilidade.md +263 -263
- package/dist/content/prompts/observabilidade/estrategia-observabilidade.txt +134 -134
- package/dist/content/prompts/observabilidade/slos.md +215 -215
- package/dist/content/prompts/produto/discovery-inicial.md +203 -203
- package/dist/content/prompts/produto/discovery-inicial.txt +33 -33
- package/dist/content/prompts/requisitos/refinar-requisitos.md +232 -232
- package/dist/content/prompts/requisitos/refinar-requisitos.txt +40 -40
- package/dist/content/prompts/seguranca/analise-seguranca.md +243 -243
- package/dist/content/prompts/seguranca/pentest-checklist.md +333 -333
- package/dist/content/prompts/seguranca/rate-limiting.md +356 -356
- package/dist/content/prompts/seguranca/revisao-lgpd.md +227 -227
- package/dist/content/prompts/seguranca/threat-modeling.md +224 -224
- package/dist/content/prompts/testes/contract-testing.md +340 -340
- package/dist/content/prompts/testes/gerar-testes-unitarios.md +474 -474
- package/dist/content/prompts/testes/testes-e2e.md +460 -460
- package/dist/content/prompts/testes/testes-integracao.md +418 -418
- package/dist/content/prompts/testes/testes-performance.md +458 -458
- package/dist/content/prompts/ux/gerar-ui-stitch.md +151 -151
- package/dist/content/rules/RULES.md +835 -835
- package/dist/content/rules/adapters/copilot.md +10 -10
- package/dist/content/rules/adapters/cursor.md +10 -10
- package/dist/content/rules/adapters/gemini.md +13 -13
- package/dist/content/rules/adapters/windsurf.md +10 -10
- package/dist/content/specialists/Especialista em Acessibilidade.md +266 -266
- package/dist/content/specialists/Especialista em An/303/241lise de Testes.md" +434 -434
- package/dist/content/specialists/Especialista em Arquitetura Avan/303/247ada.md" +358 -358
- package/dist/content/specialists/Especialista em Arquitetura de Software.md +177 -177
- package/dist/content/specialists/Especialista em Banco de Dados.md +260 -260
- package/dist/content/specialists/Especialista em Contrato de API.md +172 -172
- package/dist/content/specialists/Especialista em Dados e Analytics com IA.md +246 -246
- package/dist/content/specialists/Especialista em Debugging e Troubleshooting.md +191 -191
- package/dist/content/specialists/Especialista em Desenvolvimento Frontend.md +477 -477
- package/dist/content/specialists/Especialista em Desenvolvimento Mobile.md +241 -241
- package/dist/content/specialists/Especialista em Desenvolvimento e Vibe Coding Estruturado.md +417 -417
- package/dist/content/specialists/Especialista em DevOps e Infraestrutura.md +294 -294
- package/dist/content/specialists/Especialista em Documenta/303/247/303/243o T/303/251cnica.md" +227 -227
- package/dist/content/specialists/Especialista em Engenharia de Requisitos com IA.md +299 -299
- package/dist/content/specialists/Especialista em Explora/303/247/303/243o de Codebase.md" +179 -179
- package/dist/content/specialists/Especialista em Gest/303/243o de Produto.md" +179 -179
- package/dist/content/specialists/Especialista em Migra/303/247/303/243o e Moderniza/303/247/303/243o.md" +410 -410
- package/dist/content/specialists/Especialista em Modelagem e Arquitetura de Dom/303/255nio com IA.md" +248 -248
- package/dist/content/specialists/Especialista em Observabilidade.md +415 -415
- package/dist/content/specialists/Especialista em Performance e Escalabilidade.md +373 -373
- package/dist/content/specialists/Especialista em Plano de Execu/303/247/303/243o com IA.md" +341 -341
- package/dist/content/specialists/Especialista em Prototipagem R/303/241pida com Google Stitch.md" +419 -419
- package/dist/content/specialists/Especialista em Seguran/303/247a da Informa/303/247/303/243o.md" +508 -508
- package/dist/content/specialists/Especialista em UX Design.md +453 -453
- package/dist/content/specialists/INDEX.md +43 -43
- package/dist/content/templates/PRD.md +165 -165
- package/dist/content/templates/README.md +65 -65
- package/dist/content/templates/adr.md +103 -103
- package/dist/content/templates/arquitetura.md +279 -279
- package/dist/content/templates/backlog.md +185 -185
- package/dist/content/templates/checklist-seguranca.md +180 -180
- package/dist/content/templates/contexto.md +120 -120
- package/dist/content/templates/criterios-aceite.md +99 -99
- package/dist/content/templates/design-banco.md +270 -270
- package/dist/content/templates/design-doc.md +240 -240
- package/dist/content/templates/feature.md +88 -88
- package/dist/content/templates/historia-backend.md +84 -84
- package/dist/content/templates/historia-frontend.md +75 -75
- package/dist/content/templates/historia-usuario.md +125 -125
- package/dist/content/templates/mapa-navegacao.md +133 -133
- package/dist/content/templates/matriz-rastreabilidade.md +121 -121
- package/dist/content/templates/modelo-dominio.md +219 -219
- package/dist/content/templates/plano-testes.md +199 -199
- package/dist/content/templates/prototipo-stitch.md +138 -138
- package/dist/content/templates/requisitos.md +162 -162
- package/dist/content/templates/slo-sli.md +197 -197
- package/dist/content/workflows/README-MCP.md +363 -363
- package/dist/content/workflows/mcp-debug.md +506 -506
- package/dist/content/workflows/mcp-feature.md +385 -385
- package/dist/content/workflows/mcp-gate.md +413 -413
- package/dist/content/workflows/mcp-next.md +388 -388
- package/dist/content/workflows/mcp-refactor.md +600 -600
- package/dist/content/workflows/mcp-start.md +304 -304
- package/dist/content/workflows/mcp-status.md +400 -400
- package/dist/gates/tiers.test.js +14 -14
- package/dist/index.js +133 -133
- package/dist/resources/index.js +61 -61
- package/dist/stdio.js +39 -32
- package/dist/stdio.js.map +1 -1
- package/dist/tools/analise/performance.js +23 -23
- package/dist/tools/analise/qualidade.js +23 -23
- package/dist/tools/analise/relatorio.js +24 -24
- package/dist/tools/analise/seguranca.js +28 -28
- package/dist/tools/aprovar-gate.js +81 -81
- package/dist/tools/atualizar-codebase.js +18 -18
- package/dist/tools/avaliar-entregavel.js +18 -18
- package/dist/tools/carregar-projeto.d.ts.map +1 -1
- package/dist/tools/carregar-projeto.js +91 -116
- package/dist/tools/carregar-projeto.js.map +1 -1
- package/dist/tools/classificar.js +36 -36
- package/dist/tools/confirmar-classificacao.js +36 -36
- package/dist/tools/confirmar-stitch.js +75 -75
- package/dist/tools/contexto.js +56 -56
- package/dist/tools/fluxos-alternativos.js +98 -98
- package/dist/tools/implementar-historia.js +63 -63
- package/dist/tools/iniciar-projeto.d.ts.map +1 -1
- package/dist/tools/iniciar-projeto.js +139 -224
- package/dist/tools/iniciar-projeto.js.map +1 -1
- package/dist/tools/proximo.d.ts.map +1 -1
- package/dist/tools/proximo.js +224 -252
- package/dist/tools/proximo.js.map +1 -1
- package/dist/tools/salvar.js +59 -59
- package/dist/tools/status.d.ts.map +1 -1
- package/dist/tools/status.js +64 -93
- package/dist/tools/status.js.map +1 -1
- package/dist/tools/validar-gate.js +35 -35
- package/dist/types/response.js +11 -11
- package/dist/utils/instructions.js +48 -48
- package/dist/utils/prompt-mapper.js +16 -16
- package/dist/utils/system-md.js +33 -33
- package/package.json +67 -67
- package/dist/content/content/design-system/README.md +0 -231
- package/dist/content/content/design-system/data/charts.csv +0 -26
- package/dist/content/content/design-system/data/colors.csv +0 -97
- package/dist/content/content/design-system/data/icons.csv +0 -101
- package/dist/content/content/design-system/data/landing.csv +0 -31
- package/dist/content/content/design-system/data/products.csv +0 -97
- package/dist/content/content/design-system/data/prompts.csv +0 -24
- package/dist/content/content/design-system/data/react-performance.csv +0 -45
- package/dist/content/content/design-system/data/styles.csv +0 -59
- package/dist/content/content/design-system/data/typography.csv +0 -58
- package/dist/content/content/design-system/data/ui-reasoning.csv +0 -101
- package/dist/content/content/design-system/data/ux-guidelines.csv +0 -100
- package/dist/content/content/design-system/data/web-interface.csv +0 -31
- package/dist/content/content/design-system/indexes/README.md +0 -211
- package/dist/content/content/design-system/indexes/colors-index.md +0 -156
- package/dist/content/content/design-system/indexes/quick-search.md +0 -111
- package/dist/content/content/design-system/indexes/stacks-index.md +0 -341
- package/dist/content/content/design-system/stacks/flutter.csv +0 -53
- package/dist/content/content/design-system/stacks/html-tailwind.csv +0 -56
- package/dist/content/content/design-system/stacks/jetpack-compose.csv +0 -53
- package/dist/content/content/design-system/stacks/nextjs.csv +0 -53
- package/dist/content/content/design-system/stacks/nuxt-ui.csv +0 -51
- package/dist/content/content/design-system/stacks/nuxtjs.csv +0 -59
- package/dist/content/content/design-system/stacks/react-native.csv +0 -52
- package/dist/content/content/design-system/stacks/react.csv +0 -54
- package/dist/content/content/design-system/stacks/shadcn.csv +0 -61
- package/dist/content/content/design-system/stacks/svelte.csv +0 -54
- package/dist/content/content/design-system/stacks/swiftui.csv +0 -51
- package/dist/content/content/design-system/stacks/vue.csv +0 -50
- package/dist/content/content/examples/Exemplo de Fluxo Completo com Java e Spring Boot.md +0 -250
- package/dist/content/content/examples/Exemplo de Fluxo Completo com Laravel e Filament.md +0 -278
- package/dist/content/content/examples/Exemplo de Fluxo Completo com Laravel e Livewire.md +0 -261
- package/dist/content/content/examples/Exemplo de Fluxo Completo com Node e NestJS.md +0 -258
- package/dist/content/content/guides/Cat/303/241logo de Stacks para Cloud Moderna.md" +0 -119
- package/dist/content/content/guides/Cat/303/241logo de Stacks para Hospedagem Compartilhada.md" +0 -147
- package/dist/content/content/guides/Checklist Mestre de Entrega.md +0 -68
- package/dist/content/content/guides/Gates de Qualidade.md +0 -209
- package/dist/content/content/guides/Guia de Adi/303/247/303/243o de Novas Funcionalidades.md" +0 -355
- package/dist/content/content/guides/Guia de Chaos Engineering.md +0 -267
- package/dist/content/content/guides/Guia de Debugging com IA.md +0 -135
- package/dist/content/content/guides/Guia de Estrat/303/251gias de Cache.md" +0 -352
- package/dist/content/content/guides/Guia de Migrations Zero-Downtime.md +0 -311
- package/dist/content/content/guides/Guia de Multi-tenancy.md +0 -368
- package/dist/content/content/guides/Guia de Otimiza/303/247/303/243o de Custos Cloud.md" +0 -195
- package/dist/content/content/guides/Guia de Refatora/303/247/303/243o de C/303/263digo Legado com IA.md" +0 -162
- package/dist/content/content/guides/Guia de SLOs e Error Budgets.md +0 -315
- package/dist/content/content/guides/M/303/251tricas de Efici/303/252ncia do Desenvolvimento com IA.md" +0 -93
- package/dist/content/content/guides/Rules base.md +0 -90
- package/dist/content/content/playbook/Playbook de Desenvolvimento com IA.md +0 -364
- package/dist/content/content/prompts/README.md +0 -203
- package/dist/content/content/prompts/acessibilidade/analise-acessibilidade.md +0 -257
- package/dist/content/content/prompts/apis/design-api-rest.md +0 -303
- package/dist/content/content/prompts/apis/idempotencia.md +0 -254
- package/dist/content/content/prompts/apis/versionamento.md +0 -313
- package/dist/content/content/prompts/arquitetura/arquitetura-c4-completo.md +0 -190
- package/dist/content/content/prompts/arquitetura/clean-architecture.md +0 -151
- package/dist/content/content/prompts/arquitetura/ddd-bounded-contexts.md +0 -183
- package/dist/content/content/prompts/arquitetura/ddd-cqrs.md +0 -176
- package/dist/content/content/prompts/arquitetura/modelo-dominio.md +0 -207
- package/dist/content/content/prompts/arquitetura/multi-tenancy.md +0 -235
- package/dist/content/content/prompts/database/migrations-zero-downtime.md +0 -192
- package/dist/content/content/prompts/database/otimizacao-queries.md +0 -296
- package/dist/content/content/prompts/desenvolvimento/code-review.md +0 -301
- package/dist/content/content/prompts/desenvolvimento/gerar-servico.md +0 -271
- package/dist/content/content/prompts/devops/docker-compose.md +0 -336
- package/dist/content/content/prompts/devops/feature-flags.md +0 -374
- package/dist/content/content/prompts/devops/kubernetes-deploy.md +0 -460
- package/dist/content/content/prompts/devops/pipeline-cicd.md +0 -358
- package/dist/content/content/prompts/devops/terraform-iac.md +0 -502
- package/dist/content/content/prompts/escalabilidade/analise-performance.md +0 -240
- package/dist/content/content/prompts/escalabilidade/analise-performance.txt +0 -94
- package/dist/content/content/prompts/escalabilidade/caching.md +0 -255
- package/dist/content/content/prompts/observabilidade/chaos-testing.md +0 -237
- package/dist/content/content/prompts/observabilidade/estrategia-observabilidade.md +0 -263
- package/dist/content/content/prompts/observabilidade/estrategia-observabilidade.txt +0 -134
- package/dist/content/content/prompts/observabilidade/slos.md +0 -215
- package/dist/content/content/prompts/produto/discovery-inicial.md +0 -203
- package/dist/content/content/prompts/produto/discovery-inicial.txt +0 -33
- package/dist/content/content/prompts/requisitos/refinar-requisitos.md +0 -232
- package/dist/content/content/prompts/requisitos/refinar-requisitos.txt +0 -40
- package/dist/content/content/prompts/seguranca/analise-seguranca.md +0 -243
- package/dist/content/content/prompts/seguranca/pentest-checklist.md +0 -333
- package/dist/content/content/prompts/seguranca/rate-limiting.md +0 -356
- package/dist/content/content/prompts/seguranca/revisao-lgpd.md +0 -227
- package/dist/content/content/prompts/seguranca/threat-modeling.md +0 -224
- package/dist/content/content/prompts/testes/contract-testing.md +0 -340
- package/dist/content/content/prompts/testes/gerar-testes-unitarios.md +0 -474
- package/dist/content/content/prompts/testes/testes-e2e.md +0 -460
- package/dist/content/content/prompts/testes/testes-integracao.md +0 -418
- package/dist/content/content/prompts/testes/testes-performance.md +0 -458
- package/dist/content/content/prompts/ux/gerar-ui-stitch.md +0 -151
- package/dist/content/content/rules/GEMINI.md +0 -841
- package/dist/content/content/rules/RULES.md +0 -835
- package/dist/content/content/rules/adapters/copilot.md +0 -10
- package/dist/content/content/rules/adapters/cursor.md +0 -10
- package/dist/content/content/rules/adapters/gemini.md +0 -13
- package/dist/content/content/rules/adapters/windsurf.md +0 -10
- package/dist/content/content/skills/api-patterns/SKILL.md +0 -81
- package/dist/content/content/skills/api-patterns/api-style.md +0 -42
- package/dist/content/content/skills/api-patterns/auth.md +0 -24
- package/dist/content/content/skills/api-patterns/documentation.md +0 -26
- package/dist/content/content/skills/api-patterns/graphql.md +0 -41
- package/dist/content/content/skills/api-patterns/rate-limiting.md +0 -31
- package/dist/content/content/skills/api-patterns/response.md +0 -37
- package/dist/content/content/skills/api-patterns/rest.md +0 -40
- package/dist/content/content/skills/api-patterns/scripts/api_validator.py +0 -211
- package/dist/content/content/skills/api-patterns/security-testing.md +0 -122
- package/dist/content/content/skills/api-patterns/trpc.md +0 -41
- package/dist/content/content/skills/api-patterns/versioning.md +0 -22
- package/dist/content/content/skills/app-builder/SKILL.md +0 -75
- package/dist/content/content/skills/app-builder/agent-coordination.md +0 -71
- package/dist/content/content/skills/app-builder/feature-building.md +0 -53
- package/dist/content/content/skills/app-builder/project-detection.md +0 -34
- package/dist/content/content/skills/app-builder/scaffolding.md +0 -118
- package/dist/content/content/skills/app-builder/tech-stack.md +0 -40
- package/dist/content/content/skills/app-builder/templates/SKILL.md +0 -39
- package/dist/content/content/skills/app-builder/templates/astro-static/TEMPLATE.md +0 -76
- package/dist/content/content/skills/app-builder/templates/chrome-extension/TEMPLATE.md +0 -92
- package/dist/content/content/skills/app-builder/templates/cli-tool/TEMPLATE.md +0 -88
- package/dist/content/content/skills/app-builder/templates/electron-desktop/TEMPLATE.md +0 -88
- package/dist/content/content/skills/app-builder/templates/express-api/TEMPLATE.md +0 -83
- package/dist/content/content/skills/app-builder/templates/flutter-app/TEMPLATE.md +0 -90
- package/dist/content/content/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +0 -90
- package/dist/content/content/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +0 -82
- package/dist/content/content/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +0 -100
- package/dist/content/content/skills/app-builder/templates/nextjs-static/TEMPLATE.md +0 -106
- package/dist/content/content/skills/app-builder/templates/nuxt-app/TEMPLATE.md +0 -101
- package/dist/content/content/skills/app-builder/templates/python-fastapi/TEMPLATE.md +0 -83
- package/dist/content/content/skills/app-builder/templates/react-native-app/TEMPLATE.md +0 -93
- package/dist/content/content/skills/architecture/SKILL.md +0 -55
- package/dist/content/content/skills/architecture/context-discovery.md +0 -43
- package/dist/content/content/skills/architecture/examples.md +0 -94
- package/dist/content/content/skills/architecture/pattern-selection.md +0 -68
- package/dist/content/content/skills/architecture/patterns-reference.md +0 -50
- package/dist/content/content/skills/architecture/trade-off-analysis.md +0 -77
- package/dist/content/content/skills/bash-linux/SKILL.md +0 -199
- package/dist/content/content/skills/behavioral-modes/SKILL.md +0 -242
- package/dist/content/content/skills/brainstorming/SKILL.md +0 -163
- package/dist/content/content/skills/brainstorming/dynamic-questioning.md +0 -350
- package/dist/content/content/skills/clean-code/SKILL.md +0 -201
- package/dist/content/content/skills/code-review-checklist/SKILL.md +0 -109
- package/dist/content/content/skills/database-design/SKILL.md +0 -52
- package/dist/content/content/skills/database-design/database-selection.md +0 -43
- package/dist/content/content/skills/database-design/indexing.md +0 -39
- package/dist/content/content/skills/database-design/migrations.md +0 -48
- package/dist/content/content/skills/database-design/optimization.md +0 -36
- package/dist/content/content/skills/database-design/orm-selection.md +0 -30
- package/dist/content/content/skills/database-design/schema-design.md +0 -56
- package/dist/content/content/skills/database-design/scripts/schema_validator.py +0 -172
- package/dist/content/content/skills/deployment-procedures/SKILL.md +0 -241
- package/dist/content/content/skills/doc.md +0 -177
- package/dist/content/content/skills/documentation-templates/SKILL.md +0 -194
- package/dist/content/content/skills/frontend-design/SKILL.md +0 -396
- package/dist/content/content/skills/frontend-design/animation-guide.md +0 -331
- package/dist/content/content/skills/frontend-design/color-system.md +0 -311
- package/dist/content/content/skills/frontend-design/decision-trees.md +0 -418
- package/dist/content/content/skills/frontend-design/motion-graphics.md +0 -306
- package/dist/content/content/skills/frontend-design/scripts/accessibility_checker.py +0 -183
- package/dist/content/content/skills/frontend-design/scripts/ux_audit.py +0 -722
- package/dist/content/content/skills/frontend-design/typography-system.md +0 -345
- package/dist/content/content/skills/frontend-design/ux-psychology.md +0 -541
- package/dist/content/content/skills/frontend-design/visual-effects.md +0 -383
- package/dist/content/content/skills/game-development/2d-games/SKILL.md +0 -119
- package/dist/content/content/skills/game-development/3d-games/SKILL.md +0 -135
- package/dist/content/content/skills/game-development/SKILL.md +0 -167
- package/dist/content/content/skills/game-development/game-art/SKILL.md +0 -185
- package/dist/content/content/skills/game-development/game-audio/SKILL.md +0 -190
- package/dist/content/content/skills/game-development/game-design/SKILL.md +0 -129
- package/dist/content/content/skills/game-development/mobile-games/SKILL.md +0 -108
- package/dist/content/content/skills/game-development/multiplayer/SKILL.md +0 -132
- package/dist/content/content/skills/game-development/pc-games/SKILL.md +0 -144
- package/dist/content/content/skills/game-development/vr-ar/SKILL.md +0 -123
- package/dist/content/content/skills/game-development/web-games/SKILL.md +0 -150
- package/dist/content/content/skills/geo-fundamentals/SKILL.md +0 -156
- package/dist/content/content/skills/geo-fundamentals/scripts/geo_checker.py +0 -289
- package/dist/content/content/skills/i18n-localization/SKILL.md +0 -154
- package/dist/content/content/skills/i18n-localization/scripts/i18n_checker.py +0 -241
- package/dist/content/content/skills/intelligent-routing/SKILL.md +0 -334
- package/dist/content/content/skills/lint-and-validate/SKILL.md +0 -45
- package/dist/content/content/skills/lint-and-validate/scripts/lint_runner.py +0 -172
- package/dist/content/content/skills/lint-and-validate/scripts/type_coverage.py +0 -173
- package/dist/content/content/skills/mcp-builder/SKILL.md +0 -176
- package/dist/content/content/skills/mobile-design/SKILL.md +0 -394
- package/dist/content/content/skills/mobile-design/decision-trees.md +0 -516
- package/dist/content/content/skills/mobile-design/mobile-backend.md +0 -491
- package/dist/content/content/skills/mobile-design/mobile-color-system.md +0 -420
- package/dist/content/content/skills/mobile-design/mobile-debugging.md +0 -122
- package/dist/content/content/skills/mobile-design/mobile-design-thinking.md +0 -357
- package/dist/content/content/skills/mobile-design/mobile-navigation.md +0 -458
- package/dist/content/content/skills/mobile-design/mobile-performance.md +0 -767
- package/dist/content/content/skills/mobile-design/mobile-testing.md +0 -356
- package/dist/content/content/skills/mobile-design/mobile-typography.md +0 -433
- package/dist/content/content/skills/mobile-design/platform-android.md +0 -666
- package/dist/content/content/skills/mobile-design/platform-ios.md +0 -561
- package/dist/content/content/skills/mobile-design/scripts/mobile_audit.py +0 -670
- package/dist/content/content/skills/mobile-design/touch-psychology.md +0 -537
- package/dist/content/content/skills/nextjs-best-practices/SKILL.md +0 -203
- package/dist/content/content/skills/nodejs-best-practices/SKILL.md +0 -333
- package/dist/content/content/skills/parallel-agents/SKILL.md +0 -175
- package/dist/content/content/skills/performance-profiling/SKILL.md +0 -143
- package/dist/content/content/skills/performance-profiling/scripts/lighthouse_audit.py +0 -76
- package/dist/content/content/skills/plan-writing/SKILL.md +0 -152
- package/dist/content/content/skills/powershell-windows/SKILL.md +0 -167
- package/dist/content/content/skills/python-patterns/SKILL.md +0 -441
- package/dist/content/content/skills/react-patterns/SKILL.md +0 -198
- package/dist/content/content/skills/red-team-tactics/SKILL.md +0 -199
- package/dist/content/content/skills/seo-fundamentals/SKILL.md +0 -129
- package/dist/content/content/skills/seo-fundamentals/scripts/seo_checker.py +0 -219
- package/dist/content/content/skills/server-management/SKILL.md +0 -161
- package/dist/content/content/skills/systematic-debugging/SKILL.md +0 -109
- package/dist/content/content/skills/tailwind-patterns/SKILL.md +0 -269
- package/dist/content/content/skills/tdd-workflow/SKILL.md +0 -149
- package/dist/content/content/skills/testing-patterns/SKILL.md +0 -178
- package/dist/content/content/skills/testing-patterns/scripts/test_runner.py +0 -219
- package/dist/content/content/skills/vulnerability-scanner/SKILL.md +0 -276
- package/dist/content/content/skills/vulnerability-scanner/checklists.md +0 -121
- package/dist/content/content/skills/vulnerability-scanner/scripts/security_scan.py +0 -458
- package/dist/content/content/skills/webapp-testing/SKILL.md +0 -187
- package/dist/content/content/skills/webapp-testing/scripts/playwright_runner.py +0 -173
- package/dist/content/content/specialists/Especialista em Acessibilidade.md +0 -266
- package/dist/content/content/specialists/Especialista em An/303/241lise de Testes.md" +0 -434
- package/dist/content/content/specialists/Especialista em Arquitetura Avan/303/247ada.md" +0 -358
- package/dist/content/content/specialists/Especialista em Arquitetura de Software.md +0 -177
- package/dist/content/content/specialists/Especialista em Banco de Dados.md +0 -260
- package/dist/content/content/specialists/Especialista em Contrato de API.md +0 -172
- package/dist/content/content/specialists/Especialista em Dados e Analytics com IA.md +0 -246
- package/dist/content/content/specialists/Especialista em Debugging e Troubleshooting.md +0 -191
- package/dist/content/content/specialists/Especialista em Desenvolvimento Frontend.md +0 -477
- package/dist/content/content/specialists/Especialista em Desenvolvimento Mobile.md +0 -241
- package/dist/content/content/specialists/Especialista em Desenvolvimento e Vibe Coding Estruturado.md +0 -417
- package/dist/content/content/specialists/Especialista em DevOps e Infraestrutura.md +0 -294
- package/dist/content/content/specialists/Especialista em Documenta/303/247/303/243o T/303/251cnica.md" +0 -227
- package/dist/content/content/specialists/Especialista em Engenharia de Requisitos com IA.md +0 -299
- package/dist/content/content/specialists/Especialista em Explora/303/247/303/243o de Codebase.md" +0 -179
- package/dist/content/content/specialists/Especialista em Gest/303/243o de Produto.md" +0 -179
- package/dist/content/content/specialists/Especialista em Migra/303/247/303/243o e Moderniza/303/247/303/243o.md" +0 -410
- package/dist/content/content/specialists/Especialista em Modelagem e Arquitetura de Dom/303/255nio com IA.md" +0 -248
- package/dist/content/content/specialists/Especialista em Observabilidade.md +0 -415
- package/dist/content/content/specialists/Especialista em Performance e Escalabilidade.md +0 -373
- package/dist/content/content/specialists/Especialista em Plano de Execu/303/247/303/243o com IA.md" +0 -341
- package/dist/content/content/specialists/Especialista em Prototipagem R/303/241pida com Google Stitch.md" +0 -419
- package/dist/content/content/specialists/Especialista em Seguran/303/247a da Informa/303/247/303/243o.md" +0 -508
- package/dist/content/content/specialists/Especialista em UX Design.md +0 -453
- package/dist/content/content/specialists/INDEX.md +0 -43
- package/dist/content/content/templates/PRD.md +0 -165
- package/dist/content/content/templates/README.md +0 -65
- package/dist/content/content/templates/adr.md +0 -103
- package/dist/content/content/templates/arquitetura.md +0 -279
- package/dist/content/content/templates/backlog.md +0 -185
- package/dist/content/content/templates/checklist-seguranca.md +0 -180
- package/dist/content/content/templates/contexto.md +0 -120
- package/dist/content/content/templates/criterios-aceite.md +0 -99
- package/dist/content/content/templates/design-banco.md +0 -270
- package/dist/content/content/templates/design-doc.md +0 -240
- package/dist/content/content/templates/feature.md +0 -88
- package/dist/content/content/templates/historia-backend.md +0 -84
- package/dist/content/content/templates/historia-frontend.md +0 -75
- package/dist/content/content/templates/historia-usuario.md +0 -125
- package/dist/content/content/templates/mapa-navegacao.md +0 -133
- package/dist/content/content/templates/matriz-rastreabilidade.md +0 -121
- package/dist/content/content/templates/modelo-dominio.md +0 -219
- package/dist/content/content/templates/plano-testes.md +0 -199
- package/dist/content/content/templates/prototipo-stitch.md +0 -138
- package/dist/content/content/templates/requisitos.md +0 -162
- package/dist/content/content/templates/slo-sli.md +0 -197
- package/dist/content/content/workflows/README-MCP.md +0 -363
- package/dist/content/content/workflows/brainstorm.md +0 -113
- package/dist/content/content/workflows/create.md +0 -59
- package/dist/content/content/workflows/debug.md +0 -103
- package/dist/content/content/workflows/deploy.md +0 -176
- package/dist/content/content/workflows/enhance.md +0 -63
- package/dist/content/content/workflows/mcp-debug.md +0 -506
- package/dist/content/content/workflows/mcp-feature.md +0 -385
- package/dist/content/content/workflows/mcp-gate.md +0 -413
- package/dist/content/content/workflows/mcp-next.md +0 -388
- package/dist/content/content/workflows/mcp-refactor.md +0 -600
- package/dist/content/content/workflows/mcp-start.md +0 -304
- package/dist/content/content/workflows/mcp-status.md +0 -400
- package/dist/content/content/workflows/orchestrate.md +0 -237
- package/dist/content/content/workflows/plan.md +0 -89
- package/dist/content/content/workflows/preview.md +0 -81
- package/dist/content/content/workflows/status.md +0 -86
- package/dist/content/content/workflows/test.md +0 -144
- package/dist/content/content/workflows/ui-ux-pro-max.md +0 -296
|
@@ -1,458 +1,458 @@
|
|
|
1
|
-
# Prompt: Testes de Performance
|
|
2
|
-
|
|
3
|
-
> **Quando usar**: Antes de ir para produção, ou ao identificar gargalos
|
|
4
|
-
> **Especialista**: [Performance e Escalabilidade](../../02-especialistas/Especialista%20em%20Performance%20e%20Escalabilidade.md)
|
|
5
|
-
> **Nível**: Médio a Complexo
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Fluxo de Contexto
|
|
10
|
-
|
|
11
|
-
Antes de usar este prompt, tenha em mãos:
|
|
12
|
-
- `docs/CONTEXTO.md` - Entendimento do projeto
|
|
13
|
-
- `docs/05-arquitetura/arquitetura.md` - Arquitetura e endpoints
|
|
14
|
-
- Requisitos de performance (SLAs/SLOs)
|
|
15
|
-
|
|
16
|
-
Após gerar, salve o resultado em:
|
|
17
|
-
- `tests/performance/` - Scripts de teste
|
|
18
|
-
- `docs/10-performance/baseline.md` - Resultados
|
|
19
|
-
|
|
20
|
-
---
|
|
21
|
-
|
|
22
|
-
## Prompt Completo
|
|
23
|
-
|
|
24
|
-
```text
|
|
25
|
-
Atue como especialista em testes de performance e load testing.
|
|
26
|
-
|
|
27
|
-
## Contexto do Projeto
|
|
28
|
-
|
|
29
|
-
[COLE O CONTEÚDO DE docs/CONTEXTO.md]
|
|
30
|
-
|
|
31
|
-
## Stack Tecnológica
|
|
32
|
-
|
|
33
|
-
- Backend: [Framework/Linguagem]
|
|
34
|
-
- Banco de dados: [Tipo]
|
|
35
|
-
- Cache: [Redis/Memcached/Nenhum]
|
|
36
|
-
- Infra: [Cloud provider, região]
|
|
37
|
-
|
|
38
|
-
## Endpoints a Testar
|
|
39
|
-
|
|
40
|
-
| Endpoint | Método | Criticidade | SLA (p95) |
|
|
41
|
-
|----------|--------|-------------|-----------|
|
|
42
|
-
| /api/auth/login | POST | Alta | 200ms |
|
|
43
|
-
| /api/products | GET | Alta | 100ms |
|
|
44
|
-
| /api/orders | POST | Crítica | 500ms |
|
|
45
|
-
|
|
46
|
-
## Requisitos de Performance
|
|
47
|
-
|
|
48
|
-
- Usuários simultâneos esperados: [número]
|
|
49
|
-
- Requests por segundo (RPS): [número]
|
|
50
|
-
- Latência p95 aceitável: [ms]
|
|
51
|
-
- Latência p99 aceitável: [ms]
|
|
52
|
-
- Taxa de erro aceitável: [%]
|
|
53
|
-
|
|
54
|
-
## Ferramenta
|
|
55
|
-
|
|
56
|
-
- [ ] k6
|
|
57
|
-
- [ ] Artillery
|
|
58
|
-
- [ ] JMeter
|
|
59
|
-
- [ ] Locust
|
|
60
|
-
- [ ] Gatling
|
|
61
|
-
|
|
62
|
-
---
|
|
63
|
-
|
|
64
|
-
## Sua Missão
|
|
65
|
-
|
|
66
|
-
Gere testes de performance completos:
|
|
67
|
-
|
|
68
|
-
### 1. Estrutura do Projeto
|
|
69
|
-
|
|
70
|
-
```
|
|
71
|
-
tests/performance/
|
|
72
|
-
├── scripts/
|
|
73
|
-
│ ├── smoke.js
|
|
74
|
-
│ ├── load.js
|
|
75
|
-
│ ├── stress.js
|
|
76
|
-
│ └── soak.js
|
|
77
|
-
├── scenarios/
|
|
78
|
-
│ ├── auth-flow.js
|
|
79
|
-
│ └── checkout-flow.js
|
|
80
|
-
├── lib/
|
|
81
|
-
│ ├── helpers.js
|
|
82
|
-
│ └── config.js
|
|
83
|
-
├── data/
|
|
84
|
-
│ └── users.csv
|
|
85
|
-
└── results/
|
|
86
|
-
└── .gitkeep
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
### 2. Configuração Base (k6)
|
|
90
|
-
|
|
91
|
-
```javascript
|
|
92
|
-
// lib/config.js
|
|
93
|
-
export const BASE_URL = __ENV.BASE_URL || 'http://localhost:3000';
|
|
94
|
-
|
|
95
|
-
export const thresholds = {
|
|
96
|
-
http_req_duration: ['p(95)<200', 'p(99)<500'],
|
|
97
|
-
http_req_failed: ['rate<0.01'], // < 1% de erro
|
|
98
|
-
http_reqs: ['rate>100'], // > 100 RPS
|
|
99
|
-
};
|
|
100
|
-
|
|
101
|
-
export const defaultHeaders = {
|
|
102
|
-
'Content-Type': 'application/json',
|
|
103
|
-
'Accept': 'application/json',
|
|
104
|
-
};
|
|
105
|
-
|
|
106
|
-
// lib/helpers.js
|
|
107
|
-
import http from 'k6/http';
|
|
108
|
-
import { check, sleep } from 'k6';
|
|
109
|
-
import { BASE_URL, defaultHeaders } from './config.js';
|
|
110
|
-
|
|
111
|
-
export function login(email, password) {
|
|
112
|
-
const res = http.post(
|
|
113
|
-
`${BASE_URL}/api/auth/login`,
|
|
114
|
-
JSON.stringify({ email, password }),
|
|
115
|
-
{ headers: defaultHeaders }
|
|
116
|
-
);
|
|
117
|
-
|
|
118
|
-
check(res, {
|
|
119
|
-
'login successful': (r) => r.status === 200,
|
|
120
|
-
'has token': (r) => r.json('token') !== undefined,
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
return res.json('token');
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
export function authenticatedRequest(token) {
|
|
127
|
-
return {
|
|
128
|
-
...defaultHeaders,
|
|
129
|
-
'Authorization': `Bearer ${token}`,
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
### 3. Smoke Test (Verificação Básica)
|
|
135
|
-
|
|
136
|
-
```javascript
|
|
137
|
-
// scripts/smoke.js
|
|
138
|
-
import http from 'k6/http';
|
|
139
|
-
import { check, sleep } from 'k6';
|
|
140
|
-
import { BASE_URL } from '../lib/config.js';
|
|
141
|
-
import { login } from '../lib/helpers.js';
|
|
142
|
-
|
|
143
|
-
export const options = {
|
|
144
|
-
vus: 1,
|
|
145
|
-
duration: '1m',
|
|
146
|
-
thresholds: {
|
|
147
|
-
http_req_duration: ['p(99)<1500'],
|
|
148
|
-
http_req_failed: ['rate<0.05'],
|
|
149
|
-
},
|
|
150
|
-
};
|
|
151
|
-
|
|
152
|
-
export default function () {
|
|
153
|
-
// Health check
|
|
154
|
-
let res = http.get(`${BASE_URL}/api/health`);
|
|
155
|
-
check(res, {
|
|
156
|
-
'health check ok': (r) => r.status === 200,
|
|
157
|
-
});
|
|
158
|
-
|
|
159
|
-
// Login
|
|
160
|
-
const token = login('test@example.com', 'Test123!');
|
|
161
|
-
|
|
162
|
-
// Endpoint protegido
|
|
163
|
-
res = http.get(`${BASE_URL}/api/me`, {
|
|
164
|
-
headers: { Authorization: `Bearer ${token}` },
|
|
165
|
-
});
|
|
166
|
-
check(res, {
|
|
167
|
-
'authenticated request ok': (r) => r.status === 200,
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
sleep(1);
|
|
171
|
-
}
|
|
172
|
-
```
|
|
173
|
-
|
|
174
|
-
### 4. Load Test (Carga Normal)
|
|
175
|
-
|
|
176
|
-
```javascript
|
|
177
|
-
// scripts/load.js
|
|
178
|
-
import http from 'k6/http';
|
|
179
|
-
import { check, sleep, group } from 'k6';
|
|
180
|
-
import { Counter, Trend } from 'k6/metrics';
|
|
181
|
-
import { BASE_URL, thresholds, defaultHeaders } from '../lib/config.js';
|
|
182
|
-
import { login, authenticatedRequest } from '../lib/helpers.js';
|
|
183
|
-
|
|
184
|
-
// Custom metrics
|
|
185
|
-
const ordersCreated = new Counter('orders_created');
|
|
186
|
-
const orderDuration = new Trend('order_duration');
|
|
187
|
-
|
|
188
|
-
export const options = {
|
|
189
|
-
stages: [
|
|
190
|
-
{ duration: '2m', target: 50 }, // Ramp up
|
|
191
|
-
{ duration: '5m', target: 50 }, // Stay at 50 VUs
|
|
192
|
-
{ duration: '2m', target: 100 }, // Ramp up more
|
|
193
|
-
{ duration: '5m', target: 100 }, // Stay at 100 VUs
|
|
194
|
-
{ duration: '2m', target: 0 }, // Ramp down
|
|
195
|
-
],
|
|
196
|
-
thresholds: {
|
|
197
|
-
http_req_duration: ['p(95)<200', 'p(99)<500'],
|
|
198
|
-
http_req_failed: ['rate<0.01'],
|
|
199
|
-
orders_created: ['count>100'],
|
|
200
|
-
order_duration: ['p(95)<1000'],
|
|
201
|
-
},
|
|
202
|
-
};
|
|
203
|
-
|
|
204
|
-
export function setup() {
|
|
205
|
-
// Preparar dados de teste
|
|
206
|
-
const token = login('loadtest@example.com', 'Test123!');
|
|
207
|
-
return { token };
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
export default function (data) {
|
|
211
|
-
const headers = authenticatedRequest(data.token);
|
|
212
|
-
|
|
213
|
-
group('browsing', () => {
|
|
214
|
-
// Listar produtos
|
|
215
|
-
let res = http.get(`${BASE_URL}/api/products`, { headers });
|
|
216
|
-
check(res, {
|
|
217
|
-
'products loaded': (r) => r.status === 200,
|
|
218
|
-
'has products': (r) => r.json('data').length > 0,
|
|
219
|
-
});
|
|
220
|
-
|
|
221
|
-
sleep(Math.random() * 2); // Think time
|
|
222
|
-
|
|
223
|
-
// Ver detalhes
|
|
224
|
-
res = http.get(`${BASE_URL}/api/products/1`, { headers });
|
|
225
|
-
check(res, { 'product detail ok': (r) => r.status === 200 });
|
|
226
|
-
});
|
|
227
|
-
|
|
228
|
-
group('checkout', () => {
|
|
229
|
-
const start = Date.now();
|
|
230
|
-
|
|
231
|
-
// Criar pedido
|
|
232
|
-
const orderData = {
|
|
233
|
-
items: [{ productId: 1, quantity: 1 }],
|
|
234
|
-
addressId: 1,
|
|
235
|
-
};
|
|
236
|
-
|
|
237
|
-
const res = http.post(
|
|
238
|
-
`${BASE_URL}/api/orders`,
|
|
239
|
-
JSON.stringify(orderData),
|
|
240
|
-
{ headers }
|
|
241
|
-
);
|
|
242
|
-
|
|
243
|
-
const success = check(res, {
|
|
244
|
-
'order created': (r) => r.status === 201,
|
|
245
|
-
});
|
|
246
|
-
|
|
247
|
-
if (success) {
|
|
248
|
-
ordersCreated.add(1);
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
orderDuration.add(Date.now() - start);
|
|
252
|
-
});
|
|
253
|
-
|
|
254
|
-
sleep(1);
|
|
255
|
-
}
|
|
256
|
-
```
|
|
257
|
-
|
|
258
|
-
### 5. Stress Test (Encontrar Limite)
|
|
259
|
-
|
|
260
|
-
```javascript
|
|
261
|
-
// scripts/stress.js
|
|
262
|
-
import http from 'k6/http';
|
|
263
|
-
import { check, sleep } from 'k6';
|
|
264
|
-
import { BASE_URL } from '../lib/config.js';
|
|
265
|
-
|
|
266
|
-
export const options = {
|
|
267
|
-
stages: [
|
|
268
|
-
{ duration: '2m', target: 100 },
|
|
269
|
-
{ duration: '5m', target: 100 },
|
|
270
|
-
{ duration: '2m', target: 200 },
|
|
271
|
-
{ duration: '5m', target: 200 },
|
|
272
|
-
{ duration: '2m', target: 300 }, // Acima do esperado
|
|
273
|
-
{ duration: '5m', target: 300 },
|
|
274
|
-
{ duration: '2m', target: 400 }, // Estressar
|
|
275
|
-
{ duration: '5m', target: 400 },
|
|
276
|
-
{ duration: '10m', target: 0 }, // Recovery
|
|
277
|
-
],
|
|
278
|
-
thresholds: {
|
|
279
|
-
http_req_duration: ['p(95)<500'], // Mais tolerante
|
|
280
|
-
http_req_failed: ['rate<0.10'], // Até 10% de erro
|
|
281
|
-
},
|
|
282
|
-
};
|
|
283
|
-
|
|
284
|
-
export default function () {
|
|
285
|
-
const res = http.get(`${BASE_URL}/api/products`);
|
|
286
|
-
check(res, {
|
|
287
|
-
'status is 200 or 503': (r) => [200, 503].includes(r.status),
|
|
288
|
-
});
|
|
289
|
-
sleep(0.5);
|
|
290
|
-
}
|
|
291
|
-
```
|
|
292
|
-
|
|
293
|
-
### 6. Soak Test (Longa Duração)
|
|
294
|
-
|
|
295
|
-
```javascript
|
|
296
|
-
// scripts/soak.js
|
|
297
|
-
import http from 'k6/http';
|
|
298
|
-
import { check, sleep } from 'k6';
|
|
299
|
-
import { BASE_URL } from '../lib/config.js';
|
|
300
|
-
import { login, authenticatedRequest } from '../lib/helpers.js';
|
|
301
|
-
|
|
302
|
-
export const options = {
|
|
303
|
-
stages: [
|
|
304
|
-
{ duration: '5m', target: 50 }, // Ramp up
|
|
305
|
-
{ duration: '4h', target: 50 }, // 4 horas de carga constante
|
|
306
|
-
{ duration: '5m', target: 0 }, // Ramp down
|
|
307
|
-
],
|
|
308
|
-
thresholds: {
|
|
309
|
-
http_req_duration: ['p(95)<200'],
|
|
310
|
-
http_req_failed: ['rate<0.01'],
|
|
311
|
-
},
|
|
312
|
-
};
|
|
313
|
-
|
|
314
|
-
// Detecção de memory leak: monitorar métricas do servidor
|
|
315
|
-
// durante a execução deste teste
|
|
316
|
-
```
|
|
317
|
-
|
|
318
|
-
### 7. Cenário de Fluxo Realista
|
|
319
|
-
|
|
320
|
-
```javascript
|
|
321
|
-
// scenarios/checkout-flow.js
|
|
322
|
-
import http from 'k6/http';
|
|
323
|
-
import { check, sleep, group } from 'k6';
|
|
324
|
-
import { SharedArray } from 'k6/data';
|
|
325
|
-
import { BASE_URL } from '../lib/config.js';
|
|
326
|
-
|
|
327
|
-
// Carregar dados de usuários de CSV
|
|
328
|
-
const users = new SharedArray('users', function () {
|
|
329
|
-
return open('../data/users.csv').split('\n').slice(1).map(line => {
|
|
330
|
-
const [email, password] = line.split(',');
|
|
331
|
-
return { email, password };
|
|
332
|
-
});
|
|
333
|
-
});
|
|
334
|
-
|
|
335
|
-
export const options = {
|
|
336
|
-
scenarios: {
|
|
337
|
-
checkout_flow: {
|
|
338
|
-
executor: 'ramping-vus',
|
|
339
|
-
startVUs: 0,
|
|
340
|
-
stages: [
|
|
341
|
-
{ duration: '5m', target: 20 },
|
|
342
|
-
{ duration: '10m', target: 20 },
|
|
343
|
-
{ duration: '5m', target: 0 },
|
|
344
|
-
],
|
|
345
|
-
},
|
|
346
|
-
},
|
|
347
|
-
};
|
|
348
|
-
|
|
349
|
-
export default function () {
|
|
350
|
-
const user = users[Math.floor(Math.random() * users.length)];
|
|
351
|
-
|
|
352
|
-
group('1. Login', () => {
|
|
353
|
-
const res = http.post(`${BASE_URL}/api/auth/login`,
|
|
354
|
-
JSON.stringify(user),
|
|
355
|
-
{ headers: { 'Content-Type': 'application/json' } }
|
|
356
|
-
);
|
|
357
|
-
check(res, { 'login ok': (r) => r.status === 200 });
|
|
358
|
-
return res.json('token');
|
|
359
|
-
});
|
|
360
|
-
|
|
361
|
-
sleep(2); // Thinking time
|
|
362
|
-
|
|
363
|
-
group('2. Browse products', () => {
|
|
364
|
-
http.get(`${BASE_URL}/api/products`);
|
|
365
|
-
sleep(3);
|
|
366
|
-
http.get(`${BASE_URL}/api/products/featured`);
|
|
367
|
-
sleep(2);
|
|
368
|
-
});
|
|
369
|
-
|
|
370
|
-
group('3. Add to cart', () => {
|
|
371
|
-
http.post(`${BASE_URL}/api/cart/items`,
|
|
372
|
-
JSON.stringify({ productId: 1, quantity: 1 })
|
|
373
|
-
);
|
|
374
|
-
sleep(1);
|
|
375
|
-
});
|
|
376
|
-
|
|
377
|
-
group('4. Checkout', () => {
|
|
378
|
-
http.get(`${BASE_URL}/api/cart`);
|
|
379
|
-
sleep(2);
|
|
380
|
-
http.post(`${BASE_URL}/api/orders`, JSON.stringify({ /* ... */ }));
|
|
381
|
-
});
|
|
382
|
-
|
|
383
|
-
sleep(5);
|
|
384
|
-
}
|
|
385
|
-
```
|
|
386
|
-
|
|
387
|
-
### 8. Análise de Resultados
|
|
388
|
-
|
|
389
|
-
```javascript
|
|
390
|
-
// handleSummary para relatório customizado
|
|
391
|
-
export function handleSummary(data) {
|
|
392
|
-
const summary = {
|
|
393
|
-
timestamp: new Date().toISOString(),
|
|
394
|
-
duration: data.state.testRunDurationMs,
|
|
395
|
-
metrics: {
|
|
396
|
-
http_reqs: data.metrics.http_reqs?.values?.count || 0,
|
|
397
|
-
http_req_duration_p95: data.metrics.http_req_duration?.values['p(95)'],
|
|
398
|
-
http_req_duration_p99: data.metrics.http_req_duration?.values['p(99)'],
|
|
399
|
-
http_req_failed_rate: data.metrics.http_req_failed?.values?.rate,
|
|
400
|
-
},
|
|
401
|
-
thresholds: data.thresholds,
|
|
402
|
-
};
|
|
403
|
-
|
|
404
|
-
return {
|
|
405
|
-
'results/summary.json': JSON.stringify(summary, null, 2),
|
|
406
|
-
'results/report.html': htmlReport(data),
|
|
407
|
-
stdout: textSummary(data, { indent: ' ', enableColors: true }),
|
|
408
|
-
};
|
|
409
|
-
}
|
|
410
|
-
```
|
|
411
|
-
|
|
412
|
-
### 9. Comandos e CI
|
|
413
|
-
|
|
414
|
-
```bash
|
|
415
|
-
# Executar testes
|
|
416
|
-
k6 run scripts/smoke.js
|
|
417
|
-
k6 run scripts/load.js --env BASE_URL=https://staging.example.com
|
|
418
|
-
k6 run scripts/stress.js --out json=results/stress.json
|
|
419
|
-
|
|
420
|
-
# Com métricas para Grafana
|
|
421
|
-
k6 run scripts/load.js --out influxdb=http://localhost:8086/k6
|
|
422
|
-
```
|
|
423
|
-
|
|
424
|
-
```yaml
|
|
425
|
-
# .github/workflows/performance.yml
|
|
426
|
-
name: Performance Tests
|
|
427
|
-
|
|
428
|
-
on:
|
|
429
|
-
workflow_dispatch:
|
|
430
|
-
schedule:
|
|
431
|
-
- cron: '0 6 * * *' # Diário às 6h
|
|
432
|
-
|
|
433
|
-
jobs:
|
|
434
|
-
load-test:
|
|
435
|
-
runs-on: ubuntu-latest
|
|
436
|
-
steps:
|
|
437
|
-
- uses: actions/checkout@v4
|
|
438
|
-
- uses: grafana/k6-action@v0.3.1
|
|
439
|
-
with:
|
|
440
|
-
filename: tests/performance/scripts/load.js
|
|
441
|
-
flags: --env BASE_URL=${{ secrets.STAGING_URL }}
|
|
442
|
-
```
|
|
443
|
-
```
|
|
444
|
-
|
|
445
|
-
---
|
|
446
|
-
|
|
447
|
-
## Checklist Pós-Geração
|
|
448
|
-
|
|
449
|
-
- [ ] Smoke test criado (verificação rápida)
|
|
450
|
-
- [ ] Load test com cenário realista
|
|
451
|
-
- [ ] Stress test para encontrar limites
|
|
452
|
-
- [ ] Soak test para detecção de leaks (opcional)
|
|
453
|
-
- [ ] Thresholds definidos (latência, erro, RPS)
|
|
454
|
-
- [ ] Custom metrics para métricas de negócio
|
|
455
|
-
- [ ] Think times realistas entre requests
|
|
456
|
-
- [ ] Dados de teste variados (CSV/JSON)
|
|
457
|
-
- [ ] handleSummary para relatórios
|
|
458
|
-
- [ ] CI configurado para execução regular
|
|
1
|
+
# Prompt: Testes de Performance
|
|
2
|
+
|
|
3
|
+
> **Quando usar**: Antes de ir para produção, ou ao identificar gargalos
|
|
4
|
+
> **Especialista**: [Performance e Escalabilidade](../../02-especialistas/Especialista%20em%20Performance%20e%20Escalabilidade.md)
|
|
5
|
+
> **Nível**: Médio a Complexo
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Fluxo de Contexto
|
|
10
|
+
|
|
11
|
+
Antes de usar este prompt, tenha em mãos:
|
|
12
|
+
- `docs/CONTEXTO.md` - Entendimento do projeto
|
|
13
|
+
- `docs/05-arquitetura/arquitetura.md` - Arquitetura e endpoints
|
|
14
|
+
- Requisitos de performance (SLAs/SLOs)
|
|
15
|
+
|
|
16
|
+
Após gerar, salve o resultado em:
|
|
17
|
+
- `tests/performance/` - Scripts de teste
|
|
18
|
+
- `docs/10-performance/baseline.md` - Resultados
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Prompt Completo
|
|
23
|
+
|
|
24
|
+
```text
|
|
25
|
+
Atue como especialista em testes de performance e load testing.
|
|
26
|
+
|
|
27
|
+
## Contexto do Projeto
|
|
28
|
+
|
|
29
|
+
[COLE O CONTEÚDO DE docs/CONTEXTO.md]
|
|
30
|
+
|
|
31
|
+
## Stack Tecnológica
|
|
32
|
+
|
|
33
|
+
- Backend: [Framework/Linguagem]
|
|
34
|
+
- Banco de dados: [Tipo]
|
|
35
|
+
- Cache: [Redis/Memcached/Nenhum]
|
|
36
|
+
- Infra: [Cloud provider, região]
|
|
37
|
+
|
|
38
|
+
## Endpoints a Testar
|
|
39
|
+
|
|
40
|
+
| Endpoint | Método | Criticidade | SLA (p95) |
|
|
41
|
+
|----------|--------|-------------|-----------|
|
|
42
|
+
| /api/auth/login | POST | Alta | 200ms |
|
|
43
|
+
| /api/products | GET | Alta | 100ms |
|
|
44
|
+
| /api/orders | POST | Crítica | 500ms |
|
|
45
|
+
|
|
46
|
+
## Requisitos de Performance
|
|
47
|
+
|
|
48
|
+
- Usuários simultâneos esperados: [número]
|
|
49
|
+
- Requests por segundo (RPS): [número]
|
|
50
|
+
- Latência p95 aceitável: [ms]
|
|
51
|
+
- Latência p99 aceitável: [ms]
|
|
52
|
+
- Taxa de erro aceitável: [%]
|
|
53
|
+
|
|
54
|
+
## Ferramenta
|
|
55
|
+
|
|
56
|
+
- [ ] k6
|
|
57
|
+
- [ ] Artillery
|
|
58
|
+
- [ ] JMeter
|
|
59
|
+
- [ ] Locust
|
|
60
|
+
- [ ] Gatling
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## Sua Missão
|
|
65
|
+
|
|
66
|
+
Gere testes de performance completos:
|
|
67
|
+
|
|
68
|
+
### 1. Estrutura do Projeto
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
tests/performance/
|
|
72
|
+
├── scripts/
|
|
73
|
+
│ ├── smoke.js
|
|
74
|
+
│ ├── load.js
|
|
75
|
+
│ ├── stress.js
|
|
76
|
+
│ └── soak.js
|
|
77
|
+
├── scenarios/
|
|
78
|
+
│ ├── auth-flow.js
|
|
79
|
+
│ └── checkout-flow.js
|
|
80
|
+
├── lib/
|
|
81
|
+
│ ├── helpers.js
|
|
82
|
+
│ └── config.js
|
|
83
|
+
├── data/
|
|
84
|
+
│ └── users.csv
|
|
85
|
+
└── results/
|
|
86
|
+
└── .gitkeep
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### 2. Configuração Base (k6)
|
|
90
|
+
|
|
91
|
+
```javascript
|
|
92
|
+
// lib/config.js
|
|
93
|
+
export const BASE_URL = __ENV.BASE_URL || 'http://localhost:3000';
|
|
94
|
+
|
|
95
|
+
export const thresholds = {
|
|
96
|
+
http_req_duration: ['p(95)<200', 'p(99)<500'],
|
|
97
|
+
http_req_failed: ['rate<0.01'], // < 1% de erro
|
|
98
|
+
http_reqs: ['rate>100'], // > 100 RPS
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
export const defaultHeaders = {
|
|
102
|
+
'Content-Type': 'application/json',
|
|
103
|
+
'Accept': 'application/json',
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
// lib/helpers.js
|
|
107
|
+
import http from 'k6/http';
|
|
108
|
+
import { check, sleep } from 'k6';
|
|
109
|
+
import { BASE_URL, defaultHeaders } from './config.js';
|
|
110
|
+
|
|
111
|
+
export function login(email, password) {
|
|
112
|
+
const res = http.post(
|
|
113
|
+
`${BASE_URL}/api/auth/login`,
|
|
114
|
+
JSON.stringify({ email, password }),
|
|
115
|
+
{ headers: defaultHeaders }
|
|
116
|
+
);
|
|
117
|
+
|
|
118
|
+
check(res, {
|
|
119
|
+
'login successful': (r) => r.status === 200,
|
|
120
|
+
'has token': (r) => r.json('token') !== undefined,
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
return res.json('token');
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export function authenticatedRequest(token) {
|
|
127
|
+
return {
|
|
128
|
+
...defaultHeaders,
|
|
129
|
+
'Authorization': `Bearer ${token}`,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### 3. Smoke Test (Verificação Básica)
|
|
135
|
+
|
|
136
|
+
```javascript
|
|
137
|
+
// scripts/smoke.js
|
|
138
|
+
import http from 'k6/http';
|
|
139
|
+
import { check, sleep } from 'k6';
|
|
140
|
+
import { BASE_URL } from '../lib/config.js';
|
|
141
|
+
import { login } from '../lib/helpers.js';
|
|
142
|
+
|
|
143
|
+
export const options = {
|
|
144
|
+
vus: 1,
|
|
145
|
+
duration: '1m',
|
|
146
|
+
thresholds: {
|
|
147
|
+
http_req_duration: ['p(99)<1500'],
|
|
148
|
+
http_req_failed: ['rate<0.05'],
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
export default function () {
|
|
153
|
+
// Health check
|
|
154
|
+
let res = http.get(`${BASE_URL}/api/health`);
|
|
155
|
+
check(res, {
|
|
156
|
+
'health check ok': (r) => r.status === 200,
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
// Login
|
|
160
|
+
const token = login('test@example.com', 'Test123!');
|
|
161
|
+
|
|
162
|
+
// Endpoint protegido
|
|
163
|
+
res = http.get(`${BASE_URL}/api/me`, {
|
|
164
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
165
|
+
});
|
|
166
|
+
check(res, {
|
|
167
|
+
'authenticated request ok': (r) => r.status === 200,
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
sleep(1);
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### 4. Load Test (Carga Normal)
|
|
175
|
+
|
|
176
|
+
```javascript
|
|
177
|
+
// scripts/load.js
|
|
178
|
+
import http from 'k6/http';
|
|
179
|
+
import { check, sleep, group } from 'k6';
|
|
180
|
+
import { Counter, Trend } from 'k6/metrics';
|
|
181
|
+
import { BASE_URL, thresholds, defaultHeaders } from '../lib/config.js';
|
|
182
|
+
import { login, authenticatedRequest } from '../lib/helpers.js';
|
|
183
|
+
|
|
184
|
+
// Custom metrics
|
|
185
|
+
const ordersCreated = new Counter('orders_created');
|
|
186
|
+
const orderDuration = new Trend('order_duration');
|
|
187
|
+
|
|
188
|
+
export const options = {
|
|
189
|
+
stages: [
|
|
190
|
+
{ duration: '2m', target: 50 }, // Ramp up
|
|
191
|
+
{ duration: '5m', target: 50 }, // Stay at 50 VUs
|
|
192
|
+
{ duration: '2m', target: 100 }, // Ramp up more
|
|
193
|
+
{ duration: '5m', target: 100 }, // Stay at 100 VUs
|
|
194
|
+
{ duration: '2m', target: 0 }, // Ramp down
|
|
195
|
+
],
|
|
196
|
+
thresholds: {
|
|
197
|
+
http_req_duration: ['p(95)<200', 'p(99)<500'],
|
|
198
|
+
http_req_failed: ['rate<0.01'],
|
|
199
|
+
orders_created: ['count>100'],
|
|
200
|
+
order_duration: ['p(95)<1000'],
|
|
201
|
+
},
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
export function setup() {
|
|
205
|
+
// Preparar dados de teste
|
|
206
|
+
const token = login('loadtest@example.com', 'Test123!');
|
|
207
|
+
return { token };
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
export default function (data) {
|
|
211
|
+
const headers = authenticatedRequest(data.token);
|
|
212
|
+
|
|
213
|
+
group('browsing', () => {
|
|
214
|
+
// Listar produtos
|
|
215
|
+
let res = http.get(`${BASE_URL}/api/products`, { headers });
|
|
216
|
+
check(res, {
|
|
217
|
+
'products loaded': (r) => r.status === 200,
|
|
218
|
+
'has products': (r) => r.json('data').length > 0,
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
sleep(Math.random() * 2); // Think time
|
|
222
|
+
|
|
223
|
+
// Ver detalhes
|
|
224
|
+
res = http.get(`${BASE_URL}/api/products/1`, { headers });
|
|
225
|
+
check(res, { 'product detail ok': (r) => r.status === 200 });
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
group('checkout', () => {
|
|
229
|
+
const start = Date.now();
|
|
230
|
+
|
|
231
|
+
// Criar pedido
|
|
232
|
+
const orderData = {
|
|
233
|
+
items: [{ productId: 1, quantity: 1 }],
|
|
234
|
+
addressId: 1,
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
const res = http.post(
|
|
238
|
+
`${BASE_URL}/api/orders`,
|
|
239
|
+
JSON.stringify(orderData),
|
|
240
|
+
{ headers }
|
|
241
|
+
);
|
|
242
|
+
|
|
243
|
+
const success = check(res, {
|
|
244
|
+
'order created': (r) => r.status === 201,
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
if (success) {
|
|
248
|
+
ordersCreated.add(1);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
orderDuration.add(Date.now() - start);
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
sleep(1);
|
|
255
|
+
}
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### 5. Stress Test (Encontrar Limite)
|
|
259
|
+
|
|
260
|
+
```javascript
|
|
261
|
+
// scripts/stress.js
|
|
262
|
+
import http from 'k6/http';
|
|
263
|
+
import { check, sleep } from 'k6';
|
|
264
|
+
import { BASE_URL } from '../lib/config.js';
|
|
265
|
+
|
|
266
|
+
export const options = {
|
|
267
|
+
stages: [
|
|
268
|
+
{ duration: '2m', target: 100 },
|
|
269
|
+
{ duration: '5m', target: 100 },
|
|
270
|
+
{ duration: '2m', target: 200 },
|
|
271
|
+
{ duration: '5m', target: 200 },
|
|
272
|
+
{ duration: '2m', target: 300 }, // Acima do esperado
|
|
273
|
+
{ duration: '5m', target: 300 },
|
|
274
|
+
{ duration: '2m', target: 400 }, // Estressar
|
|
275
|
+
{ duration: '5m', target: 400 },
|
|
276
|
+
{ duration: '10m', target: 0 }, // Recovery
|
|
277
|
+
],
|
|
278
|
+
thresholds: {
|
|
279
|
+
http_req_duration: ['p(95)<500'], // Mais tolerante
|
|
280
|
+
http_req_failed: ['rate<0.10'], // Até 10% de erro
|
|
281
|
+
},
|
|
282
|
+
};
|
|
283
|
+
|
|
284
|
+
export default function () {
|
|
285
|
+
const res = http.get(`${BASE_URL}/api/products`);
|
|
286
|
+
check(res, {
|
|
287
|
+
'status is 200 or 503': (r) => [200, 503].includes(r.status),
|
|
288
|
+
});
|
|
289
|
+
sleep(0.5);
|
|
290
|
+
}
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
### 6. Soak Test (Longa Duração)
|
|
294
|
+
|
|
295
|
+
```javascript
|
|
296
|
+
// scripts/soak.js
|
|
297
|
+
import http from 'k6/http';
|
|
298
|
+
import { check, sleep } from 'k6';
|
|
299
|
+
import { BASE_URL } from '../lib/config.js';
|
|
300
|
+
import { login, authenticatedRequest } from '../lib/helpers.js';
|
|
301
|
+
|
|
302
|
+
export const options = {
|
|
303
|
+
stages: [
|
|
304
|
+
{ duration: '5m', target: 50 }, // Ramp up
|
|
305
|
+
{ duration: '4h', target: 50 }, // 4 horas de carga constante
|
|
306
|
+
{ duration: '5m', target: 0 }, // Ramp down
|
|
307
|
+
],
|
|
308
|
+
thresholds: {
|
|
309
|
+
http_req_duration: ['p(95)<200'],
|
|
310
|
+
http_req_failed: ['rate<0.01'],
|
|
311
|
+
},
|
|
312
|
+
};
|
|
313
|
+
|
|
314
|
+
// Detecção de memory leak: monitorar métricas do servidor
|
|
315
|
+
// durante a execução deste teste
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
### 7. Cenário de Fluxo Realista
|
|
319
|
+
|
|
320
|
+
```javascript
|
|
321
|
+
// scenarios/checkout-flow.js
|
|
322
|
+
import http from 'k6/http';
|
|
323
|
+
import { check, sleep, group } from 'k6';
|
|
324
|
+
import { SharedArray } from 'k6/data';
|
|
325
|
+
import { BASE_URL } from '../lib/config.js';
|
|
326
|
+
|
|
327
|
+
// Carregar dados de usuários de CSV
|
|
328
|
+
const users = new SharedArray('users', function () {
|
|
329
|
+
return open('../data/users.csv').split('\n').slice(1).map(line => {
|
|
330
|
+
const [email, password] = line.split(',');
|
|
331
|
+
return { email, password };
|
|
332
|
+
});
|
|
333
|
+
});
|
|
334
|
+
|
|
335
|
+
export const options = {
|
|
336
|
+
scenarios: {
|
|
337
|
+
checkout_flow: {
|
|
338
|
+
executor: 'ramping-vus',
|
|
339
|
+
startVUs: 0,
|
|
340
|
+
stages: [
|
|
341
|
+
{ duration: '5m', target: 20 },
|
|
342
|
+
{ duration: '10m', target: 20 },
|
|
343
|
+
{ duration: '5m', target: 0 },
|
|
344
|
+
],
|
|
345
|
+
},
|
|
346
|
+
},
|
|
347
|
+
};
|
|
348
|
+
|
|
349
|
+
export default function () {
|
|
350
|
+
const user = users[Math.floor(Math.random() * users.length)];
|
|
351
|
+
|
|
352
|
+
group('1. Login', () => {
|
|
353
|
+
const res = http.post(`${BASE_URL}/api/auth/login`,
|
|
354
|
+
JSON.stringify(user),
|
|
355
|
+
{ headers: { 'Content-Type': 'application/json' } }
|
|
356
|
+
);
|
|
357
|
+
check(res, { 'login ok': (r) => r.status === 200 });
|
|
358
|
+
return res.json('token');
|
|
359
|
+
});
|
|
360
|
+
|
|
361
|
+
sleep(2); // Thinking time
|
|
362
|
+
|
|
363
|
+
group('2. Browse products', () => {
|
|
364
|
+
http.get(`${BASE_URL}/api/products`);
|
|
365
|
+
sleep(3);
|
|
366
|
+
http.get(`${BASE_URL}/api/products/featured`);
|
|
367
|
+
sleep(2);
|
|
368
|
+
});
|
|
369
|
+
|
|
370
|
+
group('3. Add to cart', () => {
|
|
371
|
+
http.post(`${BASE_URL}/api/cart/items`,
|
|
372
|
+
JSON.stringify({ productId: 1, quantity: 1 })
|
|
373
|
+
);
|
|
374
|
+
sleep(1);
|
|
375
|
+
});
|
|
376
|
+
|
|
377
|
+
group('4. Checkout', () => {
|
|
378
|
+
http.get(`${BASE_URL}/api/cart`);
|
|
379
|
+
sleep(2);
|
|
380
|
+
http.post(`${BASE_URL}/api/orders`, JSON.stringify({ /* ... */ }));
|
|
381
|
+
});
|
|
382
|
+
|
|
383
|
+
sleep(5);
|
|
384
|
+
}
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
### 8. Análise de Resultados
|
|
388
|
+
|
|
389
|
+
```javascript
|
|
390
|
+
// handleSummary para relatório customizado
|
|
391
|
+
export function handleSummary(data) {
|
|
392
|
+
const summary = {
|
|
393
|
+
timestamp: new Date().toISOString(),
|
|
394
|
+
duration: data.state.testRunDurationMs,
|
|
395
|
+
metrics: {
|
|
396
|
+
http_reqs: data.metrics.http_reqs?.values?.count || 0,
|
|
397
|
+
http_req_duration_p95: data.metrics.http_req_duration?.values['p(95)'],
|
|
398
|
+
http_req_duration_p99: data.metrics.http_req_duration?.values['p(99)'],
|
|
399
|
+
http_req_failed_rate: data.metrics.http_req_failed?.values?.rate,
|
|
400
|
+
},
|
|
401
|
+
thresholds: data.thresholds,
|
|
402
|
+
};
|
|
403
|
+
|
|
404
|
+
return {
|
|
405
|
+
'results/summary.json': JSON.stringify(summary, null, 2),
|
|
406
|
+
'results/report.html': htmlReport(data),
|
|
407
|
+
stdout: textSummary(data, { indent: ' ', enableColors: true }),
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
### 9. Comandos e CI
|
|
413
|
+
|
|
414
|
+
```bash
|
|
415
|
+
# Executar testes
|
|
416
|
+
k6 run scripts/smoke.js
|
|
417
|
+
k6 run scripts/load.js --env BASE_URL=https://staging.example.com
|
|
418
|
+
k6 run scripts/stress.js --out json=results/stress.json
|
|
419
|
+
|
|
420
|
+
# Com métricas para Grafana
|
|
421
|
+
k6 run scripts/load.js --out influxdb=http://localhost:8086/k6
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
```yaml
|
|
425
|
+
# .github/workflows/performance.yml
|
|
426
|
+
name: Performance Tests
|
|
427
|
+
|
|
428
|
+
on:
|
|
429
|
+
workflow_dispatch:
|
|
430
|
+
schedule:
|
|
431
|
+
- cron: '0 6 * * *' # Diário às 6h
|
|
432
|
+
|
|
433
|
+
jobs:
|
|
434
|
+
load-test:
|
|
435
|
+
runs-on: ubuntu-latest
|
|
436
|
+
steps:
|
|
437
|
+
- uses: actions/checkout@v4
|
|
438
|
+
- uses: grafana/k6-action@v0.3.1
|
|
439
|
+
with:
|
|
440
|
+
filename: tests/performance/scripts/load.js
|
|
441
|
+
flags: --env BASE_URL=${{ secrets.STAGING_URL }}
|
|
442
|
+
```
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
---
|
|
446
|
+
|
|
447
|
+
## Checklist Pós-Geração
|
|
448
|
+
|
|
449
|
+
- [ ] Smoke test criado (verificação rápida)
|
|
450
|
+
- [ ] Load test com cenário realista
|
|
451
|
+
- [ ] Stress test para encontrar limites
|
|
452
|
+
- [ ] Soak test para detecção de leaks (opcional)
|
|
453
|
+
- [ ] Thresholds definidos (latência, erro, RPS)
|
|
454
|
+
- [ ] Custom metrics para métricas de negócio
|
|
455
|
+
- [ ] Think times realistas entre requests
|
|
456
|
+
- [ ] Dados de teste variados (CSV/JSON)
|
|
457
|
+
- [ ] handleSummary para relatórios
|
|
458
|
+
- [ ] CI configurado para execução regular
|