Jak przetestować?

0

Mam następującą funkcję:

def open_warc(file_name, encoding='ISO-8859-1'):
    """Function to iter line by line WARC file.

    Args:
        file_name:
            The given WARC file name.
        encoding:
            Value encoding.

    Returns:
        Generator which yields decoded lines from WARC file.
    """
    if file_name.lower().endswith('.gz'):
        opener = gzip.open
    else:
        opener = file
    with opener(file_name) as f:
        for line in f:
            yield line.decode(encoding)

Zastanawiam się czy ma sens testowanie tej funkcji oraz jeśli tak, to jak tego dokonać. Niespecjalnie wiem na czym miałby skupić się tego rodzaju testu.

Może powinienem mieć 2 funkcje, jedna do otworzenia pliku, a druga jako generator, który dekoduje wszystkie linie? Wtedy mógłbym przetestować mój warunek, ale nadal miałbym problem z przetestowaniem dekodującego generatora. Poza tym rozbijanie wszystkiego na drobny mak też wydaje mi się dziwne, ponieważ te bardzo małe funkcje będą miały zastosowanie w projekcie wyłącznie w jednym miejscu.

Wiem, że mógłbym po prostu zrobić mock na open. Wstawić do mocka jakiś tekst, a potem sprawdzać czy każda linia została odpowiednio przekodowana.

To co mnie odstrasza przy tym rozwiązaniu to fakt, że ktoś już przetestował metodę decode, no i sprawdzanie jej działania byłoby marnowaniem czasu.

Z drugiej strony mógłbym sprawdzić czy po prostu zrobić mock na decode i sprawdzić czy zostało wywołane określoną ilość razy. No, ale wtedy mój test nie jest uniwersalny, bo jest zależny od implementacji :|

Sam już nie wiem jak postąpić. Jak ty byś postąpił?

0

Z jednej strony napisanie testu dla tej funkcji to żaden wysiłek, z drugiej niewiele jest tu do testowania.

A test wygląda tak, przygotowujesz najmniej cztery plik tekstowe:
#pusty,
#z jedną linią,
#z więcej niż jedną linią,
#z innym kodowaniem
#i spakowany
a następnie sprawdzasz czy dostajesz wyniki zgodne z oczekiwaniem, bawienie się w mocki nie jest raczej konieczne.

0

Czyli sądzisz, że niezależnie od implementacji funkcji powinienem mieć cały zestaw testów? Z jednej strony ma to sens, bo przecież będę miał gwarant, że kod działa tak jak tego oczekuje, ale z drugiej strony.. Szkoda mi powielać testów, dla funkcji które już ktoś napisał.

1

@MarekR22 nie no bez żartów. Co to za testy jednostkowe które dla proste funkcji wymagają n-plików? Właśnie po to są przecież mocki! Tak samo jak nie ma sensu testować funkcji biblioteki standardowej albo dowolnej zewnętrznej.
Przypadki testowe:

  • nazwa pliku z .gz
  • nazwa pliku bez .gz
  • plik z 0 liniami
  • plik z 1 linią
  • plik z n-liniami
    Ale oczywiście "plik" powinniśmy mockować i potem zweryfikować czy wszystko zostalo wywołane tyle razy ile powinno.
0

Czy test powinien z góry narzucać ilość wywołań konkretnych funkcji? Wydaje mi się to patologiczne podejście względem TDD.

0

@pyborsuk no jeśli wymuszasz tą liczbę mockiem to czemu nie? Wiesz np. że dana metoda powinna się wołać na każdej linii w pliku i mockujesz ile linii plik ma zwrócic. Jak sie to wykona mniej/wiecej razy to coś jest nie tak.
Zresztą przecież jak refaktorujesz kod to najpierw poprawiasz testy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1