Herramientas de prueba de unidad JavaScript para TDD

716

He examinado y considerado muchas pruebas unitarias de JavaScript y herramientas de prueba, pero no he podido encontrar una opción adecuada para seguir siendo totalmente compatible con TDD. Entonces, ¿hay una herramienta de prueba de unidad de JavaScript que sea totalmente compatible con TDD?

Mark Levison
fuente

Respuestas:

1506

Karma o transportador

Karma es un corredor de prueba de JavaScript creado con Node.js y diseñado para pruebas unitarias.

El transportador es para pruebas de extremo a extremo y utiliza Selenium Web Driver para conducir las pruebas.

Ambos han sido realizados por el equipo de Angular. Puede usar cualquier biblioteca de aserciones que desee con cualquiera.

Screencast: Karma Comenzando

relacionado :

pros :

  • Utiliza node.js, por lo que es compatible con Win / OS X / Linux
  • Ejecute pruebas desde un navegador o sin cabeza con PhantomJS
  • Ejecutar en múltiples clientes a la vez
  • Opción para iniciar, capturar y apagar automáticamente los navegadores
  • Opción para ejecutar servidores / clientes en la computadora de desarrollo o por separado
  • Ejecute pruebas desde una línea de comando (se puede integrar en ant / maven)
  • Escribir pruebas estilo xUnit o BDD
  • Admite múltiples marcos de prueba de JavaScript
  • Pruebas de ejecución automática al guardar
  • Proxies solicita dominio cruzado
  • Posible personalizar:
    • Extiéndalo para envolver otros marcos de prueba (Jasmine, Mocha, QUnit incorporado)
    • Sus propias afirmaciones / refutaciones
    • Reporteros
    • Lanzadores de navegador
  • Plugin para WebStorm
  • Soportado por Netbeans IDE

Contras :

mocha.js

No estoy totalmente calificado para comentar sobre las características, fortalezas y debilidades de mocha.js, pero me lo recomendó alguien en quien confío en la comunidad de JS.

Lista de características, según lo informado por su sitio web:

  • soporte de navegador
  • Soporte asíncrono simple, incluyendo promesas.
  • informe de cobertura de prueba
  • soporte de diferencia de cuerda
  • javascript # API para ejecutar pruebas
  • estado de salida adecuado para el soporte de CI, etc.
  • detecta automáticamente y deshabilita la coloración para no ttys
  • asigna excepciones no detectadas al caso de prueba correcto
  • soporte de tiempo de espera de prueba asíncrona
  • tiempos de espera específicos de la prueba
  • soporte de notificaciones de gruñido
  • informa la duración de las pruebas
  • destaca pruebas lentas
  • soporte de observador de archivos
  • detección global de fugas variables
  • opcionalmente, ejecute pruebas que coincidan con una expresión regular
  • salida automática para evitar "colgarse" con un bucle activo
  • metagenerar fácilmente suites y casos de prueba
  • compatibilidad con archivos mocha.opts
  • títulos de suite en los que se puede hacer clic para filtrar la ejecución de la prueba
  • soporte de depurador de nodos
  • detecta múltiples llamadas a done ()
  • usa cualquier biblioteca de afirmaciones que quieras
  • informes extensibles, incluidos más de 9 reporteros
  • DSL de prueba extensible o "interfaces"
  • antes, después, antes de cada uno, después de cada gancho
  • soporte arbitrario del transpilador (coffee-script, etc.)
  • Paquete TextMate

yolpo

yolpo

Esto ya no existe, redirige a sequential.js en su lugar

Yolpo es una herramienta para visualizar la ejecución de javascript. Se alienta a los desarrolladores de API de Javascript a escribir sus casos de uso para mostrar y contar su API. Tales casos de uso forman la base de las pruebas de regresión.

AVA

Logotipo de AVA

