J'ai l'habitude d'essayer toujours de différencier le code au niveau de l'application du code au niveau du framework, j'ai donc rencontré le problème que vous décrivez assez souvent: vous voulez généralement que tout le code au niveau du framework soit testé avant que n'importe quel code au niveau de l'application commence à être testé . De plus, même dans le code au niveau du framework, il y a généralement des modules de framework fondamentaux qui sont utilisés par tous les autres modules de framework, et si quelque chose échoue dans les fondamentaux, il n'y a vraiment aucun intérêt à tester autre chose.
Malheureusement, les fournisseurs de frameworks de test ont tendance à avoir des idées quelque peu rigides sur la façon dont leurs créations sont censées être utilisées, et sont plutôt protecteurs de ces idées, tandis que les personnes qui utilisent leurs frameworks ont tendance à accepter l'utilisation prévue sans remettre en question. C'est problématique, car cela étouffe l'expérimentation et l'innovation. Je ne sais pas pour tout le monde, mais je préférerais avoir la liberté d'essayer de faire quelque chose d'une manière étrange, et voir par moi-même si les résultats sont meilleurs ou pires que la manière établie, plutôt que de ne pas avoir la liberté de faire les choses à ma façon en premier lieu.
Donc, à mon avis, les dépendances de test seraient une chose géniale à avoir, et au lieu de cela, la possibilité de spécifier l'ordre dans lequel les tests seront exécutés serait la prochaine meilleure chose.
Le seul moyen que j'ai trouvé pour résoudre le problème de la commande des tests est de nommer soigneusement, afin d'exploiter la tendance des frameworks de test à exécuter des tests dans l'ordre alphabétique.
Je ne sais pas comment cela fonctionne dans Visual Studio, car je n'ai encore rien fait impliquant des tests approfondis avec C #, mais du côté Java du monde, cela fonctionne comme suit: sous le dossier source d'un projet, nous avons généralement deux sous-dossiers, un appelé "principal", contenant le code de production, et un appelé "test", contenant le code de test. Sous "principal", nous avons une hiérarchie de dossiers qui correspond exactement à la hiérarchie des packages de notre code source. Les packages Java correspondent grosso modo aux espaces de noms C #. C # ne vous oblige pas à faire correspondre la hiérarchie des dossiers à la hiérarchie de l'espace de noms, mais il est conseillé de le faire.
Maintenant, ce que les gens font habituellement dans le monde Java, c'est que sous le dossier "test", ils reflètent la hiérarchie des dossiers trouvée sous le dossier "principal", de sorte que chaque test réside dans le même package que la classe qu'il teste. La raison derrière cela est que, souvent, la classe testing doit accéder aux membres privés du package de la classe testée, de sorte que la classe testing doit être dans le même package que la classe testée. Du côté C # du monde, la visibilité locale de l'espace de noms n'existe pas, il n'y a donc aucune raison de refléter les hiérarchies de dossiers, mais je pense que les programmeurs C # suivent plus ou moins la même discipline dans la structuration de leurs dossiers.
Dans tous les cas, je trouve erronée toute cette idée de permettre aux classes de test d'avoir accès aux membres package-local des classes sous test, car j'ai tendance à tester les interfaces, pas les implémentations. Ainsi, la hiérarchie des dossiers de mes tests n'a pas à refléter la hiérarchie des dossiers de mon code de production.
Donc, ce que je fais, c'est que je nomme les dossiers (c'est-à-dire les packages) de mes tests comme suit:
t001_SomeSubsystem
t002_SomeOtherSubsystem
t003_AndYetAnotherSubsystem
...
Cela garantit que tous les tests de "SomeSubsystem" seront exécutés avant tous les tests de "SomeOtherSubsystem", qui à leur tour seront tous exécutés avant tous les tests de "AndYetAnotherSubsystem", etc., et ainsi de suite.
Dans un dossier, les fichiers de test individuels sont nommés comme suit:
T001_ThisTest.java
T002_ThatTest.java
T003_TheOtherTest.java
Bien sûr, il est très utile que les IDE modernes disposent de puissantes capacités de refactorisation qui vous permettent de renommer des packages entiers (et tous les sous-packages, et tout le code qui les référence) en quelques clics et touches.