Mam zwyczaj zawsze próbować odróżnić kod poziomu aplikacji od kodu poziomu środowiska, więc napotkałem problem, który opisujesz dość często: zwykle chcesz, aby cały kod poziomu środowiska był testowany, zanim jakikolwiek kod poziomu aplikacji zacznie być testowany . Ponadto, nawet w ramach kodu na poziomie frameworka, istnieją pewne podstawowe moduły frameworka, które są używane przez wszystkie inne moduły frameworka, a jeśli coś zawiedzie w podstawach, naprawdę nie ma sensu testować niczego innego.
Niestety, dostawcy platform testowych zwykle mają dość sztywne poglądy na temat tego, w jaki sposób ich twórczość ma być wykorzystywana, i raczej chronią te pomysły, podczas gdy ludzie, którzy używają ich frameworków, akceptują zamierzone użycie bez pytania. Jest to problematyczne, ponieważ hamuje eksperymenty i innowacje. Nie wiem o wszystkich innych, ale wolałbym mieć swobodę, aby spróbować zrobić coś w dziwny sposób i przekonać się, czy wyniki są lepsze czy gorsze niż ustalony sposób, niż nie mieć wolności róbcie wszystko po swojemu.
Tak więc, moim zdaniem, zależności testowe byłyby niesamowitą rzeczą, a zamiast tego możliwość określenia kolejności wykonywania testów byłaby następną najlepszą rzeczą.
Jedynym sposobem, w jaki znalazłem rozwiązanie problemu zamawiania testów, jest staranne nazewnictwo, aby wykorzystać tendencję ram testowania do wykonywania testów w kolejności alfabetycznej.
Nie wiem, jak to działa w Visual Studio, ponieważ jeszcze nie zrobiłem nic, co wymagałoby obszernych testów w języku C #, ale po stronie Java działa to w następujący sposób: pod folderem źródłowym projektu zwykle mamy dwa podfoldery, jeden o nazwie „główny” zawierający kod produkcyjny, a drugi o nazwie „test” zawierający kod testowy. Pod „main” mamy hierarchię folderów, która dokładnie odpowiada hierarchii pakietów naszego kodu źródłowego. Pakiety Java w przybliżeniu odpowiadają przestrzeniom nazw C #. C # nie wymaga dopasowania hierarchii folderów do hierarchii przestrzeni nazw, ale zaleca się to zrobić.
Teraz ludzie zwykle robią w świecie Java, że w folderze „test” odzwierciedlają hierarchię folderów znajdującą się w folderze „głównym”, dzięki czemu każdy test znajduje się w dokładnie tym samym pakiecie co testowana klasa. Uzasadnieniem tego jest to, że dość często klasa testująca musi mieć dostęp do prywatnych członków testowanej klasy, więc klasa testowa musi znajdować się w tym samym pakiecie co klasa testowana. Po stronie C # na świecie nie ma czegoś takiego jak widoczność lokalna w przestrzeni nazw, więc nie ma powodu, aby odzwierciedlać hierarchie folderów, ale myślę, że programiści C # mniej więcej przestrzegają tej samej dyscypliny w tworzeniu folderów.
W każdym razie uważam, że cały pomysł umożliwienia klasom testującym dostępu do lokalnych członków pakietów testowanych klas jest błędny, ponieważ mam tendencję do testowania interfejsów, a nie implementacji. Hierarchia folderów moich testów nie musi więc odzwierciedlać hierarchii folderów mojego kodu produkcyjnego.
Tak więc nazywam foldery (czyli pakiety) moich testów w następujący sposób:
t001_SomeSubsystem
t002_SomeOtherSubsystem
t003_AndYetAnotherSubsystem
...
Gwarantuje to, że wszystkie testy dla „SomeSubsystem” zostaną wykonane przed wszystkimi testami dla „SomeOtherSubsystem”, które z kolei wszystkie zostaną wykonane przed wszystkimi testami dla „AndYetAnotherSubsystem” i tak dalej, i tak dalej.
W folderze poszczególne pliki testowe mają następujące nazwy:
T001_ThisTest.java
T002_ThatTest.java
T003_TheOtherTest.java
Oczywiście bardzo pomaga to, że współczesne IDE mają potężne możliwości refaktoryzacji, które pozwalają zmieniać nazwy całych pakietów (i wszystkich podpakietów oraz całego kodu, który się do nich odwołuje) za pomocą kilku kliknięć i naciśnięć klawiszy.