Test runner futurista con soporte incorporado para ES2015. Aunque JavaScript es de un solo subproceso, IO en Node.js puede ocurrir en paralelo debido a su naturaleza asíncrona. AVA aprovecha esto y ejecuta sus pruebas al mismo tiempo, lo que es especialmente beneficioso para las pruebas pesadas IO. Además, los archivos de prueba se ejecutan en paralelo como procesos separados, lo que le brinda un rendimiento aún mejor y un entorno aislado para cada archivo de prueba.

  • Minimal y rapido
  • Sintaxis de prueba simple
  • Ejecuta pruebas simultáneamente
  • Aplica la escritura de pruebas atómicas
  • Sin globales implícitos
  • Entorno aislado para cada archivo de prueba
  • Escribe tus pruebas en ES2015
  • Promesa de apoyo
  • Soporte de la función del generador
  • Soporte de función asíncrona
  • Apoyo observable
  • Afirmaciones mejoradas
  • TAP o salida opcional
  • Limpiar rastros de pila

Buster.js

Un corredor de prueba de JavaScript creado con Node.js. Muy modular y flexible. Viene con su propia biblioteca de afirmaciones, pero puede agregar la suya si lo desea. La biblioteca de aserciones está desacoplada, por lo que también puede usarla con otros corredores de prueba. En lugar de usar assert(!...)o expect(...).not..., usa refute(...)cuál es un buen giro en mi humilde opinión.

Un kit de herramientas de prueba de JavaScript del navegador. Realiza pruebas de navegador con automatización de navegador (piense en JsTestDriver), prueba de página HTML estática de estilo QUnit, prueba en navegadores sin cabeza (PhantomJS, jsdom, ...) y más. ¡Mira el resumen !

Un kit de herramientas de prueba de Node.js. Obtiene la misma biblioteca de casos de prueba, biblioteca de aserciones, etc. Esto también es ideal para el navegador híbrido y el código Node.js. Escriba su caso de prueba con Buster.JS y ejecútelo tanto en Node.js como en un navegador real.

Screencast: Buster.js Primeros pasos (2:45)

pros :

  • Utiliza node.js, por lo que es compatible con Win / OS X / Linux
  • Ejecute pruebas desde un navegador o sin cabeza con PhantomJS (pronto)
  • Ejecutar en múltiples clientes a la vez
  • Admite pruebas NodeJS
  • No es necesario ejecutar servidores / clientes en la computadora de desarrollo (no es necesario para IE)
  • Ejecute pruebas desde una línea de comando (se puede integrar en ant / maven)
  • Escribir pruebas estilo xUnit o BDD
  • Admite múltiples marcos de prueba de JavaScript
  • Aplazar las pruebas en lugar de comentarlas
  • SinonJS incorporado
  • Pruebas de ejecución automática al guardar
  • Proxies solicita dominio cruzado
  • Posible personalizar:
    • Extiéndalo para envolver otros marcos de prueba (JsTestDriver integrado)
    • Sus propias afirmaciones / refutaciones
    • Reporteros (xUnit XML, puntos tradicionales, especificación, tap, TeamCity y más integrados)
    • Personalizar / reemplazar el HTML que se utiliza para ejecutar las pruebas del navegador
  • Integración de TextMate y Emacs

Contras :

  • Todavía en beta, por lo que puede tener errores
  • No hay complemento para Eclipse / IntelliJ (todavía)
  • No agrupa los resultados por os / browser / version como TestSwarm *. Sin embargo, imprime el nombre y la versión del navegador en los resultados de la prueba.
  • No hay historial de resultados de pruebas anteriores como TestSwarm *
  • No funciona completamente en Windows a partir de mayo de 2014

* TestSwarm también es un servidor de integración continua, mientras que necesita un servidor CI independiente para Buster.js. Sin embargo, genera informes xUnit XML, por lo que debería ser fácil de integrar con Hudson , Bamboo u otros servidores CI.

TestSwarm

https://github.com/jquery/testswarm

TestSwarm ya no está oficialmente en desarrollo activo como se indica en su página web de GitHub. Recomiendan Karma, browserstack-runner o Intern.

Jazmín

Jazmín

Este es un marco basado en el comportamiento (como se indica en la cita a continuación) que podría interesar a los desarrolladores familiarizados con Ruby o Ruby on Rails. La sintaxis se basa en RSpec que se utilizan para probar en proyectos Rails.

