Importowanie modułów do testu

0

Cześć, mam problem z importem modułów do testów. Poniżej wrzucam strukture katalogów (swoją drogą, możecie dać znac czy jest to dobre rozwiązanie czy może powinno się tworzyć inną strukture, ponieważ są to moje pierwsze testy ;d ). Zastanawiałem się nad pojedynczym plikiem test.py obok każdego pliku algorytmu, albo katalog tests obok każdego algorytmu. Finalnie zdecydowałem sie na katalog tests w katalogu root projektu gdzie będą wszystkie testy.

Python:.
│
├───algorithms
│   └───sorting
│           bubble_sort.py
│           __init__.py
│
└───tests
    └───algorithms
        └───sorting
                bubble_sort_test.py
                __init__.py

Teraz problem polega na tym, że importując jakis algorytmy dla przykładu ten bubble_sort.py z poziomu testu bubble_sort_test.py czyli wykonując from algorithms.sorting.bubble_sort import bubble_sort dostane błąd ModuleNotFoundError: No module named 'algorithms' ponieważ bubble_sort_test.py szuka katalogu algorithms względem swojej pozycji (jak dobrze rozumiem).

Mógłbym uruchamiać test z poziomu głownego katalogu python -m unittest tests.algorithms.sorting.bubble_sort.bubble_sort_test.py, ale z drugiej strony jak ktoś gdzieś w jakimś celu zaimportuje plik testu i będziesz chciał go uruchomić? Wtedy też import sie nie powiedzie z powodu względnej scieżki i rzuci błędem.

W takim przypadku również ten fragment jest zbędny:

if __name__ == "__main__":
   unittest.main()

Ponieważ każde bezpośrednie uruchomienie pliku będzie pobierało błędną sciezke do pliku.

Podpowie ktoś jak do tego podejść?

0

Jak zauważyłeś, trzymanie testów z aplikacją lub obok (w folderze tests) to są dwa różne podejścia, mają swoje plusy i minusy. Osobiście preferuję trzymanie ich osobno, z odtworzeniem struktury aby było łatwo znaleźć powiązane pliki (nie zawsze ma to sens czy jest to możliwe, w zależności od typu aplikacji i testów).

Importowanie wygląda tak, że przygotowujesz paczkę ze swojej aplikacji, instalujesz ją w środowisku, które uruchamia testy i wtedy w plikach importujesz moduły ze swojej aplikacji.

Na przykładzie (mój projekt ale mam bałagan w testach ;)):
https://github.com/MarketSquare/robotframework-tidy

Mam repozytorium / paczkę w pip "robotframework-tidy" , w którym mam moduł "robotidy". Jak chcę użyc jakieś klasy bezpośrednio, mogę zainstalować paczkę (w lokalnym środowisku mogę zrobić pip install -e .[dev] aby zainstalować lokalnie, edytowalną wersję z profilem dev, która okresla dodatkowe wymagania aplikacji np. pytest) i:

from robotidy.some_module import some_class

Mogę więc zrobić tak:
https://github.com/MarketSquare/robotframework-tidy/blob/0c7a4a496a4f2a61cf4eb3be0b3c45be8b39784a/tests/utest/test_disablers.py#L8 (zaimportować testowaną klasę)

Możesz też jak uzywasz pytest dodać ścieżkę do algorithm do sys.path:
https://stackoverflow.com/questions/39134718/how-to-add-a-package-to-sys-path-for-testing

czy

https://stackoverflow.com/questions/10253826/path-issue-with-pytest-importerror-no-module-named-yadayadayada

1

Możesz spróbować:

import sys 
sys.path.append("../")
0

@AsterFV:
Paczki jeszcze nigdy nie robiłem, a też nie chce na tym etapie zbytnio komplikować, ale rozumiem koncepcje (chyba). Z tego co widze u ciebie w utest nie ma lokalnie zainstalowanej paczki czyli pewnie odwołujesz sie do testów czyms w stylu python -m unittest ... tylko w wersji pytest i też rzuci błędem jeśli uruchomisz plik bezposrednio nie instalując wczesniej paczki lokalnie w tests? A jeśli zainstalujesz paczke lokalnie do testów to czy nie masz wtedy dwóch wersji aplikacji która zajmuje dodatkową przestrzeń i ktorą trzeba aktualizować wraz z postępem głownej wersji? Czy to nie jest wtedy kontrproduktywne?

@lion137:
To by się chyba sprawdziło jakbym miał pliki bezposrednio w katalogu tests, jak struktura jest bardziej złożona np. tests/algorithms/sorting/bubble_sort/test_bubble_sort.py

import sys 
sys.path.append("../../../../..")

To taka instrukcja nie wygląda zbyt dobrze, chyba, że coś zle zrozumiałem


Ogólnie mógłbym przyjąć założenie, że nikt nie będzie uruchamiał plików testów bezpośrednio, ani ich importował i wszystko działa za sprawą python -m unittest, ale czy to nie jest jakimś blędem projektowym? Powinienem umożliwić "działający" import plików testowych?

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