2017-03-10 3 views
3

ich ein sehr einfaches Beispiel für ein Python-Paket und einen Test, den ich versuche, mit pytestpytest kann nicht Paket finden, wenn ich Tests in einem separaten Verzeichnis setze

package 
\-- 
    __init__.py 
    spam.py 
    spam_test.py 

__init__.py leer zu laufen ist, spam.py definiert eine einzelne Funktion func() und spam_test.py ist:

import package.spam 

def test_func(): 
    assert(package.spam.func() == 5) 

im Stammverzeichnis ich betreiben py.test und alles funktioniert, eines davon Test zurück.

ich dachte, dass ich auch die Dinge auf diese Weise strukturieren könnte:

package 
\-- 
    __init__.py 
    spam.py 
tests 
\-- 
    spam_test.py 

Aber jetzt, wenn ich py.test in der Wurzel laufen erhalte ich:

============================= test session starts ============================= 
platform win32 -- Python 3.6.0, pytest-3.0.5, py-1.4.32, pluggy-0.4.0 
rootdir: C:\Users\MattUser\Documents\m_drive\notebooks\testing, inifile: 
collected 0 items/1 errors 

=================================== ERRORS ==================================== 
_____________________ ERROR collecting tests/spam_test.py _____________________ 
ImportError while importing test module 'C:\Users\MattUser\Documents\m_drive\not 
ebooks\testing\tests\spam_test.py'. 
Hint: make sure your test modules/packages have valid Python names. 
Traceback: 
tests\spam_test.py:1: in 
    import package.spam 
E ModuleNotFoundError: No module named 'package' 
!!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!! 
=========================== 1 error in 0.19 seconds ===========================

ich verschiedene Dinge ausprobiert habe zu keinem Glück. Was mache ich falsch??

+0

Ich hatte Probleme, einige einfache Tests arbeiten und nicht realisieren, dass sie "test_foo" genannt werden müssen und nicht 'foo_test', im Gegensatz zu den Dateinamen ... –

Antwort

4

Nun, ich habe es funktioniert. Fügen Sie eine leere __init__.py Datei in dem Verzeichnis tests hinzu.

Warum funktioniert das? Vom official docs:

basedir bestimmen: dies ist das erste „nach oben“ (in Richtung der Wurzel) Verzeichnis keine __init__.py enthält.

So mit testsnicht enthält __init__.py bestimmt pytest, dass die basedir zu sein. Das Hinzufügen von __init__.py zwingt pytest zum Recurse bis zum Stamm, woher es importieren kann, was es braucht ...

+0

Ist es wirklich der empfohlene Weg, dies zu tun? Oder es ist nur ein Nebeneffekt? –

Verwandte Themen