Como fazer Delphi DUnit testes falham quando TSQLConnection.Connected = true

StackOverflow https://stackoverflow.com/questions/457363

  •  19-08-2019
  •  | 
  •  

Pergunta

Ao usar Delphi IDE, ele irá silenciosamente mudar SQLConnection.Connected para "true" ao preencher listas de campo ou tabela de várias propriedades.

Desde que eu não quero liberar com Connected = true, eu preciso do meu teste de DUnit a falhar quando TSQLConnection.Connected é deixado verdade em DFM.

Foi útil?

Solução

Eu resolvo isso de outra maneira. Eu escrevi um pequeno utilitário que carrega um arquivo DFM, e olha para propriedades que não deve estar presente. Incluindo os valores database.connected = true.

Isso pode ser modificado para trabalhar com qualquer propriedades adequadas. Tenho colocar o núcleo do código aqui também.

Para fazer este realmente útil, você deve usar este utilitário em seu script de construção (eu uso FinalBuilder). Meu script começa looping em arquivos .dfm, tirando qualquer uma destas propriedades, e em seguida, ele compila e executa os testes de unidade. Se eles passam, então continutes para construir o aplicativo principal. Para mim, esta é uma maneira melhor do que ter um teste de unidade falhar, como você pode começar a partir de um ponto conhecido bom garantida.

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;

Outras dicas

GExperts tem um "conjunto de propriedades do componente" expert que configurar para conexões de banco de dados perto em cada compilação. Desde fazendo isso, não tivemos o problema.

Você pode escrever seu próprio descendente de TSQLConnection que não armazena sua propriedade Connected:

  TdzAdoConnection = class(TADOConnection)
  published
    property Connected stored false;
  end;

e o uso desse componente em vez de TSQLConnection.

(O texto acima é para TADOConnection, mas TSQLConnection também deve funcionar bem.)

OpenCTF - Component Framework de teste para Delphi pode ser interessante, ele cria automaticamente testes de unidade para propriedades especificadas de todos os componentes em todas as formas / datamodules. É Open source e fácil de usar.

"Getting Started" documento: http://www.habarisoft.com/download/OpenCTFGettingStarted .pdf

O framework de teste componente OpenCTF ajuda a construir testes automáticos para todos componentes VCL (visuais e não visuais) numa aplicação de Delphi. Baseia-se sobre o quadro DUnit.

Alguns exemplos de uso:

  • detectar faltando ou valores de propriedade erradas - por exemplo, Botões sem ações atribuídas, DataSources sem associada DataSet
  • detectar manipuladores de eventos não atribuídos - por exemplo, faltando evento OnExecute
  • Verifique se todos os conjuntos de dados podem ser abertos
  • marque a ordem de tabulação
  • encontrar componentes invisíveis (por exemplo tabsheets invisíveis que melhor deve ser escondidos em tempo de execução)

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

Outra abordagem para este problema é a implementação de um pré-commit gancho em seu SCM. Eu uso o TortoiseSVN, e eu tenho feito coisas semelhantes para evitar que as coisas se infiltre no. Por exemplo, temos uma biblioteca "peles" que tenta adicionar cerca de uma dúzia de unidades de pele a qualquer forma que você abre no IDE. (Nós temos um patch de registro que "correções" esse comportamento, mas torna-se "un-feito" de vez em quando, se um desenvolvedor re-instala componentes). Então eu tenho uma "lista de cordas proibidos" em um arquivo .ini que está em um SVN pre-commit gancho.

Em nosso meio, todo o código de produção é construído em uma "máquina de compilação" dedicado, por isso, se o código não se check-in, ele não fazê-lo na construção. Problema resolvido.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top