Ho l'abitudine di provare sempre a 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 testare tutto il codice a livello di framework prima che qualsiasi codice a livello di applicazione inizi a essere testato . Inoltre, anche all'interno del codice a livello di framework, ci sono alcuni moduli di framework fondamentali che vengono utilizzati da tutti gli altri moduli di framework e, se qualcosa non funziona nei fondamenti, non ha davvero senso provare qualcos'altro.
Sfortunatamente, i fornitori di framework di test tendono ad avere idee un po 'rigide su come le loro creazioni devono essere utilizzate e sono piuttosto protettive di tali idee, mentre le persone che usano i loro framework tendono ad accettare l'uso previsto senza mettere in discussione. Questo è problematico, perché soffoca la sperimentazione e l'innovazione. Non conosco tutti gli altri, ma preferirei avere la libertà di provare a fare qualcosa in modo strano e vedere di persona se i risultati sono migliori o peggiori di quelli stabiliti, piuttosto che non avere la libertà di fare le cose a modo mio in primo luogo.
Quindi, a mio avviso, le dipendenze dei test sarebbero una cosa meravigliosa da avere, e al posto di ciò, la possibilità di specificare l'ordine in cui verranno eseguiti i test sarebbe la cosa migliore da fare.
L'unico modo che ho trovato per affrontare il problema dei test di ordinamento è quello di nominare con cura, in modo da sfruttare la tendenza dei framework di test per eseguire i test in ordine alfabetico.
Non so come funziona in Visual Studio, perché non ho ancora fatto nulla che implichi test approfonditi con C #, ma nella parte Java del mondo funziona come segue: Nella cartella di origine di un progetto di solito abbiamo due sottocartelle, uno chiamato "main", contenente il codice di produzione e uno chiamato "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 abbinare la gerarchia di cartelle alla gerarchia dello spazio dei nomi, ma è consigliabile farlo.
Ora, ciò che le persone di solito fanno nel mondo Java è che nella cartella "test" rispecchiano la gerarchia di cartelle che si trova nella cartella "main", in modo che ogni test risieda nello stesso pacchetto esatto della classe che verifica. La logica alla base di ciò è che molto spesso la classe testing deve accedere ai membri del pacchetto privato della classe sotto test, quindi la classe testing deve trovarsi nello stesso pacchetto della classe sotto test. Nel lato C # del mondo non esiste qualcosa come la visibilità locale dello spazio dei nomi, quindi non c'è motivo di rispecchiare le gerarchie di 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 consentire alle classi di test di avere accesso ai membri del pacchetto locale delle classi sotto test errate, perché tendo a testare interfacce, non implementazioni. Pertanto, la gerarchia di cartelle dei miei test non deve rispecchiare la gerarchia di cartelle del mio codice di produzione.
Quindi, quello che faccio è nominare le cartelle (ovvero i pacchetti) dei miei test come segue:
t001_SomeSubsystem
t002_SomeOtherSubsystem
t003_AndYetAnotherSubsystem
...
Ciò garantisce che tutti i test per "SomeSubsystem" verranno eseguiti prima di tutti i test per "SomeOtherSubsystem", che a loro volta verranno 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
Naturalmente, è di grande aiuto che gli IDE moderni dispongano di potenti capacità di refactoring che consentano 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.