2009-08-27 11 views
16

Czy istnieje zgoda co do najlepszego miejsca do umieszczenia w Pythonie rekordów?Czy jednostronne jednostki Pythona powinny znajdować się w osobnym module?

Gdyby unittests być zawarte w tym samym module jako funkcjonalność testowane (wykonywany, gdy moduł jest uruchamiany na własną rękę (if __name__ == '__main__', itd.)), Czy też lepiej, aby zawierać unittests obrębie różnych modułów?

Być może najlepsze jest połączenie obu podejść, w tym testy na poziomie modułów w każdym module i dodawanie testów wyższego poziomu, które funkcjonalność testu jest zawarta w więcej niż jednym module jako osobne moduły (być może w podkatalogu test?).

Zakładam, że wykrywanie testów jest prostsze, jeśli testy są zawarte w oddzielnych modułach, ale istnieje dodatkowe obciążenie dla programisty, jeśli musi pamiętać o aktualizacji dodatkowego modułu testowego, jeśli testowany moduł jest zmodyfikowany.

Chciałbym poznać opinie ludzi na temat najlepszego sposobu organizowania zmian.

Odpowiedz

10
  1. gdzie trzeba, jeśli przy użyciu biblioteki określający gdzie unittests powinien żyć,
  2. w modułach siebie dla małych projektów lub
  3. w podkatalogu tests/ w pakiecie dla większych projektów.

Chodzi o to, co najlepiej pasuje do tworzonego projektu.

Czasami biblioteki których używasz określenia, gdzie testy powinny iść, jak to ma miejsce w przypadku Django (gdzie umieścić swoje testy w models.py, tests.py lub podkatalogu w swoich aplikacjach tests/).

Jeśli nie ma żadnych istniejących ograniczeń, jest to kwestia osobistych preferencji. W przypadku niewielkiego zestawu modułów wygodniejsze może być umieszczanie zmian w plikach, które tworzysz.

Dla czegokolwiek więcej niż kilka modułów tworzę testy osobno w katalogu tests/ w paczce. Testowanie kodu pomieszanego z implementacją powoduje niepotrzebny hałas dla każdego czytającego kod.

+0

Dziękuję za tę wszechstronną odpowiedź. Podoba mi się twój punkt widzenia na redukowanie hałasu w kodzie implementacji. Podoba mi się również odpowiedź Mike'a na temat prób utrzymania relacji 1: 1 pomiędzy modułami i ich testami, gdy uwzględniam testy w oddzielnym/testowym podkatalogu. –

+0

Jestem naprawdę pedantyczny tutaj, ale Django (i naprawdę wszystko, co dyktuje, gdzie umieścić swoje testy) powinien prawdopodobnie być nazywany ramą, a nie biblioteką. – num1

9

Osobiście utworzę folder test/folder w moim katalogu źródłowym i spróbuję, w mniejszym lub większym stopniu, odzwierciedlić moją główną hierarchię kodów źródłowych za pomocą ekwiwalentów testów jednostkowych (z reguły 1 moduł = 1 moduł testowy jednostki).

Zauważ, że używam nose, a jego filozofia jest nieco inna niż w przypadku unittest.

4

Generalnie przechowuję kod testowy w osobnym module i wysyłam moduł/pakiet i testy w jednej dystrybucji. Jeśli użytkownik zainstaluje się przy użyciu setup.py, może uruchomić testy z katalogu testowego, aby upewnić się, że wszystko działa w ich środowisku, ale tylko kod modułu kończy się pod Lib/site-packages.

0

if __name__ == '__main__' itp. Doskonale nadaje się do małych testów.

2

Może istnieć powód inny niż testowanie do korzystania z czeku if __name__ == '__main__'. Utrzymanie testów w innych modułach pozostawia tę opcję otwartą dla ciebie. Również - jeśli refaktoryzujesz implementację modułu, a twoje testy są w innym module, który nie był edytowany - wiesz, że testy nie zostały zmienione, gdy uruchomisz je przeciwko refaktoryzowanemu kodowi.

1

Zwykle mam je w osobnym folderze o nazwie najczęściej test/. Osobiście nie używam sprawdzania, jeśli __name__ == '__main__', ponieważ używam testów typu nosetests i sam testuję wykrywanie testu.

10

TAK, używaj oddzielnego modułu.

Nie ma sensu używać sztuczki __main__. Załóżmy, że masz kilka plików w swoim module, i to już nie działa, ponieważ nie chcesz uruchamiać każdego pliku źródłowego oddzielnie podczas testowania twojego modułu.

Ponadto, instalując moduł, przez większość czasu nie chcesz instalować testów. Twój końcowy użytkownik nie dba o testy, tylko deweloperzy powinni się tym przejmować.

Nie, naprawdę. Połóż swoje testy w tests/, twoim dokumencie w doc, i przygotuj plik Makefile dla make test. Wszelkie inne podejścia są tylko rozwiązaniami pośrednimi, ważnymi tylko dla konkretnych małych modułów.

Powiązane problemy