2009-01-27 19 views
8

Creo que el concepto de Python's doctests es brillante, y como programador de C++ en una tienda en tiempo real, estoy bastante celoso. Básicamente no tenemos capacidad de prueba de unidad, lo cual es un obstáculo severo. He visto C++ Unit, etc., pero ¿hay algo que pueda extraer casos de prueba de comentarios como los doctests de Python en lugar de ponerlos en el código directamente?C++ equivalente a los docámenes de Python?

Respuesta

2

Acabo de echar un vistazo a doctest, de hecho es brillante. También lo es el enfoque de facilidad de uso del lenguaje Python.

Para C++, sin embargo, es probable que no encuentre una herramienta de este tipo.

Si falla una de las pruebas, es posible que desee depurar lo que sucede. No sería tan fácil tener el origen del caso de prueba generado a partir de los comentarios. En cambio, en los marcos de prueba de unidad existentes para C++ usted tiene el origen de las pruebas con una sintaxis especial, que se compila y es fácil de depurar. Además, la generación de la fuente a partir de los comentarios sería otro paso de (pre) compilación adicional, que simplemente haría la vida más difícil.

Debe aceptar que la codificación en C++ no es un trabajo tan rápido como lo es en Python, por lo que las pruebas unitarias son algo más difíciles. Por otro lado, tiene más herramientas, puede poner aserciones estáticas para las relaciones de tipo, por ejemplo, lo cual es imposible en Python.

Creo que el análogo del Python doctest para C++ tendría tantos inconvenientes en comparación con las herramientas existentes, que nadie comenzó a implementarlo.

Si realmente cree que puede ser mejor que las herramientas existentes, proporcione algunos ejemplos. Apenas creo que haya casos de la vida real en los que pueda ser más útil.

+1

"Debe aceptar que la codificación en C++ no es tan rápida como en Python", esta actitud es exactamente la razón por la cual usar C++ todavía duele. – Slava

0

Estaba pensando algo en la línea de generar CxxTest archivos de comentarios. No he usado ese marco, pero parece prometedor. Desde su manual, un archivo de prueba de unidad es como la siguiente:

// MyTestSuite.h 
#include <cxxtest/TestSuite.h> 

class MyTestSuite : public CxxTest::TestSuite 
{ 
public: 
    void testAddition(void) 
    { 
     TS_ASSERT(1 + 1 > 1); 
     TS_ASSERT_EQUALS(1 + 1, 2); 
    } 
}; 

Mi propuesta sería un analizador que extrae el contenido de esas funciones testX de comentarios, en lugar de tener que escribir todo el asunto. Por ejemplo (y estoy sólo que componen la sintaxis comentario aquí, puede haber una forma más limpia de escribirlo):

// MyRegularCode.cpp 

/// Description of the function here 
/// Then test case below that gets extracted 
/// and turned into CxxTest .h files 
/**testAddition 
MyClass mc; 
mc.MyFunction(); 
TS_ASSERT(mc.m_value > 1); 
TS_ASSERT_EQUALS(mc.m_value, 3); 
**/ 
void MyClass::MyFunction() 
{ 
    m_value = 3; 
}; 

No estoy seguro de cómo los aspectos más potentes de CxxTest conseguirían implementado, tales como la creación de accesorios, pero algo como esto podría proporcionar la unión de docstrings y doctests de Python en el mundo de C++.

0

Estoy al tanto de los viejos trucos con poner cosas en comentarios de código real (IIRC, esto es parte de práctica de programación). Sin embargo, puede ser más fácil simplemente poner las pruebas unitarias en bloques #ifdef. Por lo general, puede ejecutar el preprocesador para este tipo de cosas.

Por otra parte, soy consciente de one project que usa Perl como un superprocesador.

0

El marco de prueba que viene con Fost maneja algo bastante similar. Las pruebas no se incluirán en la documentación, pero se pueden sentar junto con el código que prueban. En estructura, las pruebas son muy similares al código cxxtest.

#include "myclass.hpp" 
#include <fost/test> 

FSL_TEST_SUITE(myclass); 

/* 
    Your documentation 
*/ 
FSL_TEST_FUNCTION(constructors) { 
    fostlib::test::default_constructable<myclass>(); 
} 
myclass::myclass() { 
} 

FSL_TEST_FUNCTION(some_method) { 
    myclass instance; 
    FSL_CHECK_NOTHROW(instance.some_method(0)); 
    FSL_CHECK_EQ(instance.some_method(2), 2); 
    FSL_CHECK_NEQ(instance.some_method(-2), 0); 
} 
int myclass::some_method(int arg) { 
    // implementation 
} 

Todo este lote se compila con las pruebas incorporadas (que podría sacarlos de la construcción a través de un #define - no se ha implementado, pero fácil de hacer). Las pruebas se ejecutan a través de un programa separado que carga el .DLL o .so que se ha creado, encuentra las pruebas y las ejecuta.

No lo hemos intentado, pero debería funcionar con bibliotecas estáticas y cargar y ejecutar dinámicamente las pruebas encontradas en archivos .EXE en Windows, pero estoy menos seguro de si se puede hacer así en Linux o Mac.

3

Puede que le sea útil. Empecé a desarrollar esto después de necesitar esto en mi propio código.

http://github.com/panyam/DocTestPlusPlus

Es un script en Python que pasa por sus comentarios y extrae las pruebas y genera archivos de prueba.

Todavía en desarrollo y prueba. Aprecia todos y cada uno de los comentarios.

aplausos Sri

4

acabo lanzado doctest - La característica más ligera rica en C++ único marco de pruebas de cabecera.

No es para escribir pruebas en comentarios, sino para escribir pruebas directamente en el código de producción. No se ajusta perfectamente a sus necesidades, pero sigue siendo la mejor opción en C++ sin preprocesamiento, pasos