Wpis z mikrobloga

#naukaprogramowania #programowanie #python

Mam bardzo prostą metodę w klasie:

def save_to_file(self, path):
try:
with open(path, 'w') as file:
file.write(json.dumps(self.data, indent=4))
except PermissionError:
print(f"no permissions to save the file in {path}")

Chcę odpalić unit test:

def test_write_to_file_without_permissions(self):
d = data_getter(LoadFromFile=True, data_path='data.json')
self.assertRaises(PermissionError, d.save_to_file, 'no_permissions_to_write/data.json')

Problem jest taki, że jeżeli zostawię blok except w metodzie, to wtedy unit test go nie łapie. Jeżeli wyrzucę nowy error w bloku except, to zaliczam test, ale sam program wtedy się będzie wywalać.
W jaki sposób mogę zachować block except, żeby test case wykrywał że dostałem w ryj wyjątkiem nieobsłużonym?
  • 47
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

via Wykop Mobilny (Android)
  • 0
@RedveKoronny: nie polecam przepisywać testów do pytesta, testy dobrze pisać standardowym modułem unittest. Pytest je odpala bez problemu, a nie masz wtedy zależności explicite w kodzie i korzystasz z pytesta jako runnera testów
  • Odpowiedz
Logi i tak są elegancko robione, to user będzie chyba wiedział co sie zwaliło


@RedveKoronny: nie user widzi logi, a developer. jako developer mysl user => ta osoba, ktora jak kliknie 'ok' zamiast 'anuluj' to dzwoni z krzykiem, ze sie usunelo. do tego (z tego co widze) dlugi czas, wybacz jesli sie myle - ale warto ten nawyk i sposob myslenia wyrobic. w kazdej branzy, w kazdym jezyku, na kazdym
  • Odpowiedz
na początek nie korzystaj ze stringów jako ścieżki, a z pathlib.Path.


@CancerLight: patrze na docsy, i generalnie nie widzę żadnej przewagi. Jedynie co, to metoda if path exists, oraz is_file, ale dalej nie wiem czy plik jest pusty, czy co sie stanie. Dalej muszę sprawdzac czy mam permisje do zapisywania do pliku
  • Odpowiedz
via Wykop Mobilny (Android)
  • 0
@RedveKoronny: ilu programistów tyle opinii. Ja pytesta używam do generowania raportu coverage, ale w kodzie od pythona 3.8 (AsyncMock został dodany) przestałem ponieważ biblioteka standardowa mi wystarczy.
Do testowania logów możesz użyć assertLogs, nie trzeba caploga z pytesta.
Ja tam do assertRaises nic nie mam
  • Odpowiedz
@Gantzu: weż mu nie mieszaj. Według ankiety jetbrainsów pytest ma 51% udziału a unittest 25%. Zresztą tak na chłopski rozum: skoro wbudowana biblioteka jest mniej popularna niż ta opensource to coś musi być nie tak z tą pierwszą
  • Odpowiedz
via Wykop Mobilny (Android)
  • 0
@Saly: korzystając z pytesta, bardzo często używa się też klas z unittesta np. mocki. Co sprawia że trzeba się nauczyć obu. Dlatego na początku lepiej zacząć od unittesta
  • Odpowiedz
@Gantzu: z drugiej strony nie musisz uczyć się frameworka. Do najprostrzych testów wystarczy nazwanie funkcji test_xyz i słówko kluczowe assert istniejące już w języku
  • Odpowiedz
@RedveKoronny: ten program czyta plik, wysyla go na endpoint http a wynik zapisuje do pliku. Do napisania w górę 20 lini. Ja bym na pewno wywalił tą klasę, bo jest brzydko: jak nie masz żadnego konkretnego stanu to funkcje wystarczą. Do tego ten error handling jest trochę zbyt drobiazgowy: przy takim prostym skrypcie lepiej nic nie łapać lub ewentualnie złapać/zalogować/rzucić ponownie, gdy exception message nie jest jasny
  • Odpowiedz
@CancerLight: @Saly: tak analizuje teraz ten kod, i nieironicznie jedyne co widzę co może skrócić program, to w-------e łapanie błędów, i logów, co wydaje się debilizmem.
Myślę czy wywalić tą klasę, i zastąpić ją modułem, ale z drugiej strony, mam teraz zrobiony interfejs dla użyszkodnika
  • Odpowiedz