2016-02-25 153 views
3

我很難設置一個簡單的測試。Python,導入模塊進行測試

我的項目結構如下:

project: 
    models: 
     __init__.py 
     user.py 
     constants.py 
     test: 
     test.py 

我想測試user.py PY運行test.py

user.py

from sqlalchemy import Column, Integer, String, Text 
from sqlalchemy.orm import relationship 
from .models.constants import * 
from .models import Base 

class User(Base): 
    __tablename__ = 'users' 

    uid = Column(Integer, primary_key=True, autoincrement=True) 
    name = Column(String, nullable=False) 
    email = Column(String, nullable=False) 
    picPath = Column(String, unique=True) 
    description = Column(Text) 

    def __repr__(self): 
     return "<User(uid=%s, name=%s)>" %(self.uid, self.name) 

test.py

from ..user import User, Group 

def _TestUser(): 
    TEST_DB_URI = "postgresql://project:[email protected]:5432/projectdbtest" 
    SessionMaker = sessionmaker() 
    engine = create_engine(TEST_DB_URI) 
    SessionMaker.configure(bind=engine) 

    session = SessionMaker() 
    user = User("test subject", "[email protected]", "~/testsubject.jpg", "I am a test subject") 
    session.add(user) 
    session.commit() 

然而,當我運行python3 -m test.py我收到以下錯誤:

關於SystemError:父模塊'不裝,無法執行相對進口

我想我可能有一個dd模塊包到python路徑?

+2

看一看[這裏](http://stackoverflow.com/questions/16981921/relative-imports-in-python-3) –

回答

7

這裏有幾件事情,這簡化了我的測試,這對我來說工作得很好。從項目的根

始終測試

起初我是假設,我的測試用例應該從任何目錄使用。

事實上,沒有任何理由讓測試用例以這種方式和運行從項目的根的所有測試,只有極力簡化解決方案的決定靈活。

這可能是顯而易見的許多程序員,但對我來說是朝着簡化測試大步。

保持test目錄從封裝代碼

混合生產代碼的測試代碼分開似乎是合乎邏輯的,但很快變得凌亂。

最後我決定在項目中使用單獨的tests(複數)目錄和它的作品對我非常好。

優點是:

  • 測試是「接近」挑(見相關py.test下一部分)和手動或其他工具,如tox使用。
  • 不需要在軟件包目錄中的某個地方尋找測試目錄,它們只是生活在不同的地方
  • 對於測試的實驗感覺很安全 - 因爲你已經離開了主代碼。

注:儘量使用始終命名tests,不要使用test。保持這個簡單的規則將簡化您的工作,因爲您將始終知道測試目錄的真實名稱。

使用pytest測試框架

有多種測試框架(unittestnosenose2pytest),事實上所有提供你所需要的基本知識。

反正,我發現pytest(與py.test命令)是真正的使用樂趣的幾個原因:

  • 可以運行用其它的框架,多數測試(單元測試,鼻子......)
  • 非常容易創建第一個測試功能。
  • 測試功能可以保持非常簡單,優秀的燈具將注入所需的值。一旦你嘗試了,你將不會使用其他方法。
  • 允許自然延長了測試套件
  • 非常好的開始原型代碼和發展生產一個:
    • 開始測試功能
    • 搬出測試功能的獨立功能在同一個測試文件
    • 移動到外部模塊(和大部分的測試代碼不變)

避免在測試套件目錄

使用__init__.pyChoosing a test layout/import rules的解釋和使用__init__.py按照建議避免的。

總之,事情會更簡單。

請注意,其他方法也可以工作,並沒有錯 - 我只是想分享一下對我有用的東西。