\chapter{Metodolog\'ia} \label{ch:metodologia} \section{Tipos de prueba} \begin{enumerate} \item \textbf{Unitarias} --- pytest (agent y API bot). \item \textbf{Humo / funcional} --- curl y checks HTTP del gateway. \item \textbf{Carga} --- k6 perfil \texttt{shared8g}. \item \textbf{Capacidad} --- modelo anal\'itico (no carga de 100k PDFs). \end{enumerate} \section{Herramientas} k6 (Grafana), pytest, Docker stats, curl, pdflatex/pgfplots. \section{SLOs perfil \texttt{shared8g}} \begin{itemize} \item Gateway \texttt{/health/live}: p95 $<$500\,ms; fail $<$1\,\%. \item Heartbeats bot: p95 $<$800\,ms; checks $>$95\,\%. \item No usar \texttt{/health} agregado como SLO de latencia. \end{itemize} \section{Comandos representativos} \begin{lstlisting}[language=bash] k6 run -e PROFILE=shared8g -e BASE_URL=http://127.0.0.1:8189 \ k6_gateway_health.js k6 run -e PROFILE=shared8g -e BOT_API_TOKEN=... \ k6_bot_heartbeats.js python -m pytest bots/bot_descarga/tests -q cd services/bot_descarga && python -m pytest tests -q \end{lstlisting}