2012-08-30 13 views
8

¿Existe alguna manera de escribir pruebas unitarias para que puedan compilarse y ejecutarse tanto con Delphi como con Free Pascal?Pruebas de unidad de fuente única para Free Pascal y Delphi

Existen diferentes marcos de pruebas unitarias para Delphi y Free Pascal, que causa trabajo duplicado para los desarrolladores que se dirigen a ambos compiladores (por ejemplo, desarrolladores de bibliotecas y frameworks).

Así que tal vez haya una manera, usando el framework DUnit o FPCUnit y modificar el código fuente del caso de prueba (o el propio marco) para que también funcione con el otro compilador.

Así que, esencialmente, la pregunta es:

  • qué marco (DUnit o FPCUnit) pueden ser compilados con los compiladores (Delphi y Free Pascal) con pequeñas modificaciones como sea posible?

o

  • hay un tercer marco (Gracias a Arnaud por mencionar TSynTest), que trabaja con Delphi y FPC?
+0

Solicite específicamente que escriba pruebas de DUnit en FPC. Eso es claramente imposible. ¿Pero es eso lo que realmente quisiste preguntar? ¿O solo quieres escribir código en algún marco de prueba de unidades? Mi respuesta tomó la pregunta al pie de la letra. Las otras respuestas asumieron una interpretación más indulgente. ¿Cuál es? –

+0

@DavidHeffernan gracias por señalar esto, modifiqué la pregunta y agregué las etiquetas de prueba de fpcunit/unit – mjn

+0

Bueno, ahora puedo eliminar la respuesta que ya no es precisa. Pregunta mucho mejor ahora. –

Respuesta

6

defecto para Free Pascal es FPCUnit, tiene el mismo diseño que DUnit pero diferente de ella en detalles menores. Puede escribir pruebas unitarias comunes para FPCUnit y DUnit eludiendo las diferencias por {$IFDEF FPC}. Acabo de probar FPCUnit, es un marco utilizable y blogged about it.

3

acabo prepararon rápidamente una muestra que funciona tanto en DUnit (Delphi) y FPCUnit (equivalente Freepascal más cercana a DUnit, que pasa a enviar ya "en el cuadro" en Lázaro 1.0, que incluye FreePascal 2.6):

Un pedacito trivial de IFDEF y tú estás allí. marco de prueba de unidad

unit TestUnit1; 

{$IFDEF FPC} 
{$mode objfpc}{$H+} 
{$ENDIF} 

interface 

uses 
    Classes, 
    {$ifdef FPC} 
    fpcunit, testutils, testregistry, 
    {$else} 
    TestFramework, 
    {$endif} 
    SysUtils; 

type 
    TTestCase1= class(TTestCase) 
    published 
    procedure TestHookUp; 
    end; 

implementation 

procedure TTestCase1.TestHookUp; 
begin 
    Self.Check(false,'value'); 
end; 

initialization 
    RegisterTest(TTestCase1{$ifndef FPC}.Suite{$endif}); 
end. 
+3

Si va más allá, encuentra otras diferencias, como 'TTestCase.CheckEquals' en DUnit es' TTestCase.AssertEquals' es FPCUnit. Necesitas un poco más {$ IFDEF}. – kludg

+1

Me gustaría ir a una clase de contenedor para evitar tener que ensuciar mi propio código con ifdef ... –

+0

Exactamente. Subtítulo TTestCase de FPCUnit y guarde la unidad como TestFramework. Quizás haga que todo lo que necesite de TestUtils y TestRegistry funcione. –

10

Vea esto very nice blog article - solo carne fresca sobre pruebas de FPCUnit.

En resumen, por lo que yo sé, y si compare to DUnit:

  • mayoría Cheque *() métodos se renombraron Assert *();
  • Los métodos SetUp/TearDown se llaman por función en ambos frameworks;
  • Algunos otros pensamientos pueden variar.

lo tanto, yo creo que podría ser fácil dejar FPCUnit "imita" DUnit, por creación de una pequeña clase de contenedor sobre la aplicación FPCUnit, tener los mismos métodos exactos que con DUnit. Por lo tanto, es posible que pueda compartir el código entre los dos objetivos e incluso volver a utilizar las pruebas existentes de DUnit. Tal clase de contenedor es en mi humilde opinión mucho más conveniente que el uso de {$ifdef FPC} como otros sugeridos aquí. La compilación condicional tiende a hacer que el código sea difícil de depurar, detallado, redundante y solo debe usarse si es necesario.

Otra posible solución podría ser utilizar otros marcos de pruebas. Nuestros pequeños TSynTest classes son más livianos, pero actualmente estoy convirtiendo el framework a FPC. Entonces, el mismo código exacto podría usarse con ambos compiladores.Tiene algunas características (como el registro opcional con perfiles finos, y la pila completa de fallas) que me perdería de DUnit/FPCUnit. No tiene una GUI ni un asistente, pero, sinceramente, como programador, prefiero el texto sin formato que puedo incluir fácilmente en mi documentación de la versión técnica para atestiguar que no se produjo ninguna regresión.

+1

De todos modos, ['Serg mencionó'] (http://stackoverflow.com/a/12209940/960757) la publicación de su blog de hoy ;-) +1 a ambos ... – TLama

+0

Sugiero que su ejecución de TSynTest tenga un contenido no detallado modo. Cuando ejecuto pruebas unitarias, ejecuto el test-runner en modo texto y espero un resultado como este '.......' con un punto por prueba aprobada, y salida explícita (que no sea un punto) solo para fallas. Menos ruido es mejor. –

+0

'TSynTest' no es muy detallado por defecto: mostrará una línea por cada ejecución del método de prueba. También puede redirigir la salida. Al habilitar el registro, tiene MUCHO contenido (varios 100MB). Por supuesto, si solo tiene una o dos afirmaciones por método, se volverá verbosa. De hecho, el diseño de prueba utilizado es tener métodos privados o públicos más pequeños para las pruebas, luego reagrupar las pruebas dentro de los métodos publicados, con nombres explícitos, listos para mostrarse. Por lo tanto, puede tener granularidad pequeña, pero no espere un método de prueba por clase o método probado. Por ejemplo, nuestro mORMot ejecuta cerca de 10,000,000 de pruebas. –

Cuestiones relacionadas