Cómo hacer que la prueba Delphi DUnit falle cuando TSQLConnection.Connected = true
Pregunta
Cuando se utiliza Delphi IDE, cambiará silenciosamente SQLConnection.Connected a " true " al rellenar listas de campos o tablas en varias propiedades.
Como no quiero lanzar con Connected = true, necesito que mi prueba dunit falle cuando TSQLConnection.Connected se deja verdadero en dfm.
Solución
Resuelvo esto de otra manera. Escribí una pequeña utilidad que carga un archivo DFM y busca propiedades que no deberían estar presentes. Incluyendo la base de datos.connected = valores verdaderos.
Esto se puede modificar para trabajar con las propiedades apropiadas. He puesto el núcleo del código aquí también.
Para que esto sea realmente útil, debe usar esta utilidad en su script de compilación (yo uso FinalBuilder). Mi script comienza haciendo un bucle en archivos .dfm, eliminando cualquiera de estas propiedades, y luego compila y ejecuta las pruebas unitarias. Si pasan, entonces continúa construyendo la aplicación principal. Para mí, esta es una mejor manera que hacer que una prueba unitaria falle, ya que puedes comenzar desde un buen punto conocido garantizado.
nState := 0;
bFound := False;
for nFileLoop := 0 to memoFile.Lines.Count - 1 do
begin
szLine := memoFile.Lines[nFileLoop];
case nState of //
0:
begin
if(0 <> Pos('TADOConnection', szLine)) then
begin
szSeeking := 'Connected';
nState := 1;
end
else if(0 <> Pos('TADOTable', szLine)) then
begin
szSeeking := 'Active';
nState := 1;
end
else if(0 <> Pos('TADOQuery', szLine)) then
begin
szSeeking := 'Active';
nState := 1;
end
else if(0 <> Pos('TDBISAMTable', szLine)) then
begin
szSeeking := 'Active';
nState := 1;
end
else if(0 <> Pos('TDBISAMDatabase', szLine)) then
begin
szSeeking := 'Connected';
nState := 1;
end
else if(0 <> Pos('TDBISAMSession', szLine)) then
begin
szSeeking := 'Active';
nState := 1;
end
else if(0 <> Pos('TDBISAMQuery', szLine)) then
begin
szSeeking := 'Active';
nState := 1;
end;
end;
1 :
begin
bFound := True;
if(0 <> Pos('end', szLine)) then
begin
nState := 0;
end
else if(0 <> Pos(szSeeking, szLine)) then
begin
nPos := Pos('=', szLine);
if nPos > 0 then
begin
memoFile.Lines[nFileLoop] := Copy(szLine, 1, nPos) + ' False';
end;
end;
end;
end; // case
end;
Otros consejos
GExperts tiene un " Establecer propiedades de componentes " experto que configuramos para cerrar conexiones de bases de datos en cada compilación. Desde que lo hicimos, no hemos tenido el problema.
Puede escribir su propio descendiente de TSQLConnection que no almacena su propiedad Connected:
TdzAdoConnection = class(TADOConnection)
published
property Connected stored false;
end;
y use ese componente en lugar de TSqlConnection.
(Lo anterior es para TAdoConnection, pero TSQLConnection también debería funcionar bien).
OpenCTF : el marco de prueba de componentes para Delphi puede ser interesante, crea automáticamente pruebas unitarias para propiedades específicas de todos los componentes en todos los formularios / módulos de datos. Es de código abierto y fácil de usar.
" Comenzando " documento: http://www.habarisoft.com/download/OpenCTFGettingStarted.pdf
El marco de prueba del componente OpenCTF ayuda a construir pruebas automáticas para todos (visual y no visual) componentes VCL en una aplicación Delphi. Esta basado en el marco DUnit.
Algunos ejemplos de uso:
- detectar valores de propiedad faltantes o incorrectos, p. ej. Botones sin acciones asignadas, fuentes de datos sin conjunto de datos asociado
- detectar controladores de eventos no asignados, p. ej. evento OnExecute faltante
- compruebe que todos los conjuntos de datos se pueden abrir
- compruebe el orden de tabulación
- buscar componentes invisibles (por ejemplo, TabSheets invisibles que deberían ocultarse mejor en tiempo de ejecución)
Otro enfoque para este problema es implementar un enlace previo al compromiso en su SCM. Yo uso TortoiseSVN, y he hecho cosas similares para evitar que las cosas se cuelen. Por ejemplo, tenemos un " skins " biblioteca que intenta agregar una docena de unidades de máscara a cualquier formulario que abra en el IDE. (Tenemos un parche de registro que "repara" este comportamiento, pero no se realiza de vez en cuando, si un desarrollador vuelve a instalar componentes). Así que tengo una "lista de cadenas prohibidas" en un archivo .ini que se encuentra en un enlace de confirmación previa SVN.
En nuestro entorno, todo el código de producción se construye en una "máquina de compilación" dedicada, de modo que si el código no se registra, no se incluye en la compilación. Problema resuelto.