Ejecute pruebas unitarias para una aplicación GitHub de Node.js desde AWS CodeBuild - Recomendaciones de AWS

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Ejecute pruebas unitarias para una aplicación GitHub de Node.js desde AWS CodeBuild

Creada por Thomas Scott (AWS) y Jean-Baptiste Guillois () AWS

Repositorio de código: Ejemplo de pruebas de Node JS

Entorno: producción

Tecnologías: aplicaciones web y móviles

AWSservicios: AWS CodeBuild

Resumen

Este patrón proporciona un ejemplo de código fuente y componentes clave de prueba unitaria para un juego de Node.jsAPI. También incluye instrucciones para ejecutar estas pruebas unitarias desde un GitHub repositorio mediante AWS CodeBuild el flujo de trabajo de integración y entrega continuas (CI/CD).

Las pruebas unitarias son un proceso de desarrollo de software en el que diferentes partes de una aplicación, llamadas unidades, se prueban de forma individual e independiente para comprobar su correcto funcionamiento. Las pruebas validan la calidad del código y confirman que funciona según lo esperado. Otros desarrolladores también pueden familiarizarse fácilmente con su base de código consultando las pruebas. Las pruebas unitarias reducen el tiempo de refactorización en el futuro, ayudan a los ingenieros a ponerse al día con su base de código con mayor rapidez y proporcionan confianza en el comportamiento esperado.

Las pruebas unitarias implican probar funciones individuales, incluidas las funciones AWS Lambda. Para crear pruebas unitarias, necesita un marco de pruebas y una forma de validar las pruebas (aserciones). Los ejemplos de código de este patrón utilizan el marco de pruebas Mocha y la biblioteca de aserciones Chai

Para obtener más información sobre las pruebas unitarias y ejemplos de componentes de las pruebas, consulte la sección de Información adicional.

Requisitos previos y limitaciones

Arquitectura

Este patrón implementa la arquitectura que se muestra en el siguiente diagrama.

AWSArquitectura en la nube para ejecutar pruebas CodeBuild unitarias con un repositorio GitHub

Herramientas

Herramientas

  • Git es un sistema de control de versiones que puede utilizar para el desarrollo de código.

  • AWSCloud9 ─ AWS Cloud9 es un entorno de desarrollo integrado (IDE) que ofrece una rica experiencia de edición de código con soporte para varios lenguajes de programación y depuradores de tiempo de ejecución, y un terminal integrado. Contiene una colección de herramientas que se utilizan para codificar, compilar, ejecutar, probar y depurar software, y le ayuda a lanzar software en la nube. Se accede a AWS Cloud9 IDE a través de un navegador web.

  • AWS CodeBuild─ AWS CodeBuild es un servicio de integración continua totalmente gestionado que compila el código fuente, ejecuta pruebas y produce paquetes de software listos para su implementación. Con CodeBuild esto, no necesita aprovisionar, administrar ni escalar sus propios servidores de compilación. CodeBuild escala de forma continua y procesa varias compilaciones de forma simultánea, para que sus compilaciones no se queden esperando en una cola. Puede comenzar con rapidez usando entornos de compilación preempaquetados, o crear sus propios entornos de compilación personalizados que utilicen sus propias herramientas de compilación. Con CodeBuild, se le cobra por minuto por los recursos de cómputo que utilice.

Código

El código fuente de este patrón está disponible en el GitHub repositorio de aplicaciones de prueba de unidades de juego de muestra. Puedes crear tu propio GitHub repositorio a partir de esta muestra (opción 1) o utilizar el repositorio de muestras directamente (opción 2) para este patrón. Siga las instrucciones para cada opción que se indican en la siguiente sección. La opción que siga dependerá de su caso de uso.

Epics

TareaDescripciónHabilidades requeridas

Cree su propio GitHub repositorio a partir del proyecto de muestra.

  1. Inicie sesión en GitHub.

  2. Crear un nuevo repositorio. Para obtener instrucciones, consulte la GitHub documentación.

  3. Clone e inserte el repositorio de muestras  en el nuevo repositorio de su cuenta.

Desarrollador de aplicaciones, AWS administrador, AWS DevOps

Crea un CodeBuild proyecto nuevo.

  1. Inicie sesión en la consola AWS de administración y abra la CodeBuild consola en https://console.aws.amazon.com/codesuite/codebuild/home.

  2. Elija Crear el proyecto de compilación.

  3. En la sección Configuración del proyecto, en Nombre del proyecto, escriba -js. aws-tests-sample-node

  4. En la sección Fuente, en Proveedor de fuentes, elija GitHub.

  5. En Repositorio, selecciona Repositorio en mi GitHub cuenta y pégalo en el URL GitHub repositorio recién creado.

  6. En la sección Primary source webhook events (Eventos de webhooks de origen principales),  seleccione Rebuild every time a code change is pushed to this repository.  (Volver a compilar cada vez que se inserte un cambio de código en este repositorio).

  7. Para el tipo de evento, selecciona PUSH. 

  8. En la sección Entorno, selecciona Imagen gestionada, Amazon Linux y la imagen más reciente.

  9. Utilice los valores predeterminados para el resto de opciones y, a continuación, elija Create build project (Crear proyecto de compilación).

Desarrollador de aplicaciones, AWS administrador, AWS DevOps

