¿Sigues usando gtest? Introducción a un mejor marco de prueba

gtest necesita ser instalado y a veces trae muchos inconvenientes. Por motivos de red, la descarga e instalación de gtest o la extracción de gtest desde git pueden fallar debido a motivos de red. Además de gtest, existen muchas bibliotecas de pruebas unitarias livianas y fáciles de usar, como doctest.

Biblioteca moderna de pruebas unitarias de C++


Además de gtest, existen muchas bibliotecas de pruebas unitarias livianas y fáciles de usar, como doctest y catch. En comparación con gtest, que debe compilarse/instalarse, todos son solo encabezados y se pueden usar para pruebas unitarias cuando se incluyen directamente en el proyecto. Portable no tiene dependencias, y los requisitos para la versión del compilador son no es alto, solo se requiere C ++ 11. Sí, solo hay una palabra después de usarlo: ¡genial!

Doctest se recomienda aquí porque su rendimiento es mejor que catch y, por supuesto, es mejor que gtest.Veamos cómo se usa doctest.

Introducción a la prueba de documentos


La dirección de github de doctest: doctest/doctest: el marco de prueba de un solo encabezado C++11/14/17/20 rico en funciones más rápido

El marco de prueba de un solo encabezado C++ 11/14/17/20 rico en funciones más rápido

doctest es un nuevo marco de pruebas de C++. El tiempo de compilación (por órdenes de magnitud ) y el tiempo de ejecución son más rápidos en comparación con otras alternativas ricas en funciones . Brinda la capacidad de compilar lenguajes (como  D / Rust / Nim ) y escribir pruebas directamente en el código de producción al proporcionar un corredor de prueba rápido, transparente y flexible con una interfaz limpia.

La principal diferencia entre doctest y otros marcos de prueba es que es liviano y no intrusivo.

Un ejemplo completo con una prueba de autorregistro que se compila en un ejecutable se ve así:

Propiedades relacionadas


  1. Todo lo relacionado con las pruebas se puede eliminar del ejecutable binario definiendo el indicador DOCTEST_CONFIG_DISABLE.
  2. Muy pequeño y fácil de integrar: solo un archivo de encabezado.
  3. Tiempo de compilación muy bajo: aproximadamente 25 ms de sobrecarga de tiempo de compilación para expandir archivos de encabezado.
  4. Probablemente la macro de afirmación más rápida: se pueden compilar 50 000 afirmaciones en 30 segundos (o incluso 10 segundos).
  5. No se mueven archivos de encabezado (excepto las unidades de traducción implementadas por la biblioteca).
  6. Todo está en el espacio de nombres doctest (los detalles de implementación están en un espacio de nombres de detalles anidados).
  7. Todas las macros tienen prefijo; algunas no tienen prefijo de forma predeterminada, pero esto es opcional; consulte la configuración.
  8. No se producen advertencias, incluso con las opciones de compilación más estrictas (en todos los compiladores probados).
  9. Clang: -Todo -pedante
  10. GCC: -Wall -Wextra -pedante y más de 35 otras advertencias de que estas banderas no anulan a GCC. ——Referencia aquí.
  11. MSVC: /W4 (/Wall es demasiado, incluso los propios encabezados de Microsoft generarán miles de advertencias si se usa esta opción)
  12. Las opciones no reconocidas por la línea de comandos no generarán un error, y los prefijos son compatibles para la interoperabilidad con el análisis de la línea de comandos del cliente.
  13. Las opciones se pueden configurar en el programa en lugar de pasarlas desde la línea de comandos a través de argc/argv.
  14. No se genera ninguna advertencia cuando self está deshabilitado.

uso básico de doctest

#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
#include "doctest.h"
 
TEST_CASE("vectors can be sized and resized") {
    std::vector<int> v(5);
 
    REQUIRE(v.size() == 5);
    REQUIRE(v.capacity() >= 5);
 
    SUBCASE("adding to the vector increases it's size") {
        v.push_back(1);
 
        CHECK(v.size() == 6);
        CHECK(v.capacity() >= 6);
    }
    SUBCASE("reserving increases just the capacity") {
        v.reserve(6);
 
        CHECK(v.size() == 5);
        CHECK(v.capacity() >= 6);
    }
}

El uso de CHECK aquí para hacer afirmaciones es similar a EXPECT_xx de gtest. Creo que una de las características más geniales y prácticas de doctest es SUBCASE, que permite agregar más subcasos para probar algunas cosas especiales en el caso actual. Es muy práctico y este también es un lugar mejor que gtest.

doctest proporciona una gran cantidad de macros enriquecidas, que pueden satisfacer completamente nuestras necesidades de prueba.

Macros de afirmación para doctests


La macro CHECK solo verifica y no terminará la prueba, y la macro REQUIRE terminará la prueba.Al igual que la macro ASSET_XX en gtest, estas dos macros también son las dos macros más utilizadas cuando se realizan pruebas individuales.

Biblioteca de referencia moderna de C ++


nanobench también es una biblioteca de solo encabezado escrita en C ++ 11, también es muy fácil de usar, solo incluya el archivo de encabezado.

#define ANKERL_NANOBENCH_IMPLEMENT
#include <nanobench.h>
 
int main() {
    double d = 1.0;
    ankerl::nanobench::Bench().run("some double ops", [&] {
        d += 1.0 / d;
        if (d > 5.0) {
            d -= 5.0;
        }
        ankerl::nanobench::doNotOptimizeAway(d);
    });
}

Use la moderna cadena de herramientas de prueba de C++: doctest+FakeIt+nananobench, que puede reemplazar perfectamente a gtest/gmock y google bench, sin dependencias, sin instalación, y se puede usar directamente, incluidos los archivos de encabezado, muy fácil de integrar y usar, es ¡Es hora de abandonar Google Test y Google Bench!

Por último, me gustaría agradecer a todos los que han leído detenidamente mi artículo. La reciprocidad siempre es necesaria. Aunque no es algo muy valioso, puedes quitártelo si lo necesitas:

Estos materiales deben ser el almacén de preparación más amplio y completo para los amigos [de pruebas de software]. Este almacén también ha acompañado a decenas de miles de ingenieros de pruebas a través del viaje más difícil, ¡y espero que pueda ayudarlos! 

 

Supongo que te gusta

Origin blog.csdn.net/OKCRoss/article/details/131437225
Recomendado
Clasificación