Las especificaciones de Jasmine se pueden ejecutar desde una página html (en forma qUnit) o ​​desde un corredor de prueba (como Karma).

Jasmine es un marco de desarrollo basado en el comportamiento para probar su código JavaScript. No depende de ningún otro marco de JavaScript. No requiere un DOM.

Si tiene experiencia con este marco de prueba, contribuya con más información :)

Página principal del proyecto: http://jasmine.github.io/

QUnit

QUnit se enfoca en probar JavaScript en el navegador mientras brinda tanta comodidad al desarrollador como sea posible. Difusión del sitio:

QUnit es un conjunto de pruebas de unidad JavaScript potente y fácil de usar. Lo utilizan los proyectos jQuery, jQuery UI y jQuery Mobile y es capaz de probar cualquier código JavaScript genérico

QUnit comparte algo de historia con TestSwarm (arriba):

QUnit fue desarrollado originalmente por John Resig como parte de jQuery. En 2008 obtuvo su propia documentación de inicio, nombre y API, lo que permitió a otros usarla también para sus pruebas unitarias. En ese momento todavía dependía de jQuery. Una reescritura en 2009 corrigió eso, ahora QUnit se ejecuta completamente independiente. Los métodos de afirmación de QUnit siguen la especificación de Prueba de Unidad CommonJS, que fue influenciada en cierta medida por QUnit.

Página principal del proyecto: http://qunitjs.com/

Sinon

Otra gran herramienta es sinon.js por Christian Johansen, autor de Test-Driven JavaScript Development . Mejor descrito por él mismo:

Prueba independiente de espías, trozos y simulacros de JavaScript. Ninguna dependencia funciona con ningún marco de prueba de unidad.

Interno

El sitio web del pasante proporciona una comparación directa de características con los otros marcos de prueba en esta lista. Ofrece más funciones listas para usar que cualquier otro sistema de prueba basado en JavaScript.

BROMA

Un marco de prueba nuevo pero muy potente. También permite pruebas basadas en instantáneas, esto aumenta la velocidad de prueba y crea una nueva dinámica en términos de prueba

Echa un vistazo a una de sus charlas: https://www.youtube.com/watch?v=cAKYQpTC7MA

Mejor aún: Comenzando

gregers
fuente
2
Jasmine puede trabajar sin cabeza usando V8, pero también puedes usarlo interactivamente. Si bien el DOM no es necesario con respecto a Jasmine, su base de código puede acceder al DOM. Con disciplina, es posible eliminar, proteger con condiciones o proporcionar simulacros para partes del código que acceden al DOM y ejecutan pruebas completamente aparte de los dispositivos HTML. También puede obtener soporte de línea de comandos y accesorios mediante complementos.
jerseyboy
2
@ rehevkor5: Selenium es para pruebas de integración, mientras que las herramientas aquí son para pruebas unitarias. typemock.com/unit-tests-integration-tests
gregers
26
Casi todos los corredores de prueba dependen de un navegador. Wtf, ¿nadie ejecuta pruebas unitarias solo en el lado del servidor?
2
¿No sería mejor dividir / dividir cada alternativa en diferentes respuestas? Podría invalidar los votos actuales en este caso, pero creo que tendría más sentido.
cregox
2
@Raisen Puede conectar ES 2015 en la mayoría de ellos con Babel , pero AVA por Sindre Sørhus lo tiene incorporado.
gregers
64

Eche un vistazo al marco de prueba de unidad de Dojo Object Harness (DOH), que es prácticamente un arnés independiente del marco para la prueba de unidad de JavaScript y no tiene ninguna dependencia de Dojo. Hay una muy buena descripción de esto en la Unidad que prueba aplicaciones Web 2.0 utilizando el Arnés de Objetivo Dojo .

