Ho l'abitudine di cercare sempre di differenziare il codice a livello di applicazione dal codice a livello di framework, quindi ho riscontrato il problema che stai descrivendo abbastanza spesso: di solito vuoi che tutto il codice a livello di framework sia testato prima che inizi il codice a livello di applicazione essere testato. Inoltre, anche all'interno del codice a livello di framework, tendono ad esserci alcuni moduli di framework fondamentali che vengono utilizzati da tutti gli altri moduli framework e, se qualcosa non funziona nei fondamentali, non c'è davvero alcun motivo per testare qualcos'altro.
Sfortunatamente, i fornitori di framework di test tendono ad avere idee un po 'rigide su come le loro creazioni sono destinate ad essere utilizzate, e sono piuttosto protettive rispetto a quelle idee, mentre le persone che usano i loro framework tendono ad accettare l'uso previsto senza fare domande. Questo è problematico, perché soffoca la sperimentazione e l'innovazione. Non so di tutti gli altri, ma preferirei avere la libertà di provare a fare qualcosa in un modo strano, e vedere da solo se i risultati sono migliori o peggiori rispetto al modo stabilito, piuttosto che non avere la libertà di fai le cose a modo mio in primo luogo.
Quindi, a mio parere, le dipendenze dei test sarebbero una cosa fantastica e, al posto di ciò, la possibilità di specificare l'ordine in cui verranno eseguiti i test sarebbe la cosa migliore.
L'unico modo in cui ho trovato di affrontare il problema di ordinare i test è un'attenta denominazione, in modo da sfruttare la tendenza dei framework di test per eseguire test in ordine alfabetico.
Non so come funzioni in Visual Studio, perché devo ancora fare qualsiasi cosa che implichi test approfonditi con C #, ma nella parte Java del mondo funziona come segue: Sotto la cartella sorgente di un progetto di solito abbiamo due sottocartelle, una chiamata "main", contenente il codice di produzione e una chiamata "test", contenente il codice di test. Sotto "main" abbiamo una gerarchia di cartelle che corrisponde esattamente alla gerarchia dei pacchetti del nostro codice sorgente. I pacchetti Java corrispondono approssimativamente agli spazi dei nomi C #. C # non richiede di associare la gerarchia di cartelle alla gerarchia di namespace, ma è consigliabile farlo.
Ora, ciò che le persone di solito fanno nel mondo Java è che nella cartella "test" loro rispecchiano la gerarchia delle cartelle trovata nella cartella "principale", in modo che ogni test risieda in lo stesso pacchetto esatto della classe che prova. La logica alla base di questo è che molto spesso la classe di test ha bisogno di accedere ai membri del pacchetto privato della classe sotto test, quindi la classe di test deve essere nello stesso pacchetto della classe sotto test. Nel lato C # del mondo non esiste la visibilità locale dei namespace, quindi non c'è ragione di specchiare le gerarchie delle cartelle, ma penso che i programmatori C # seguano più o meno la stessa disciplina nella strutturazione delle loro cartelle.
In ogni caso, trovo tutta questa idea di permettere alle classi di test di avere accesso ai membri del pacchetto locale delle classi sotto test errate, perché tendo a testare le interfacce, non le implementazioni. Quindi, la gerarchia delle cartelle dei miei test non deve rispecchiare la gerarchia delle cartelle del mio codice di produzione.
Quindi, quello che faccio è che nomino le cartelle (cioè i pacchetti) dei miei test come segue:
t001_SomeSubsystem
t002_SomeOtherSubsystem
t003_AndYetAnotherSubsystem
...
Questo garantisce che tutti i test per "SomeSubsystem" saranno eseguiti prima di tutti i test per "SomeOtherSubsystem", che a loro volta saranno tutti eseguiti prima di tutti i test per "AndYetAnotherSubsystem", e così via, e così via.
All'interno di una cartella, i singoli file di test sono denominati come segue:
T001_ThisTest.java
T002_ThatTest.java
T003_TheOtherTest.java
Ovviamente, è di grande aiuto che i moderni IDE abbiano potenti capacità di refactoring che ti permettono di rinominare interi pacchetti (e tutti i sotto-pacchetti e tutto il codice che li fa riferimento) con solo un paio di clic e sequenze di tasti.