Dlaczego atrybuty testowania jednostkowego zwykle wymagają publicznych metod?

12

Niedawno zauważyłem, że dodanie [TestInitialize] do metody chronionej w zestawie .NET nie było przestrzegane, ale jeśli podałem tę metodę do publicznej wiadomości, zostanie ona wywołana przez moduł uruchamiający testy jednostkowe (w tym przypadku Resharper). Zauważyłem to kilka razy w przeszłości za pomocą metod testowych.

Technicznie rzecz biorąc, tak samo łatwo jest zastanowić się nad metodą prywatną jak metodą publiczną. W rzeczywistości refleksja jest metodą stosowaną do jednostkowego testowania metod prywatnych.

Dlaczego więc muszę upublicznić wszystkie moje metody testów jednostkowych?

Justin Dearing
źródło
2
To naprawdę dobre pytanie. Jedynym dobrym argumentem, jaki słyszałem, jest to, że kieruje się zasadą „program do interfejsu, a nie do implementacji”, część zasad SOLID.
Robert Harvey,
9
Nie sądzę, żeby mówił o testowaniu swoich klas, mówił o rzeczywistych metodach testowych wywoływanych przez środowisko testowe.
jtiger
1
@RobertHarvey w Javie, powodem podobnych ograniczeń (np. W JUnit) jest to, że projektanci frameworka nie chcą zadzierać z setAccessiblektórymi może zostać zablokowany przez jakiegoś niestandardowego SecurityManagera
gnat
1
należy wziąć pod uwagę, że ta decyzja projektowa została podjęta w ramach ogólnego zastosowania ukierunkowanych na szerokie zastosowanie. W takich przypadkach projektantom jest po prostu bezpieczniej przyjąć i przygotować się na najgorsze. Jeśli byłby to, nie wiem, jakiś wewnętrzny system firmy (w którym można mieć szansę zagwarantować pożądaną politykę bezpieczeństwa), lub jeśli byłby to jakieś narzędzie o wąskim, specjalistycznym celu (pomyśl „przeglądarka dla niedostępnych członków”), projektant miałbym inne opcje do rozważenia
komnata
2
@GregBurghardt Takie zachowanie można znaleźć w Nunit i prawdopodobnie inne ramy testowe, których Microsoft nie napisał. Jasne, odkąd zadałem to pytanie, dużo lepiej rozumiem .NET, ale nadal uważam, że jest to uczciwe pytanie, aw komentarzach jest dobra dyskusja.
Justin Dearing

Odpowiedzi:

2

Powinieneś przetestować, co robi klasa , a nie jak to robi.

Jeśli chodzi o „świat zewnętrzny”, to wszystko, co klasa udostępnia publicznie; twoje środowisko testowe przyjmuje to samo założenie.

Testując coś „mniej” niż publiczne, zagłębiasz się w wewnętrzną implementację klasy, co jest złym pomysłem.

Phill W.
źródło
Pamiętaj, że pytanie dotyczy metod testowych, a nie metod w testowanym systemie. Chociaż prawdą jest, że OP twierdzi, że można użyć refleksji do testowania rzeczy „mniej” niż publiczne, to jest to argument o zdolności środowisk testowych do uzyskiwania dostępu do metod prywatnych. Struktura testowa musi używać refleksji, aby znaleźć metody testowe (oznaczone atrybutem), a zatem musi używać refleksji, mając na uwadze to ... „dlaczego muszę upubliczniać wszystkie moje metody testowania jednostkowego?”
Theraot
Metody testowe mają możliwość dostępu do metod prywatnych; dzięki Reflection wszystko jest możliwe. Widzę to pytanie bardziej o [nie] celowości zrobienia tego.
Phill W.
0

Zasadniczo najlepiej jest uzyskiwać dostęp tylko do metod publicznych - podczas tworzenia klasy tworzysz również umowę określającą, które inne klasy powinny uzyskać dostęp do Twojego kodu. Więc odpowiedź jest najprawdopodobniej tylko dlatego, że jest konwencją.

Vetle
źródło
1
To tak naprawdę nie odpowiada na pytanie.
RubberDuck,