in

DotNetMarche

.NET Framework User Group delle Marche

rollback operazioni su db in fase di test...HELP!

Last post 15 Nov 2007 2:58 by filippo. 14 replies.
Page 1 of 1 (15 items)
Sort Posts: Previous Next
  • 07 Nov 2007 2:19

    rollback operazioni su db in fase di test...HELP!

    salve sono uno studente di ingegneria informatica abbastanza incapace. Sto affrontando la problematica dello sviluppo guidato da test.

    Ho il seguente problema:quando vado ad eseguire un test di un metodo che ad esempio effettua l'inserimento di un record in una tabella del mio database e il test va a buon fine, mi ritroverò da quel momento in poi un record indesiderato nel mio database (praticamente ho sporcato il mio database). lo stesso se testo un metodo che cancella dati sul mio db. rischio di mettere in pericolo seriamente la consistenza del mio database. Bene, cercavo un metodo per effettuare (diciamo così...) un rollback delle operazioni effettuate sul db in fase di test, praticamente, un metodo per annullare le operazioni effettuate sul db all'interno del mio unit test.

    Sto lavorando in Visual studio.

    Sarebbe fantastico se potrei fare tutto con 2 semplici istruzioncine, una che mi "tagga" il db in un determinato momento e una che mi permette di ripristinare il db in quel preciso momento; praticamente con la seguente struttura:

    All'interno della unit test: 

    1 - fisso il db in un punto

    2 - eseguo il metodo che al proprio interno contiene istruzioni che lavorano sul db, che in pratica sporcano il db

    3 - riporto il database nella situazione precedente all'esecuzione del metodo, in pratica alla situazione in cui si trovava all'inizio del test

    se qualcuno ha qualche soluzione che fa al caso mio lo prego di aiutarmi con esempi pratici.

    Vi andrebbe di darmi una mano?grazie mille comunque e scusatemi per il disturbo.

  • 07 Nov 2007 2:27 In reply to

    Re: rollback operazioni su db in fase di test...HELP!

    filippo:

    salve sono uno studente di ingegneria informatica abbastanza incapace. Sto affrontando la problematica dello sviluppo guidato da test.

    Ho il seguente problema:quando vado ad eseguire un test di un metodo che ad esempio effettua l'inserimento di un record in una tabella del mio database e il test va a buon fine, mi ritroverò da quel momento in poi un record indesiderato nel mio database (praticamente ho sporcato il mio database). lo stesso se testo un metodo che cancella dati sul mio db. rischio di mettere in pericolo seriamente la consistenza del mio database. Bene, cercavo un metodo per effettuare (diciamo così...) un rollback delle operazioni effettuate sul db in fase di test, praticamente, un metodo per annullare le operazioni effettuate sul db all'interno del mio unit test.

    Sto lavorando in Visual studio.

    Sarebbe fantastico se potrei fare tutto con 2 semplici istruzioncine, una che mi "tagga" il db in un determinato momento e una che mi permette di ripristinare il db in quel preciso momento; praticamente con la seguente struttura:

    All'interno della unit test: 

    1 - fisso il db in un punto

    2 - eseguo il metodo che al proprio interno contiene istruzioni che lavorano sul db, che in pratica sporcano il db

    3 - riporto il database nella situazione precedente all'esecuzione del metodo, in pratica alla situazione in cui si trovava all'inizio del test

    se qualcuno ha qualche soluzione che fa al caso mio lo prego di aiutarmi con esempi pratici.

    Vi andrebbe di darmi una mano?grazie mille comunque e scusatemi per il disturbo.

     

    Allora il problema che dici è abbastanza comune, e la soluzione che ti propongo è direi immediata anche se non so se è ottimale

    NUnit possiede specifici attributi per impostare dei metodi da eseguire all'inizio e alla fine di una batteria di test (TextFixtureSetUp e  TextFixtureTearDown) e all'inizio e alla fine di ogni test (SetUp e TearDown). Sono questi i metodi che devi usare per inizializzare e ripulire in database e impostarlo ad uno stato consistente con i tuoi test: infatti una delle regole più importanti nei test è che devono essere indipendenti, ovvero non dipendere dall'esecuzione di altri test precedenti o influenzare test successivi.

    Quello che puoi fare ad esempio è creare lo schema all'inizio di una serie di test, ripulire le tabelle dopo ogni test, e cancellare lo schema dopo ogni batteria di test.

    Come farlo poi dipende da cosa usi, ma è un dettaglio di implementazione. 

  • 07 Nov 2007 3:14 In reply to

    Re: rollback operazioni su db in fase di test...HELP!

    io vorrei automatizzare la procedura di salvataggio del database in un punto e poi quella di ripristino in quel punto... come dici tu riesco a fare tutto in automatico?

    mi basterebbero anche 2 semplici istruzioni sql... capisci?

    fisso il db anche con una semplice istruzione, testo il metodo e ripristino il db nelle condizioni iniziali..

    che mi dici?

    cmq ho letto in vari blog che non è ottimale l'utilizzo di questi metodi di n-unit...

    grazie mille!!!

     

  • 07 Nov 2007 3:26 In reply to

    Re: rollback operazioni su db in fase di test...HELP!

    Butto li alcune considerazioni sparse, in attesa del ritorno del nostro Test Guru dal TechEd Wink

    • un modo penso rapido possa essere semplicemente avere un backup del database e semplicemente farne il restore prima di eseguire i test, così da ripartire da una situazione pulita (o se usi dei database costituiti da soli file, come un Access, Sql Compact Edition,...) basta che copi i file

    • invece di testare direttamente sul database, puoi utilizzare dei mock object e testare su db solo l'effettivo DAL

  • 07 Nov 2007 3:41 In reply to

    Re: rollback operazioni su db in fase di test...HELP!

    vi chiedo scusa ma ero già a conoscenza di queste metodologie sia "backup - restore" (che cmq impiegherebbe moltissimo tempo e non posso permettermelo) e sia la strada che prevede di "mockare" l'accesso al db (soluzione che sarebbe l'ottimale)...

    il problema grandissimo è che io sono abbastanza "imbranato" per quanto riguarda questi aspetti che affronto per la prima volta e avrei bisogno di esempi pratici, guide on line possibilmente in italiano, e quant'altro potrebbe aiutarmi perchè ho letto tantissime notizie a riguardo ma per quanto riguarda la pratica veramente poco o nulla!!!....e io non so dove sbattere la testa....

    per favore datemi una mano...

    grazie infinite

     

  • 07 Nov 2007 4:09 In reply to

    Re: rollback operazioni su db in fase di test...HELP!

    prova a vedere questo http://www.c-sharpcorner.com/UploadFile/mosessaur/TransactionScope04142006103850AM/TransactionScope.aspx

    in realta' nel mio hd ho un esempio piu' calzante per i test, ma in generale la classe transactionscope fa per te, solo che ricorda che devi avere attivato il MSDTC. controlla anche questo http://weblogs.asp.net/rosherove/archive/2004/10/05/238201.aspx

    Hasta la vista :D

    Alk.

    --
    Continua ciò che hai cominciato e forse arriverai alla cima, o almeno arriverai in alto ad un punto che tu solo comprenderai non essere la cima. (Seneca)
    Alkampfer's Place
  • 08 Nov 2007 4:20 In reply to

    Re: rollback operazioni su db in fase di test...HELP!

    sto provANDO AD UTILIZZARE transactionscope ma senza dare il ".complete" alla fine non riesco comunque a fare il rollback delle operazioni all'interno della transazione... da tutte le documentazioni utilizzate ho letto che se non metto il "---.complete" alla fine non viene data la commit alle operazioni interne alla transactionscope...praticamente sto provando l'inserimento di un record all'interno di transactionscope; alla fine non dò il ".complete" ma il record rimane comunque memorizzato...

    perchè tutto questo? PUò dipendere dal fatto che non ho attivato il MSDTC? COME LO ATTIVO? GRAZIE!

  • 08 Nov 2007 6:41 In reply to

    Re: rollback operazioni su db in fase di test...HELP!

     

    scusate???.... come mai non riesco a far funzionare transactionscope??????

    mi esegue sempre la committtttttt.... help me....per favore ..io voglio che faccia semplicemente il rollback di tutto...

  • 09 Nov 2007 1:35 In reply to

    Re: rollback operazioni su db in fase di test...HELP!

    Posta un esempio minimale di codice, perche' mi pare strano, posta la connection string che usi etc etc.. in generale quando chiami il dispose del transactionscope senza fare commit la transazione viene rollbackata, metti un profiler sull'istanza di sql e vedi i comandi che passano per assicurarti che la transazione sia iniziata.

    Alk.

    --
    Continua ciò che hai cominciato e forse arriverai alla cima, o almeno arriverai in alto ad un punto che tu solo comprenderai non essere la cima. (Seneca)
    Alkampfer's Place
  • 09 Nov 2007 2:34 In reply to

    Re: rollback operazioni su db in fase di test...HELP!

    Using scope As TransactionScope = New TransactionScope()

    Dim cnnSQL As New Odbc.OdbcConnection

    Dim cmdSQL As New Odbc.OdbcCommand

    Dim strSQL As String

    'imposto stringa di connessione al mio db...

    Const strDB = "DSN=___;uid=___;Pwd=___"

    cnnSQL.ConnectionString = strDB

    cnnSQL.Open()

    strSQL = "Insert into test.proviamo VALUES (123, 'MidWestern','poi')"

    cmdSQL = New Odbc.OdbcCommand(UCase(strSQL), cnnSQL)

    cmdSQL.ExecuteNonQuery()

    cnnSQL.Close()

     

    scope.Dispose()

    End Using

    Questo è un esempio che stavo utilizzando per provare la transactionscope.....

    Secondo quanto detto nelle varie documentazioni della transaction scope la insert interna dovrebbe essere "rollbackata"...invece il record viene inserito e rimane memorizzato...

    perchè tutto questo? Grazie..

     

  • 11 Nov 2007 7:33 In reply to

    Re: rollback operazioni su db in fase di test...HELP!

    Ma il database cosa è, access? se è sqlserver utilizza la sqlclient invece della oledbconnection.

    alk. 

    --
    Continua ciò che hai cominciato e forse arriverai alla cima, o almeno arriverai in alto ad un punto che tu solo comprenderai non essere la cima. (Seneca)
    Alkampfer's Place
  • 12 Nov 2007 3:29 In reply to

    Re: rollback operazioni su db in fase di test...HELP!

    Il mio db è mysql... con mysql mi sembra non si possa utilizzare la sql client...vero?

    quindi con un db mysql non posso utilizzare la transactionscope?

    ciao. grazie...

  • 12 Nov 2007 7:25 In reply to

    Re: rollback operazioni su db in fase di test...HELP!

     Purtroppo io mysql lo conosco poco, il problema è che se lui non supoprta MSDTC sicuramente non va il transactionscope, e visto che dal tuo codice mi sembra tutto ok....penso che purtroppo non sia supportato.

    Nulla ti impedisce però di creare la transazione manualmente perchè mysql è comunque transazionale, solo che se tu hai una architettura con DAo o cose del genere devi studiare bene il tutto.  Cmq da un'oggetto connection puoi inizare una tranzazione che poi assegni ai singoli command, alla fine puoi fare cmq rollback

    Alk. 

    --
    Continua ciò che hai cominciato e forse arriverai alla cima, o almeno arriverai in alto ad un punto che tu solo comprenderai non essere la cima. (Seneca)
    Alkampfer's Place
  • 14 Nov 2007 3:56 In reply to

    Re: rollback operazioni su db in fase di test...HELP!

    Mi inserisco un attimo: non so molto di unit test e di transactionscope.
    Però recentemente ho utilizzato MySQL in ambito .NET. Se usi una versione vecchiotta di MySQL, fa attenzione che le tabelle che stai utilizzando siano del tipo opportuno.
    Le tabelle vecchie non hanno il supporto delle transazioni (ad esempio le MyISAM).

    Altra cosa: al posto di usare OleDb puoi usare il Connector .NET specifico che accede nativamente a MySQL. Puoi scaricarlo direttamente dal sito di MySQL: http://www.mysql.com/products/connector/net/

    Ciao, Alessandro

  • 15 Nov 2007 2:58 In reply to

    Re: rollback operazioni su db in fase di test...HELP!

    il problema è semplicissimo....all'interno dei miei test,  vado a testare delle funzioni che al loro interno implementano inserimenti cancellazioni e modifiche al database... il discorso delle transazioni in teoria è ciò di cui ho bisogno, perchè ciò che voglio realizzare è rollbacckare le modifiche che la mia funzione esegue sul db...non so perchè ma ho provato ad implementare il meccanismo delle ttransazioni in tantissimi modi ma nessuna mi ha permesso di trovare la soluzione giusta, nessuna implementazioni mi realizza il rollback di cui ho bisogno...forse perchè all interno della mia funzione di insert delete o update la commit (l'istruzione che rende permanente la modifica sul db) viene data in automatico e non può essere così rollbackata...

    potete aiutarmi? al momento la soluzione più accettabile e forse l'unica attuabile è fare una copia (backup) della tabella prima dell' esecuzione della funzione che lavora sulla tabella stessa  e recuperarla (tramite un restore) dopo l'esecuzione del modulo, della funzione...ma quanto appena detto non è una soluzione efficiente ed economica soprattutto in termini di tempo...

    grazie

     

Page 1 of 1 (15 items)
Powered by Community Server (Commercial Edition), by Telligent Systems