Veja esse exemplo a seguir.
Eu posso instanciar o objeto dentro de uma classe e ela sempre irá monitorar o que está acontecendo.
Código: Selecionar todos
METHOD NEW( cDatabaseType, cDatabaseAddress, cDatabaseName, cDatabaseUser, cDatabasePassword, cDatabasePort ) CLASS TVladSQL
::oTest := TVladTest():New( "TVladSQL():New()" ) // Instancia o teste internamente
... // Resto do método
::Open() // Veja o proximo trecho onde tem esse método (logo abaixo)
RETURN Self
Código: Selecionar todos
/****m* TVladSQL/Open
*
* NAME
* Open
*
* DESCRIPTION
* Open connect with database
*
* SOURCE
*/
METHOD Open() CLASS TVladSQL
LOCAL nPort
DO CASE
CASE ::cDatabaseType = "PostgreSQL"
::oTest:Info( "..." ) // Aqui eu gero notificações <==============================
::cDatabasePort := hb_DefaultValue( ::cDatabasePort , "5432" )
IF ValType( ::cDatabasePort ) == "N"
nPort := ::cDatabasePort
ELSEIF ValType( ::cDatabasePort ) == "C"
nPort := VAL( ::cDatabasePort )
ENDIF
::oServer := TPQServer():New( ::cDatabaseAddress, ::cDatabaseName , ::cDatabaseUser, ::cDatabasePassword , nPort )
IF ::oServer:NetErr()
::lIsOpen := .f.
::cErrorMsg := ::oServer:ErrorMsg()
ELSE
::lIsOpen := .t.
::oServer:SetVerbosity( 2 )
::oServer:traceon( "simple.log" )
ENDIF
ENDCASE
::oTest:AddResult( "Error message : " , ::cErrorMsg ) // <================================== Aqui também e logo abaixo nas 2 próximas linhas
::oTest:AddResult( "Config data : " , " Address : " + ::cDatabaseAddress + " Databasename : " + ::cDatabaseName )
::oTest:Test( "Connect server" , ::lIsOpen , .t. ) // Se não passar grava no arquivo que falhou e adiciona os resultados coletados acima.
RETURN ::lIsOpen
/*****/
Feito isso eu posso criar uma rotina para testar esse método sob diversas condições, conforme o código abaixo.
Sempre que eu mudar algo no sistema eu rodo essa rotina para ver se ela não gera um alerta nos logs
Código: Selecionar todos
***
/*
TEST EXEC (Test_Exec)
*/
***
STATIC FUNCTION TVladSQL_Test_Exec()
LOCAL oTest := TVladTest():New( "Test_Exec / Execute command SQL in database" )
LOCAL cSQL
oTest:TestOn()
oTest:Title()
oTest:H1( "Execute drop table if exists" )
cSQL := "DROP TABLE IF EXISTS test1"
TVladSQL_Test_Exec_Main( oTest , cSQL )
oTest:H1( "Execute create table" ) //----------------------> Condição 1 (Tudo certo!)
cSQL := "CREATE TABLE test1 ( test varchar(50) )"
TVladSQL_Test_Exec_Main( oTest , cSQL )
oTest:H1( "Execute create table with error" ) // --------------------------> Condição 2 (Erro na digitação de um comando. Como o método se comporta ?)
cSQL := "CREATES ERRO PROPOSITAL NO MEIO DA SENTENCA TABLE test1 ( test varchar(50) )"
TVladSQL_Test_Exec_Main( oTest , cSQL )
// Posso ter outras condições aqui
RETURN NIL
*** Aqui é a função de testes
STATIC FUNCTION TVladSQL_Test_Exec_Main( oTest , cSQL )
LOCAL oSQL
oTest:TestOn()
oSQL := TVladSQL():New()
oSQL:TestOn()
oTest:Test( "Open connection" , oSQL:IsOpen() , .t. )
oSQL:Close()
RETURN NIL
Isso também pode ser feito dentro de funções.
Eu só estou postando a ideia geral. Existem casos particulares, como o cancelamento de baixa de pedido, que talvez não possa ser monitorada por testes. Mas desde que eu tenha coletado as diversas situações que acontecem eu posso criar um ambiente de testes e usar o log gerado dentro dos métodos ou funções.
Não é perfeito, mas para mim tem funcionado e me mostrado alguns erros bem difíceis de serem achados. Mais do que isso, ela me ajuda a antecipar algumas situações chatas.
Só não deixo ela gerando o arquivo de logs sempre pois acho que deixaria o sistema lento. Mas para testar eu sempre utilizo.