delphi unit-testing delphi-7 delphi-2006

Pruebas unitarias en Delphi: ¿cómo lo estás haciendo?



unit-testing delphi-7 (9)

Me pregunto cómo los pocos usuarios de Delphi aquí están haciendo pruebas unitarias, si hay alguna? ¿Hay algo que se integre con el IDE que has encontrado funciona bien? Si no es así, ¿qué herramientas está utilizando y tiene o sabe ejemplos de miniproyectos que demuestran cómo funciona todo?

Actualizar:

Olvidé mencionar que estoy usando BDS 2006 Pro, aunque de vez en cuando me topo con Delphi 7 y, por supuesto, otros pueden estar usando otras versiones.




Hacemos pruebas unitarias de todos los códigos lógicos usando DUnit y usamos el profiler de cobertura de códigos incluido en AQTime para verificar que todas las rutas a través del código sean ejecutadas por las pruebas.


Hay algunos complementos para DUnit, tal vez esto vale una nueva entrada en SO. Dos que puedo poner en la lista ahora son

  1. Integración FastMM4 : las pruebas unitarias detectarán automáticamente fugas de memoria (y otras cosas), funciona con DUnit 9.3 y versiones más recientes
  2. OpenCTF es un ''marco de prueba de componentes'' basado en DUnit, crea las pruebas dinámicamente para todos los componentes en los formularios, cuadros y módulos de datos del proyecto, y los prueba usando reglas personalizadas (código abierto)

texto alternativo http://www.mikejustin.com/images/OpenCTF.gif


Intentamos usar DUnit con Delphi 5, pero no funcionó bien. Especialmente si está implementando interfaces COM, encontramos muchas dependencias para configurar toda la infraestructura de prueba. No sé si el soporte de prueba ha mejorado en las versiones más nuevas.


Por lo general, creo un proyecto de prueba de unidad (Archivo-> Nuevo-> Otro-> Prueba de unidad-> Proyecto de prueba). Contiene las cosas que necesito, así que ha sido lo suficientemente bueno hasta ahora.

Uso Delphi 2007, así que no sé si estará disponible en 2006.


Puede echar un vistazo a las clases de pruebas unitarias disponibles en nuestra unidad de código abierto SynCommons . Se usa en nuestro marco de código abierto para todas las pruebas de regresión. Quizás no sea el mejor, pero vale la pena echarle un vistazo.

Ver http://blog.synopse.info/post/2010/07/23/Unit-Testing-light-in-Delphi

Para implementar una prueba unitaria, solo declaras un nuevo caso de prueba creando una clase como esta:

type TTestNumbersAdding = class(TSynTestCase) published procedure TestIntegerAdd; procedure TestDoubleAdd; end; procedure TTestNumbersAdding.TestDoubleAdd; var A,B: double; i: integer; begin for i := 1 to 1000 do begin A := Random; B := Random; CheckSame(A+B,Adding(A,B)); end; end;

Luego creas un traje de prueba y lo ejecutas.

En la próxima versión 1.13, también hay un nuevo mecanismo de registro con el seguimiento de la pila de cualquier excepción planteada y tal, al igual que MadExcept, utilizando el contenido del archivo .map como fuente.

Ahora es utilizado por las clases de prueba de la unidad, por lo que cualquier falla creará una entrada en el registro con la línea fuente y el seguimiento de la pila:

C:/Dev/lib/SQLite3/exe/TestSQL3.exe 0.0.0.0 (2011-04-13) Host=Laptop User=MyName CPU=2*0-15-1027 OS=2.3=5.1.2600 Wow64=0 Freq=3579545 TSynLogTest 1.13 2011-04-13 05:40:25 20110413 05402559 fail TTestLowLevelCommon(00B31D70) Low level common: TDynArray "" stack trace 0002FE0B SynCommons.TDynArray.Init (15148) 00036736 SynCommons.Test64K (18206) 0003682F SynCommons.TTestLowLevelCommon._TDynArray (18214) 000E9C94 TestSQL3 (163)

La diferencia entre un traje de prueba sin registro y un traje de prueba con registro es solo esto:

procedure TSynTestsLogged.Failed(const msg: string; aTest: TSynTestCase); begin inherited; with TestCase[fCurrentMethod] do fLogFile.Log(sllFail,''%: % "%"'', [Ident,TestName[fCurrentMethodIndex],msg],aTest); end;

El mecanismo de registro puede hacer mucho más que simplemente registrar la prueba: puede registrar llamadas recursivas de métodos, seleccionar la información que desea que aparezca en los registros, perfilar la aplicación desde el lado del cliente, escribir propiedades publicadas, contenido de TList o TCollection como JSON en el contenido del registro, y así sucesivamente ...

La primera vez que se lee el archivo .map, se crea un archivo .mab y contendrá toda la información de símbolos necesaria. Puede enviar el archivo .mab con .exe a su cliente, o incluso insertar su contenido en .exe. Este archivo .mab está optimizado: un .map de 927,984 bytes se comprime en un archivo 71,943 .mab.

Así que esta unidad podría ser reconocida como la hija natural de las bodas DUnit y MadExcept, en puro OpenSource. :)

Hay información adicional disponible en nuestro foro . Siéntete libre de preguntar. Comentarios y solicitudes de características son bienvenidos! Funciona desde Delphi 6 hasta XE.


Tenemos dos enfoques, primero tenemos las pruebas de Dunit que se ejecutan, compran los desarrolladores, estos se aseguran de que el código que acaba de modificarse funcione igual que antes. El otro enfoque es usar CruiseControl.NET para compilar ejecutables y luego ejecutar las pruebas de dunit cada vez que se realiza un cambio, para garantizar que no haya consecuencias imprevistas del cambio.

Gran parte de nuestra base de código no tiene pruebas, por lo que las pruebas automáticas son un caso de desarrollo continuo para garantizar que nuestras aplicaciones funcionen como creemos que deberían.


DUnit es un tipo de marco de prueba de unidad xUnit para ser utilizado con win32 Delphi. Dado que Delphi 2005 DUnit está integrado a un punto de certificación en el IDE. Otras herramientas de integración de DUnit para Delphi IDE se pueden encontrar here . DUnit viene con documentación con ejemplos .