2015-12-04 41 views
5

Doğrudan bir python içe aktarma hakkım var. Elde etmek istediğim, birkaç kaynak dosya ve bir birim testi ile bir test klasörü ile bir modül sahip olmaktır.py.test, modülümü içe aktarılamıyor

Ne yaparsam yapayım, testlerimi yürütmek için py.test-3'ü alamıyorum. Benim dizin düzeni şöyle görünür:

. 
├── module 
│   ├── __init__.py 
│   └── testclass.py 
└── tests 
    └── test_testclass.py 

__init__.py dosya şuna benzer:

testclass.py dosyası şuna benzer
__all__ = ['testclass'] 

:

class TestClass(object): 

    def __init__(self): 
     self.id = 1 

Ve birim test bunun gibi:

import pytest 
from module import TestClass 

def test_test_class(): 
    tc = TestClass() 
    assert(tc.id==1) 

olursa olsun py.test-3 çağrı nasıl bir ile sona erecek: Eğer tests/test_testclass.py değiştirmedikçe

E ImportError: No module named 'module' 

cevap

7

Birincisi, sen aşağıdaki gibi module/__init__.py değiştirmeniz gerekir:

from .testclass import TestClass 

__all__ = ['TestClass'] 

Ve Eğer py.test izin PYTHONPATH ortam değişkeni ayarlamak çalıştırmak zaman tercüman modülleri bulmak için zaman bilmek:

PYTHONPATH=. py.test 
+0

http://asciinema.org/a/a94r31cms8zdqtf8p1dn38vma – falsetru

+1

Bu benim için çalışıyor! Bunu yapmanın pythonik yolu olur mu? Hala bir kütüphane düzeninin nasıl en iyi şekilde görünmesi gerektiği konusunda utanç verici. – Fabian

+1

@Fabian, Sanırım. En azından test kodunu değiştirmenizi gerektirmez. – falsetru

1

Ben pytest için yol yürütme testfile bir başlığında koyardı:

örnek: benim (test) projesinde herhangi bir alt klasör yolunu biliyor olabilir Bununla

import os, sys                 
sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)), os.pardir)) 

+0

Bu çözümün gerçek bir hayranı değilim çünkü DRY ilkesine aykırı herhangi bir test dosyasında tekrarlamak zorunda kalacağım. – Fabian

+1

Bu, testlerin/klasörlerin "\ __ init \ __. Py" içine yerleştirilebilir ve dizinin tamamı için tekrarlamanız gerekmeyebilir. –

İlgili konular