Si desea automatizar las pruebas de IU (un punto doloroso de muchos desarrolladores), consulte doh.robot (actualización temporal hacia abajo: otro enlace http://dojotoolkit.org/reference-guide/util/dohrobot.html ) y dijit .robotx (caída temporal) . Este último está diseñado para una prueba de aceptación. Actualizar:

Los artículos de referencia explican cómo usarlos, cómo emular a un usuario que interactúa con su interfaz de usuario con el mouse y / o el teclado, y cómo grabar una sesión de prueba, para que pueda "reproducirla" más tarde automáticamente.

Eugene Lazutkin
fuente
Gracias por la sugerencia de Dojo Object Harness, nunca lo habría encontrado. Agradezco las otras sugerencias, pero paso a paso.
Mark Levison el
De hecho, he usado esto en un proyecto anterior, y lo encontré invaluable. Pero, de nuevo, no puedo comparar, no he usado ningún otro marco TDD.
Rakesh Pai el
Gracias por informar enlaces muertos. Actualicé uno de ellos y reemplazaré los enlaces a documentos de robots tan pronto como estén en un nuevo sitio web.
Eugene Lazutkin
Una cosa que no me gusta de DOH es que los números de línea no se informan cuando las aserciones fallan. Comentarlos manualmente y volver a ejecutar la prueba funciona.
Aram Kocharyan
Dojo está reemplazando DOH con el marco de prueba TheIntern. TheIntern es muy potente y tiene mejoras sustanciales. sitepen.com/blog/2014/02/18/…
usuario64141
34

Chutzpah - Un corredor de prueba de JavaScript

Creé un proyecto de código abierto llamado Chutzpah que es un corredor de prueba para pruebas unitarias de JavaScript. Chutzpah le permite ejecutar pruebas unitarias de JavaScript desde la línea de comandos y desde el interior de Visual Studio. También admite la ejecución en el servidor de integración continua de TeamCity.

Matthew Manela
fuente
77
Acabo de comenzar a usar Chutzpah para ejecutar pruebas de Jasmine dentro de Visual Studio: está muy bien integrado: haga clic derecho en el archivo de prueba y elija 'ejecutar pruebas js' o 'ejecutar pruebas JS en el navegador'. Ejecuto las mismas pruebas de jazmín usando JSTestDriver. Prefiero Chutzpah porque especifico de qué archivos dependo que se carguen en la parte superior del archivo de prueba. Para JSTestDriver necesito un archivo de configuración separado.
GarethOwen
26

La sección de JavaScript de la entrada de Wikipedia, Lista de marcos de pruebas unitarias , proporciona una lista de opciones disponibles. Indica si funcionan del lado del cliente, del lado del servidor o de ambos.

Pete TerMaat
fuente
14

BusterJS

También está BusterJS de Christian Johansen, autor de Test Driven Javascript Development y Sinon framework. Desde el sitio:

Buster.JS es un nuevo marco de prueba de JavaScript. Realiza pruebas de navegador al automatizar las ejecuciones de prueba en navegadores reales (piense en JsTestDriver), así como las pruebas de Node.js.

Tauren
fuente
10

prueba de google-js:

Marco de prueba de JavaScript lanzado por Google: https://github.com/google/gjstest

  • Tiempo de ejecución y ejecución de prueba extremadamente rápido, sin tener que ejecutar un navegador.
  • Salida limpia y legible en el caso de pruebas aprobadas y reprobadas.
  • Un corredor de prueba basado en navegador que simplemente se puede actualizar cada vez que se cambia JS.
  • Estilo y semántica que se parecen a Google Test para C ++.
  • Un marco de simulación incorporado que requiere un código repetitivo mínimo (por ejemplo, no $tearDowno $verifyAll) con estilo y semántica basado en el Marco de simulación de Google C ++ .

Actualmente no hay binarios para Windows

usuario
fuente
1
Parece que tiene casi cero interés en Github, también requiere un sistema operativo unix-bases, y soy un gran fan de Windows, no salgo de mi casa sin despedirme de mi máquina de Windows.
vsync
8

Ahora estamos usando Qunit con Pavlov y JSTestDriver todos juntos. Este enfoque funciona bien para nosotros.

QUnit

Pavlov , fuente

jsTestDriver , fuente

Tom Stickel
fuente
¿Le gustaría explicar cuál es el papel de cada uno de ellos en todo el proceso de prueba y cómo se conectan entre sí?
vsync
Lo siento, ha pasado mucho tiempo y muchos trabajos por contrato para recordar los detalles sobre esto.
Tom Stickel
6

Tienes "carreras en el navegador real" como profesional, pero en mi experiencia eso es una estafa porque es lento. Pero lo que lo hace valioso es la falta de suficiente emulación JS de las alternativas que no son del navegador. Podría ser que si su JS es lo suficientemente complejo que solo una prueba en el navegador sea suficiente, pero hay un par de opciones más a considerar:

HtmlUnit : "Tiene bastante buena compatibilidad con JavaScript (que mejora constantemente) y puede funcionar incluso con bibliotecas AJAX bastante complejas, simulando Firefox o Internet Explorer dependiendo de la configuración que desee utilizar". Si su emulación es lo suficientemente buena para su uso, será mucho más rápido que manejar un navegador.

Pero tal vez HtmlUnit tiene suficiente soporte JS pero ¿no te gusta Java? Entonces tal vez:

Celerity : Watir API ejecutándose en JRuby respaldado por HtmlUnit.

o de manera similar

Schnell : otro contenedor JRuby de HtmlUnit.

Por supuesto, si HtmlUnit no es lo suficientemente bueno y tiene que manejar un navegador, entonces puede considerar que Watir maneje su JS .

Jeffrey Fredrick
fuente
3

También puede interesarle el marco de prueba de unidad que forma parte de qooxdoo , un marco de RIA de código abierto similar a Dojo, ExtJS, etc. pero con una cadena de herramientas bastante completa.

Pruebe la versión en línea del testrunner . Sugerencia: presione la flecha gris en la parte superior izquierda (debería hacerse más obvio). Es un botón "reproducir" que ejecuta las pruebas seleccionadas.

Para obtener más información sobre las clases JS que le permiten definir sus pruebas unitarias, consulte el visor de API en línea .

Para pruebas de IU automatizadas (basadas en Selenium RC), consulte el proyecto Simulator .

Andreas Ecker
fuente
3

Usted debe echar un vistazo a env.js . Vea mi blog para ver un ejemplo de cómo escribir pruebas unitarias con env.js.

Aaron Digulla
fuente
3

Agregamos la integración JUnit a nuestro generador de código Java a Javascript ST-JS ( http://st-js.org ). El marco genera el Javascript correspondiente tanto para el código probado como para las pruebas unitarias y envía el código a diferentes navegadores.

No hay necesidad de un servidor separado ya que el corredor de prueba de unidad abre el puerto http necesario (y lo cierra una vez que finalizan las pruebas). El marco manipula el stacktrace de Java para que el complemento JUnit Eclipse muestre correctamente las afirmaciones fallidas. Aquí hay un ejemplo simple con jQuery y Mockjax:

@RunWith(STJSTestDriverRunner.class)
@HTMLFixture("<div id='fortune'></div>")

@Scripts({ "classpath://jquery.js",
       "classpath://jquery.mockjax.js", "classpath://json2.js" })
public class MockjaxExampleTest {
  @Test
  public void myTest() {
    $.ajaxSetup($map("async", false));
    $.mockjax(new MockjaxOptions() {
      {
        url = "/restful/fortune";
        responseText = new Fortune() {
          {
            status = "success";
            fortune = "Are you a turtle?";
          }
        };
      }
    });

    $.getJSON("/restful/fortune", null, new Callback3<Fortune, String, JQueryXHR>() {
      @Override
      public void $invoke(Fortune response, String p2, JQueryXHR p3) {
        if (response.status.equals("success")) {
          $("#fortune").html("Your fortune is: " + response.fortune);
        } else {
          $("#fortune").html("Things do not look good, no fortune was told");
        }

      }
    });
    assertEquals("Your fortune is: Are you a turtle?", $("#fortune").html());
  }

  private static class Fortune {
    public String status;
    public String fortune;
  }
}
alex.c
fuente
2

MochiKit tiene un marco de prueba llamado SimpleTest que parece haberse puesto al día. Aquí hay una publicación de blog del autor original .

p.campbell
fuente
SimpleTest: otra gran opción. Me alegro de no estar haciendo el trabajo de investigación aquí ;-)
Mark Levison