Un marco de prueba orientado a C++ moderno para código C++

he leído

Marco de pruebas unitarias de C++

que se cierra por demasiado amplio; y en cuanto a las respuestas, si bien enumera varios marcos de prueba, en realidad no los compara ni analiza sus características.

Ahora, estoy interesado en agregar un marco para pruebas unitarias para un proyecto mío existente. En realidad, ya incluye un binario que realiza un cierto tipo de pruebas unitarias, o tal vez debería algo entre las pruebas unitarias y de subsistema, pero no es un marco de prueba unitaria en sí mismo y no pretende probar todo el código. Es por eso que quiero un marco adecuado. Puede (o no) también permitirme soltar parte del código personalizado que tengo ahora.

Un requisito importante que tengo es que el marco esté orientado a Modern-C++ . Es decir, que la sintaxis para usarlo será C++11'ish (podría ser C++14 o C++17, pero la última opción podría causarme algunos problemas debido a problemas de compatibilidad con CUDA), en lugar de solo admitir la prueba del código C ++ 11 como una ocurrencia tardía. Así que cuando leo, por ejemplo, que Google Test solo necesita un compilador C++98, me preocupo.

Otras características clave (parcialmente adaptadas de este artículo ):

  • Se necesita una cantidad mínima de trabajo para agregar nuevas pruebas.
  • Fácil de modificar y portar, ¡pero no por las razones mencionadas aquí ! Es decir, puede y debe depender del lenguaje C++ avanzado y las características de la biblioteca estándar, siempre que sean estándar; y no me importan las dependencias en algo como, digamos, CMake, o algún lenguaje de secuencias de comandos, etc., siempre que sea tolerante a la diferencia entre los sistemas operativos y las distribuciones de los sistemas operativos.
  • Admite pasos de instalación/desmontaje (accesorios).
  • Excepciones, bloqueos y afirmaciones de wrt flexibles y robustas.
  • Agradable salida de consola con gráficos ASCII mejorados y bastante impresos. No me importa ninguna característica específica, por ejemplo, colores frente a monocromáticos o si el progreso y los éxitos/fracasos están animados o no, pero debería ser agradablemente legible.
  • La integración con IDE es una gran ventaja

y por supuesto:

  • Licencia gratuita y de código abierto
  • Gratis
  • Soporte para diferentes formatos de salida, para uso de varias herramientas post-mortem

Realmente me gustaría una comparación de fortalezas y debilidades con las características que enumeré, así como una comparación en un solo marco.

@Mawg: antiguo, sin utilizar las funciones de C++ 11/14.
Gracias por la explicación. Eso ayudará a otros a ayudarte (+1)

Respuestas (5)

Si tiene Boost como dependencia, entonces Boost.Test es una opción obvia. Consistente, con todas las funciones, tan minimalista o tan rico como lo necesite.

¿Puede explicar cómo está orientado hacia el C++ moderno? Tenía la impresión de que es un poco viejo.
@einpoklum: la palabra correcta es "maduro", no "viejo". ¿Por qué no señalas en qué aspecto está desactualizado y lo discutimos?
Quise decir "viejo" como en "implementado en C++ anterior a 2011".
He estado probando el código C++1xyz desde que se llamaba C++0x (finales de 2010), nunca sentí que Boost.Test me bloqueara, sí desea crear una biblioteca de plataformas de prueba específicas del proyecto a su alrededor, pero eso es todo, lo hace no lo obligue a degradar la sintaxis (o use boost::mpl y boost::fusion innecesariamente :-))

Brío

¡Un framework C++14 y superior!

Ejemplo:

suite<> basic("a basic suite", [](auto &_) {
  _.test("a test", []() {
    expect(true, equal_to(true));
  });

  for(int i = 0; i < 4; i++) {
    _.test("test number " + std::to_string(i), [i]() {
      expect(i % 2, less(2));
    });
  }

  subsuite<>(_, "a subsuite", [](auto &_) {
    _.test("a sub-test", []() {
      expect(true, equal_to(true));
    });
  });
});

Nota: no lo he probado yo mismo.

para que no

  • Objetivos de diseño declarados: moderno y nativo de C++ 11, archivo único, solo encabezado, tamaño pequeño
  • Código del marco: https://github.com/martinmoene/lest
  • Falta: Conjuntos de pruebas, pruebas parametrizadas, pruebas con plantillas, generadores de datos de prueba, emparejadores de cresta de la corva incorporados.

Ejemplo:

const lest::test specification[] =
{
    CASE( "Empty string has length zero (succeed)" )
    {
        EXPECT( 0 == string(  ).length() );
        EXPECT( 0 == string("").length() );    
   },
}

Nota: no lo he probado yo mismo.

Bandido

"Una prueba unitaria amigable para los humanos para C++ 11"

Aparentemente, este marco "hace lo imposible" para hacer que el código fuente de su prueba se lea como una descripción en lenguaje natural de una prueba. Por ejemplo, aquí hay una prueba de una guitarra, que asegura que suene distorsionada en el modo de distorsión:

describe("in distorted mode", [&]() {
    before_each([&]() { fuzzbox->flip(); });

    it("sounds distorted", [&]() {
        AssertThat(guitar->sound(), Equals(sounds::distorted));
    });
});

Nota: No he probado este yo mismo.

a) Por favor, no recomiendes cosas que no hayas probado tú mismo. b) no sugiera varias herramientas en una respuesta.
@ThomasWeller: a) ¿En qué basa estas sugerencias? b) ¿Quiere sugerir usar respuestas múltiples en su lugar?
@ThomasWeller: a) No hay referencias para esto todavía... y no estoy de acuerdo. Las personas pueden probar herramientas incluso sin evaluaciones aquí en el sitio. b) Así que marque, no vote en contra... de todos modos, divida mi respuesta.
No puedo marcar: no es spam, no es grosero, es una (múltiple) respuesta, y no es tarea del moderador dividir las respuestas en partes.
También es interesante que usted mismo haya tenido la necesidad original de una herramienta de este tipo y ahora no haya probado la solución. ¿Por qué no?
@ThomasWeller: Mi esfuerzo de codificación se ha centrado en otra parte; y las pruebas también se pueden seguir escribiendo sin un marco adecuado.

prueba de documento

Presentado en CppCon 2017 por Victor Kirilov

Este marco desarrollado activamente no está realmente orientado a C++ moderno, pero pretende estar en su próxima versión principal (2.0; está en 1.2 en este momento).

  • Lema: "El marco de prueba de un solo encabezado C++98/C++11 rico en funciones más rápido para pruebas unitarias y TDD"
  • Código del marco: https://github.com/onqtam/doctest
  • Hoja de ruta ambiciosa , que incluye integraciones IDE
  • Supuestamente muy rápido, con [puntos de referencia] contra el marco Catch (pero no tengo idea si Catch es más rápido que Gtest, CppUnit, etc.)

Nota: No he probado esto yo mismo.