Comience la compilación.

En la página Review (Revisar), elija Start build (Comenzar compilación) para ejecutar la compilación.

Desarrollador de aplicaciones, AWS administrador, AWS DevOps
TareaDescripciónHabilidades requeridas

Cree un nuevo proyecto de CodeBuild construcción.

  1. Inicie sesión en la consola AWS de administración y abra la CodeBuild consola en https://console.aws.amazon.com/codesuite/codebuild/home.

  2. Elija Crear el proyecto de compilación.

  3. En la sección Configuración del proyecto, en Nombre del proyecto, escriba -js. aws-tests-sample-node

  4. En la sección Fuente, en Proveedor de fuentes, elija GitHub.

  5. En Repositorio, elija Repositorio público y, a continuación, pegue elURL: https://github.com/aws-samples/node-js-tests-sample.

  6. En la sección Entorno, selecciona Imagen gestionada, Amazon Linux y la imagen más reciente.

  7. Utilice los valores predeterminados para el resto de opciones y, a continuación, elija Create build project (Crear proyecto de compilación).

Desarrollador de aplicaciones, AWS administrador, AWS DevOps

Comience la compilación.

En la página Review (Revisar), elija Start build (Comenzar compilación) para ejecutar la compilación.

Desarrollador de aplicaciones, AWS administrador, AWS DevOps
TareaDescripciónHabilidades requeridas

Ver resultados de la prueba.

En la CodeBuild consola, revise los resultados de las pruebas unitarias del CodeBuild trabajo. Deben coincidir con los resultados que se muestran en la sección de Additional information (Información adicional).

Estos resultados validan la integración del GitHub repositorio con CodeBuild. 

Desarrollador de aplicaciones, AWS administrador, AWS DevOps

Aplique un webhook.

Ahora puede aplicar un webhook para iniciar automáticamente una compilación cada vez que introduzca cambios de código en la rama principal de su repositorio. Para obtener instrucciones, consulte la CodeBuild documentación.

Desarrollador de aplicaciones, AWS administrador, AWS DevOps

Recursos relacionados

Información adicional

Ver resultados de la prueba unitaria

En la CodeBuild consola, debería ver los siguientes resultados de las pruebas una vez que el proyecto se haya creado correctamente. 

Resultados esperados de la prueba unitaria

Ejemplo de componentes de una prueba unitaria

Esta sección describe los cuatro tipos de componentes de prueba que se utilizan en las pruebas unitarias: aserciones, espías, stubs y mocks. Incluye una breve explicación y un ejemplo de código de cada componente. 

Aserciones

Se utiliza una aserción para verificar un resultado esperado. Este es un componente de prueba importante porque valida la respuesta esperada de una función determinada. El siguiente ejemplo de aserción valida que el identificador devuelto esté entre 0 y 1000 al inicializar un juego nuevo.

const { expect } = require('chai'); const { Game } = require('../src/index'); describe('Game Function Group', () => { it('Check that the Game ID is between 0 and 1000', function() { const game = new Game(); expect(game.id).is.above(0).but.below(1000) }); });

Espías

Un espía se utiliza para observar lo que sucede cuando se ejecuta una función. Por ejemplo, es posible que quiera comprobar que se ha llamado a la función correctamente. El siguiente ejemplo muestra que los métodos de inicio y parada se llaman en un objeto de la clase Juego.

const { expect } = require('chai'); const { spy } = require('sinon'); const { Game } = require('../src/index'); describe('Game Function Group', () => { it('should verify that the correct function is called', () => { const spyStart = spy(Game.prototype, "start"); const spyStop = spy(Game.prototype, "stop"); const game = new Game(); game.start(); game.stop(); expect(spyStart.called).to.be.true expect(spyStop.called).to.be.true }); });

Stubs

Un stub se utiliza para anular la respuesta predeterminada de una función. Esto resulta especialmente útil cuando la función realiza una solicitud externa, ya que se quiere evitar realizar solicitudes externas a partir de pruebas unitarias. (Las solicitudes externas son más adecuadas para las pruebas de integración, que pueden probar físicamente las solicitudes entre diferentes componentes). En el siguiente ejemplo, un código auxiliar fuerza a la getIdfunción a devolver un identificador.

const { expect } = require('chai'); const {.stub } = require('sinon'); const { Game } = require('../src/index'); describe('Game Function Group', () => { it('Check that the Game ID is between 0 and 1000', function() { let generateIdStub = stub(Game.prototype, 'getId').returns(999999); const game = new Game(); expect(game.getId).is.equal(999999); generateIdStub.restore(); }); });

Mocks

Un mock es un método falso que tiene un comportamiento preprogramado para probar diferentes escenarios. Un mock puede considerarse una forma extendida de un stub y puede llevar a cabo múltiples tareas simultáneamente. En el siguiente ejemplo, se utiliza un mock para validar tres escenarios:

  • Se llama a la función 

  • La función se llama con argumentos

  • La función devuelve el entero 9

const { expect } = require('chai'); const {.mock } = require('sinon'); const { Game } = require('../src/index'); describe('Game Function Group', () => { it('Check that the Game ID is between 0 and 1000', function() { let mock = mock(Game.prototype).expects('getId').withArgs().returns(9); const game = new Game(); const id = get.getId(); mock.verify(); expect(id).is.equal(9); }); });