👽
3ntr0 Apuntes
  • 📚Principios SOLID y Clean Code
    • 💲Deuda Técnica
    • 📌Mejorar Nombres
      • 📄Nombre según Tipo
      • 🚗Nombre Clases
      • ⚙️Nombres Funciones
    • ☑️Mejorar Funciones
    • ➿Principio DRY
    • 🧼Clean Code en Clases (POO)
      • 📘 Principio de Responsabilidad Única (SRP)
    • 🤮🇸 🇹 🇺 🇵 🇮 🇩 - Code Smells
      • 🚫Singleton
      • 🙏Tight Coupling
      • 🥸U P I D
      • 🚩Más Code Smells
  • 💕Angular
    • 🏍️Standalone
    • 🆚ngClass vs [class.clase]
    • 🩻Directivas
    • 🚩ElementRef
    • 🎀Decoradores
      • @HostListener
    • 🔄OnChanges
    • 🧪Testing - Jasmine y Karma
      • 🚀Módulo 1: Introducción a las pruebas unitarias
      • 🧫Módulo 2: Introducción a Jasmine
      • ⚒️Módulo 3: Introducción a Karma
      • 🔬Módulo 4: Pruebas unitarias en Angular
        • Código comentado Paso a Paso
      • 🕵️‍♂️Módulo 5: Técnicas avanzadas en Jasmine
      • 📚Módulo 6: Técnicas avanzadas en Karma
  • 🖼️HTML y CSS
    • 🖌️Custom Properties
    • Trucos
    • Brakepoints
  • 🧋Javascript
    • 🛠️Funciones
    • 📦Arrays
      • Every y Some
      • Map
      • Reduce
    • 😎Hoisting
    • 🪚Desestructuración
    • 🛻Programación Asincrona
      • 📞Callbacks
      • 🌟Promises
      • 🆚Promise.all Y Promise.any
      • 🚀Async/Await
    • Respuestas HTTP
    • 🧐Dudas Básicas
      • NodeList
      • 🧐Contextos de .this
      • 💭Parametro Rest
      • 🗨️arguments
      • 🙀JavaScript no tiene clases
      • 🆚Null vs Undefined
      • 🔎Operador in
      • 🟨Operador Spread
      • ❓Encadenamiento Opcional
      • 🔲Notación de Corchetes
      • ⛓️Coalescencia Nula (??)
      • 🆚Shallow Copy vs Deep Copy
      • 🆚.json VS JSON.parse
      • ⚙️Fetch wrapper
      • Sets
      • Maps
  • 📒Terminología
    • 💎Esenciales
    • Web
    • Javascript
  • 🌐GIT
    • Source Tree
  • 🧬React
    • 🫂Babel
  • 🔧 Fundamentos de C#
    • 🎛️General
      • 🧐Diferencia Equals y ==
      • 🧐Diferencia entre typeof y .GetType()
      • 📐Convenciones de Nomenclatura
    • 💠Summary
    • 📇.resx
    • 📄Strings
      • ⛓️Comparación de cadenas
    • 🧲Regex
    • 📦POO
      • 🚙Clases
        • ✏️Clase String
        • 📥Métodos de Acceso
        • ⚗️Métodos de Extensión
    • 🖇️Pattern Matching
    • 🚩Excepciones
    • Programación Asíncrona
    • 🔎LINQ
      • 🅿️PLINQ
  • 🌐 Desarrollo Web con ASP.NET
    • 🧬Modelos
      • 🗒️Data Annotations
        • 📑Lista
        • 🧪Atributos
          • 🛠️Atributos Personalizados
          • 🧰AttributeUsage
          • 📥Acceso a los atributos
        • 📚Documentación
    • 👷Servicios
      • ⭐Servicios Singleton
    • ⏳Sesiones
      • 🧭Temp Data
    • DbContext
      • 🔄Eager Loading
    • 🥽Manejo de Datos
      • 🗃️Archivos
        • 📤Subida de Archivos
        • ✏️Leer y Escribir
        • 🕓Manejo de Archivos Temporales
        • 🛡️Validación de Archivos en ASP.NET Core
      • Colecciones
        • 🪜Pila (Stack)
        • 🏇Cola (Queue)
      • 🩻Manejo de XMLs
        • 📂XmlDocument
          • 🎯XPath
        • 🧿XmlReader
    • ❤️Tips y Utilities
      • 🟰StringComparison
    • 🧰Debug Tools
      • 🧭Stopwatch
  • 🚀Razor
    • 🧱Configuración de Proyecto
    • 📃Pages
      • 🔸Método OnGet
      • 🔸Carpeta Models
      • 🔸Partial Pages
    • 🎨Layouts
      • Aplicar CSS A UNA PAGE
    • 🚴‍♂️Routing
    • 🏢_ViewImports
    • ✒️Sintaxis Razor
      • 😀Introducción
      • 📔Expresiones Implícitas
      • 📕Expresiones Explícitas
      • ✍️Renderizar Texto
      • 🧑‍🔬Class Page Model
      • 🔖Tag Helpers
        • 🔹asp-page
        • 🔹asp-append-version
        • 🔹asp-for
        • 🔹asp-items
        • 🔹asp-action y asp-controller
  • 🔮LUA
    • 🎯Fundamentos
    • ⌨️Entrada por Consola
    • 🔗Estructuras de Control
    • ⚒️Funciones
    • 📦Tablas
    • 📚Funciones y Librerías Estándar
    • 🦖POO
