Python,导入模块进行测试

问题描述:

我很难设置一个简单的测试。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://*.com/questions/16981921/relative-imports-in-python-3) –

这里有几件事情,这简化了我的测试,这对我来说工作得很好。从项目的根

始终测试

起初我是假设,我的测试用例应该从任何目录使用。

事实上,没有任何理由让测试用例以这种方式和运行从项目的根的所有测试,只有极力简化解决方案的决定灵活。

这可能是显而易见的许多程序员,但对我来说是朝着简化测试大步。

保持test目录从封装代码

混合生产代码的测试代码分开似乎是合乎逻辑的,但很快变得凌乱。

最后我决定在项目中使用单独的tests(复数)目录和它的作品对我非常好。

优点是:

  • 测试是“接近”挑(见相关py.test下一部分)和手动或其他工具,如tox使用。
  • 不需要在软件包目录中的某个地方寻找测试目录,它们只是生活在不同的地方
  • 对于测试的实验感觉很安全 - 因为你已经离开了主代码。

注:尽量使用始终命名tests,不要使用test。保持这个简单的规则将简化您的工作,因为您将始终知道测试目录的真实名称。

使用pytest测试框架

有多种测试框架(unittestnosenose2pytest),事实上所有提供你所需要的基本知识。

反正,我发现pytest(与py.test命令)是真正的使用乐趣的几个原因:

  • 可以运行用其它的框架,多数测试(单元测试,鼻子......)
  • 非常容易创建第一个测试功能。
  • 测试功能可以保持非常简单,优秀的灯具将注入所需的值。一旦你尝试了,你将不会使用其他方法。
  • 允许自然延长了测试套件
  • 非常好的开始原型代码和发展生产一个:
    • 开始测试功能
    • 搬出测试功能的独立功能在同一个测试文件
    • 移动到外部模块(和大部分的测试代码不变)

避免在测试套件目录

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

总之,事情会更简单。

请注意,其他方法也可以工作,并没有错 - 我只是想分享一下对我有用的东西。