Domanda

Sto lavorando su un ambiente di test per un progetto e sto cercando di utilizzare DbUnit.NET per eseguire molti test di interazione con il database. Ho una domanda molto grande però:

Stiamo correndo contro Oracle e non è possibile impostare un'istanza DB di test separata per ogni sviluppatore (soprattutto perché abbiamo solo 1 DBA che è già a corto di tempo). Ciò significa che tutti gli sviluppatori e tutti i server di integrazione continua devono utilizzare lo stesso schema DB.

Quindi, alla domanda: esiste un buon modo per impedire a più di 1 persona di testare contemporaneamente? Sarebbe facile inserire un record in una tabella db che indica che un test è in esecuzione, quindi rimuoverlo al termine dei test, ma NUnit non ha alcun modo di eseguire qualcosa all'inizio e alla fine della sessione di test.

Qualche altro pensiero? Sembra che dovrebbe essere un problema piuttosto comune ... o tutti eseguono istanze DB separate per ogni sviluppatore / tester che potrebbe eseguire i test?

È stato utile?

Soluzione

Abbiamo usato una tabella fittizia con un singolo record come token di blocco quando abbiamo eseguito test di database per un gruppo di sviluppatori su un database condiviso. In realtà abbiamo acquisito il blocco per ogni caso di test singolarmente in modo che uno sviluppatore che desidera eseguire un caso di test non debba attendere che un altro sviluppatore che sta eseguendo l'intera suite finisca. Ogni test ha creato i propri dati - nessun riporto tra i metodi di test.

Abbiamo usato il meccanismo di blocco del database per mettere effettivamente in coda i test invece di fallire quando qualcun altro sta già eseguendo un test. Penso che l'algoritmo di blocco di Oracle sia un po 'diverso, quindi non so come funzionerebbe.

L'unico posto in cui abbiamo avuto problemi era quando uno sviluppatore voleva passare attraverso un test in modalità debug. Ciò avrebbe bloccato tutti gli altri sviluppatori che volessero eseguire un test fino a quando non avesse rilasciato il debugger. Abbiamo scritto il nome dell'utente corrente in una tabella fittizia e il meccanismo di blocco ha stampato un messaggio se è stato bloccato per più di 30 secondi: "Bob sta attualmente eseguendo un test ed è stato negli ultimi 5 minuti." p>

Questo andava bene, ma era un sacco di lavoro da mantenere. Abbiamo cercato di ridurre il numero di test del database e di eseguire la maggior parte dei nostri test come test unitari puri in memoria.

Altri suggerimenti

Puoi usare l'attributo [TestFixtureSetUp] per iniettare il tuo flag che indica che i test sono in esecuzione come un modo per simulare un " true " semaforo.

Qualcosa che ho fatto in un problema con alcune somiglianze con questo:

Il programma aveva una variabile di configurazione che veniva aggiunta all'inizio di tutti gli elementi rilevanti. Ogni stazione aveva la propria impostazione, correttamente impostata non ci sarebbero conflitti.

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