Wpis z mikrobloga

Witam Mireczki i Mirabelki

Napisałem mój pierwszy, bardzo prosty unit test w #python wyglądający następująco:

https://pastebin.com/4X74KQZL

Tu pojawiły mi się w sumie 2 pytania:

1. Jak powinienem przekazać do testu argument dictionary? Powinna być to lista stworzona na podstawie odczytu z pliku tekstowego.

2. Jak właściwie powinna wyglądać dobra struktura projektu? W moim przypadku binarysearchby_distance znajduje się w osobnym pliku, sama, bez żadnej klasy. Lepiej byłoby umieścić ją w klasie jako metoda statyczna, zostawić jak jest czy jeszcze co innego? Są jakieś dobre poradniki apropo dobrej struktury projektu?

#kiciochpyta #programowanie
  • 10
@MagisterWiadromonter:
1. unit test nie powinien czytać żadnego pliku. Po prostu stwórz to dictionary wewnątrz testu i przekaż do binary_search_by_distance. Patrząc na taki test powinieneś widzieć od razu co wchodzi do testowanej funkcji/obiektu a co wychodzi. Jak chcesz przetestować kilka opcji (ma znaleźć/nie ma znaleźć/co zrobi jak None), to tworzysz kilka testów. Jeśli testy okażą się praktycznie takie same a nie chcesz się powtarzać to zainteresuj się testami parametrycznymi.
2.
Jak powinienem przekazać do testu argument dictionary? Powinna być to lista stworzona na podstawie odczytu z pliku tekstowego.


@MagisterWiadromonter: Normalnie utwórz sobie dane w metodzie testowej i przekaż do SUTa. Staraj się, żeby dane te były jak najmocniej minimalistyczne, precyzyjne, pokazujące konkretnie co testujesz, bez zbędnych śmieci. Dzięki temu test będzie krótki, łatwy do zrozumienia i masz mniejszą szansę na false–positive'y.

Jak mimo wszystko chcesz dużo danych testowych, to oczywiście możesz
Kiedy lepiej jest zastosować OOP a kiedy lepiej jednak zrobić to po prostu funkcyjnie?


@MagisterWiadromonter: Na początek nie myl funkcyjnego z proceduralnym ;-)

Każdy większy projekt robi się OOP lub przynajmniej z elementami OOP.

Jak masz coś małego, to „nobody cares” jak to zrobisz (może być i proceduralnie).

Funkcyjne ma świetne zalety jeśli chodzi o wielowątkowość, niemutowalność, etc. Zainteresuj się jak już ogarniesz OOP.
@asciiterror: Czyli mogę po prostu wewnątrz _init_ w teście zrobić:

with open("dict.txt") as file:
dictionary = file.readlines()
self.dictionary = [x.strip() for x in dictionary]

czy może lepiej stworzyć klasę z takim konstruktorem przyjmującym ścieżkę jako parametr i przenieść do niej moją funkcję, już bez parametru, tylko operującej na tablicy wczytanej w konstruktorze?
@MagisterWiadromonter: W unit testach nie powinienes czytać plików i zbierać z nich danych. Możesz pożniej dostać nieoczekiwane side effecty. Albo podajesz założone z góry dane, które powinieneś otrzymać (bo to unit test, testujesz jakąs jedną funkcjonalość a nie to czy poprawne dane otrzymasz po rzeczytanu x pliku), ew jak masz read pliku w samej funkcji to mockujesz to
@asciiterror: W takim razie to trochę czasochłonne rozwiązanie dla programisty, w sensie no żebym to sensownie przetestował to potrzebuję tak z 10 elementów pewnie więc do każdego ułożyć zestaw trochę trwa. A tak to cyk podłączam plik i mam do każdego. No ale skoro się tak nie robi to chyba muszę się zastosować :v