Con tecnología de GitBook
En esta página
  1. Angular
  2. Testing - Jasmine y Karma

Módulo 6: Técnicas avanzadas en Karma

🔧 6.1. Configuración personalizada del entorno de pruebas

Karma permite personalizar muchos aspectos del entorno de pruebas para adaptarse mejor a las necesidades de tu proyecto. Puedes ajustar:

  • Ejecución en múltiples navegadores: Ejecuta pruebas en distintos navegadores simultáneamente (Chrome, Firefox, Edge, etc.).

  • Headless testing: Ejecutar pruebas sin interfaz gráfica, ideal para entornos de CI/CD.

  • Ejecución selectiva de pruebas: Definir qué pruebas se ejecutarán en base a patrones de archivos.

Ejemplo de configuración en Karma para múltiples navegadores y headless:

module.exports = function (config: any) {
  config.set({
    frameworks: ["jasmine", "@angular-devkit/build-angular"], // Incluimos Jasmine y Angular
    files: ["src/**/*.spec.ts"], // Ruta de los archivos de pruebas

    // Ejecutar en múltiples navegadores
    browsers: ["Chrome", "Firefox", "Edge"],

    // Modo headless para Chrome (sin interfaz gráfica)
    customLaunchers: {
      ChromeHeadless: {
        base: "Chrome",
        flags: [
          "--headless",
          "--disable-gpu",
          "--no-sandbox",
          "--disable-dev-shm-usage",
        ],
      },
    },

    // Reportes de cobertura
    reporters: ["progress", "coverage"],
    preprocessors: {
      "src/**/*.spec.ts": ["coverage"], // Añadimos cobertura de código a los archivos de prueba
    },

    // Directorio de los reportes de cobertura
    coverageReporter: {
      type: "html",
      dir: "coverage/",
    },

    singleRun: true, // Ejecuta una sola vez y finaliza (útil en CI)
  });
};

🚀 6.2. Karma y CI/CD (Integración continua)

Karma se integra fácilmente con herramientas de CI/CD como Jenkins, GitLab CI, Travis CI o CircleCI. En estos entornos, es importante ejecutar las pruebas en modo headless para evitar la necesidad de abrir un navegador gráfico. Ejemplo de integración en GitLab CI:

Añade un archivo .gitlab-ci.yml en la raíz de tu proyecto Angular:

 image: node:16

stages:

    test

cache: paths: - node_modules/

before_script:

    npm install # Instala las dependencias

test: stage: test script: - npm run test -- --watch=false --browsers=ChromeHeadless # Ejecuta Karma en modo headless artifacts: paths: - coverage/ # Guarda los reportes de cobertura como artefacto ```
Configura Karma en modo headless en el archivo karma.conf.js:
module.exports = function(config: any) {
  config.set({
    frameworks: ['jasmine', '@angular-devkit/build-angular'],
    browsers: ['ChromeHeadless'],  // Modo headless para CI/CD
    singleRun: true,  // Ejecuta una sola vez para CI
    reporters: ['progress', 'coverage'],  // Reporte de progreso y cobertura
    coverageReporter: {
      type: 'lcov',  // Generamos reporte en formato lcov para CI
      dir: 'coverage/',
      subdir: '.',
      check: {  // Opcional: condiciones mínimas de cobertura
        global: {
          statements: 80,
          branches: 70,
          functions: 80,
          lines: 80
        }
      }
    }
  });
};

📊 6.3. Generación de reportes avanzados con Karma

Karma tiene soporte para generar reportes avanzados, que pueden ser utilizados en procesos de integración continua o para verificar la calidad del código. Algunos reportes comunes incluyen:

Cobertura de código: Generar reportes de cobertura de líneas, ramas, funciones, etc.
JUnit: Reportes en formato XML, ideales para herramientas como Jenkins.

Ejemplo de configuración de reportes en Karma:

module.exports = function(config: any) {
  config.set({
    frameworks: ['jasmine', '@angular-devkit/build-angular'],
    browsers: ['ChromeHeadless'],
    reporters: ['progress', 'coverage', 'junit'],  // Añadimos el reporte junit
    coverageReporter: {
      type: 'html',  // Genera un reporte HTML
      dir: 'coverage/',
      check: {  // Condiciones mínimas de cobertura
        global: {
          statements: 80,
          branches: 70,
          functions: 80,
          lines: 80
        }
      }
    },
    junitReporter: {
      outputDir: 'test-results',  // Carpeta para guardar los reportes JUnit
      outputFile: 'junit-report.xml',
      useBrowserName: false
    },
    singleRun: true
  });
};

🏃‍♂️ 6.4. Estrategias para acelerar las pruebas con Karma

En proyectos grandes, ejecutar todas las pruebas puede ser lento. Karma ofrece varias estrategias para acelerar las pruebas:

Ejecución paralela: Puedes configurar Karma para que ejecute las pruebas en múltiples procesos de navegador, acelerando el tiempo de ejecución.
Ejecución selectiva de pruebas: Ejecuta solo las pruebas relacionadas con los cambios recientes (útil cuando trabajas en una sección del proyecto).

Ejemplo de ejecución paralela:

module.exports = function(config: any) {
  config.set({
    frameworks: ['jasmine', '@angular-devkit/build-angular'],
    browsers: ['ChromeHeadless'],
    concurrency: 2,  // Ejecutamos pruebas en 2 navegadores al mismo tiempo
    singleRun: true,
    reporters: ['progress']
  });
};

Ejemplo de ejecución selectiva de pruebas:

Puedes utilizar patrones de archivos para ejecutar solo las pruebas necesarias. Por ejemplo, si solo deseas ejecutar las pruebas de los servicios:

module.exports = function(config: any) {
  config.set({
    frameworks: ['jasmine', '@angular-devkit/build-angular'],
    files: ['src/app/services/**/*.spec.ts'],  // Solo ejecuta pruebas en la carpeta de servicios
    browsers: ['ChromeHeadless'],
    singleRun: true
  });
};
AnteriorMódulo 5: Técnicas avanzadas en JasmineSiguienteCustom Properties

Última actualización hace 9 meses

💕
🧪
📚