Domanda

Qualcuno ha qualche buon suggerimento per scrivere codice di test per lo sviluppo del backend del database in cui esiste una forte dipendenza dallo stato?

Nello specifico, voglio scrivere test per codice che recuperi record dal database, ma le risposte dipenderanno dai dati nel database (che potrebbero cambiare nel tempo).

Le persone di solito creano un sistema di sviluppo separato con un database "congelato" in modo che ogni determinata funzione restituisca sempre lo stesso identico set di risultati?

Sono abbastanza sicuro che questo non sia un problema nuovo, quindi sarei molto interessato a imparare dall'esperienza di altre persone.

Ci sono buoni articoli là fuori che discutono questo problema dello sviluppo basato sul web in generale?

Di solito scrivo codice PHP, ma mi aspetterei che tutti questi problemi siano in gran parte indipendenti dal linguaggio e dal framework.

È stato utile?

Soluzione

Dovresti esaminare DBUnit o provare a trovare un equivalente PHP (deve essercene uno là fuori).Puoi usarlo per preparare il database con un set specifico di dati che rappresenta i dati del tuo test, e quindi ogni test non dipenderà più dal database e da alcuni stati esistenti.In questo modo, ogni test è autonomo e non si interromperà durante l'ulteriore utilizzo del database.

Aggiornamento:Una rapida ricerca su Google ha mostrato a Estensione dell'unità DB per PHPUnit.

Altri suggerimenti

Se sei interessato principalmente ai test del livello dati, potresti dare un'occhiata a questo libro: Modelli di test xunità:Codice di test del refactoring.Ne sono sempre stato incerto anch'io, ma questo libro fa un ottimo lavoro per aiutare a enumerare preoccupazioni come prestazioni, riproducibilità, ecc.

Immagino che dipenda dal database che stai utilizzando, ma Red Gate (www.red-gate.com) crea uno strumento chiamato SQL Data Generator.Questo può essere configurato per riempire il tuo database con dati di test dall'aspetto sensato.Puoi anche dirgli di utilizzare sempre lo stesso seme nel suo generatore di numeri casuali in modo che i tuoi dati "casuali" siano sempre gli stessi.

È quindi possibile scrivere i test unitari per utilizzare questi dati affidabili e ripetibili.

Per quanto riguarda il test del lato web, attualmente sto esaminando Selenium (selenium.openqa.org).Sembra essere una suite di test compatibile con più browser che ti aiuterà a testare la funzionalità.Tuttavia, come con tutti questi strumenti di test dei siti Web, non esiste un modo reale per testare la bontà di queste cose Aspetto in tutti i browser senza che nessuno li controlli!

Utilizziamo un database in memoria (hsql: http://hsqldb.org/).Ibernazione (http://www.hibernate.org/) ci rende facile indirizzare i nostri test unitari al database di test, con l'ulteriore vantaggio che vengono eseguiti velocemente come un fulmine..

Ho lo stesso identico problema con il mio lavoro e trovo che l'idea migliore sia avere uno script PHP per ricreare il database e poi uno script separato in cui gli lancio dati pazzeschi per vedere se si rompe.

Non ho mai utilizzato alcun test unitario o simili, quindi non posso dire se funziona o meno, mi dispiace.

Se riesci a configurare il database con una quantità nota prima di eseguire i test e smontarlo alla fine, saprai con quali dati stai lavorando.

Quindi puoi utilizzare qualcosa come Selenium per testare facilmente dalla tua interfaccia utente (supponendo che qui sia basata sul Web, ma ci sono molti strumenti di test dell'interfaccia utente là fuori per altri gusti dell'interfaccia utente) e rilevare la presenza di determinati record estratti dal database.

Vale sicuramente la pena impostare una versione di prova del database o fare in modo che i tuoi script di test popolino il database con dati noti come parte dei test.

Potresti provare http://selenium.openqa.org/ è più per il test della GUI piuttosto che per un'applicazione di test del livello dati, ma registra le tue azioni che possono quindi essere riprodotte per automatizzare i test su diverse piattaforme.

Ecco la mia strategia (uso JUnit, ma sono sicuro che ci sia un modo per fare l'equivalente in PHP):

Ho un metodo che viene eseguito prima di tutti gli unit test per una specifica classe DAO.Mette il database di sviluppo in uno stato noto (aggiunge tutti i dati di test, ecc.).Mentre eseguo i test, tengo traccia di tutti i dati aggiunti allo stato noto.Questi dati vengono ripuliti alla fine di ogni test.Dopo che tutti i test per la classe sono stati eseguiti, un altro metodo rimuove tutti i dati del test nel database di sviluppo, lasciandolo nello stato in cui si trovava prima dell'esecuzione dei test.Fare tutto questo richiede un po' di lavoro, ma di solito scrivo i metodi in una classe DBTestCommon a cui possono accedere tutte le mie classi di test DAO.

Proporrei di utilizzare tre database.Un database di produzione, un database di sviluppo (riempito con alcuni dati significativi per ogni sviluppatore) e un database di test (con tabelle vuote e forse alcune righe sempre necessarie).

Un modo per testare il codice del database è:

  1. Inserisci alcune righe (usando SQL) per inizializzare lo stato
  2. Esegui la funzione che desideri testare
  3. Confrontare i risultati attesi con quelli effettivi.Qui potresti utilizzare il tuo normale framework di test unitario
  4. Pulisci le righe che sono state modificate (in modo che l'esecuzione successiva non vedrà l'esecuzione precedente)

La pulizia potrebbe essere eseguita in modo standard (ovviamente solo nel database di testing) con DELETE * FROM table.

In generale sono d'accordo con Peter, ma per creare ed eliminare i dati di test non utilizzerei direttamente SQL.Preferisco utilizzare alcune API CRUD utilizzate nel prodotto per creare dati il ​​più simili possibile alla produzione...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top