Eu tenho o hábito de sempre tentar diferenciar o código no nível do aplicativo do código no nível da estrutura, por isso encontrei o problema que você está descrevendo com frequência: geralmente você deseja que todo o código no nível da estrutura seja testado antes que qualquer código no nível do aplicativo comece a ser testado. . Além disso, mesmo dentro do código no nível da estrutura, costuma haver alguns módulos de estrutura fundamentais que são usados por todos os outros módulos de estrutura e, se algo falhar nos fundamentos, não há sentido em testar outra coisa.
Infelizmente, os fornecedores de estruturas de teste tendem a ter idéias um pouco rígidas sobre como suas criações devem ser usadas e são bastante protetores dessas idéias, enquanto as pessoas que usam suas estruturas tendem a aceitar o uso pretendido sem questionar. Isso é problemático, porque sufoca a experimentação e a inovação. Não conheço todos os outros, mas prefiro ter a liberdade de tentar fazer algo de uma maneira estranha e ver por mim mesmo se os resultados são melhores ou piores do que o estabelecido, em vez de não ter a liberdade de fazê-lo. faça as coisas do meu jeito em primeiro lugar.
Portanto, na minha opinião, as dependências de teste seriam uma coisa impressionante de se ter, e, em vez disso, a capacidade de especificar a ordem em que os testes serão executados seria a próxima melhor coisa.
A única maneira que encontrei para abordar a questão de ordenar testes é por nomeação cuidadosa, de modo a explorar a tendência de estruturas de teste para executar testes em ordem alfabética.
Não sei como isso funciona no Visual Studio, porque ainda preciso fazer qualquer coisa que envolva testes extensivos com C #, mas no lado Java do mundo funciona da seguinte maneira: Na pasta de origem de um projeto, geralmente temos duas subpastas, um chamado "principal", contendo o código de produção, e um chamado "teste", contendo o código de teste. Em "main", temos uma hierarquia de pastas que corresponde exatamente à hierarquia de pacotes do nosso código-fonte. Os pacotes Java correspondem aproximadamente aos namespaces C #. O C # não exige que você corresponda a hierarquia de pastas à hierarquia de namespace, mas é recomendável fazê-lo.
Agora, o que as pessoas costumam fazer no mundo Java é que, na pasta "test", elas espelham a hierarquia de pastas encontrada na pasta "main", para que cada teste resida exatamente no mesmo pacote da classe que ele testa. A lógica por trás disso é que, com frequência, a classe de teste precisa acessar membros privados da classe em teste, portanto, a classe de teste precisa estar no mesmo pacote que a classe em teste. No lado C # do mundo, não existe visibilidade local para namespaces; portanto, não há razão para espelhar as hierarquias de pastas, mas acho que os programadores de C # seguem mais ou menos a mesma disciplina na estruturação de suas pastas.
De qualquer forma, acho que toda essa idéia de permitir que as classes de teste tenham acesso a membros locais de pacotes das classes sob teste é equivocada, porque eu tendem a testar interfaces, não implementações. Portanto, a hierarquia de pastas dos meus testes não precisa espelhar a hierarquia de pastas do meu código de produção.
Então, o que faço é nomear as pastas (ou seja, os pacotes) dos meus testes da seguinte maneira:
t001_SomeSubsystem
t002_SomeOtherSubsystem
t003_AndYetAnotherSubsystem
...
Isso garante que todos os testes para "SomeSubsystem" serão executados antes de todos os testes para "SomeOtherSubsystem", que por sua vez serão executados antes de todos os testes para "AndYetAnotherSubsystem" e assim por diante.
Dentro de uma pasta, os arquivos de teste individuais são nomeados da seguinte maneira:
T001_ThisTest.java
T002_ThatTest.java
T003_TheOtherTest.java
Obviamente, isso ajuda muito os IDEs modernos a terem poderosos recursos de refatoração que permitem renomear pacotes inteiros (e todos os subpacotes e todo o código que os referencia) com apenas alguns cliques e pressionamentos de tecla.