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?


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.


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ą.


1
To tak naprawdę nie odpowiada na pytanie.
— RubberDuck,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.