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路径?
答
使用
这里有几件事情,这简化了我的测试,这对我来说工作得很好。从项目的根
始终测试
起初我是假设,我的测试用例应该从任何目录使用。
事实上,没有任何理由让测试用例以这种方式和运行从项目的根的所有测试,只有极力简化解决方案的决定灵活。
这可能是显而易见的许多程序员,但对我来说是朝着简化测试大步。
保持test目录从封装代码
混合生产代码的测试代码分开似乎是合乎逻辑的,但很快变得凌乱。
最后我决定在项目中使用单独的tests
(复数)目录和它的作品对我非常好。
优点是:
- 测试是“接近”挑(见相关
py.test
下一部分)和手动或其他工具,如tox
使用。 - 不需要在软件包目录中的某个地方寻找测试目录,它们只是生活在不同的地方
- 对于测试的实验感觉很安全 - 因为你已经离开了主代码。
注:尽量使用始终命名tests
,不要使用test
。保持这个简单的规则将简化您的工作,因为您将始终知道测试目录的真实名称。
使用pytest
测试框架
有多种测试框架(unittest
,nose
,nose2
,pytest
),事实上所有提供你所需要的基本知识。
反正,我发现pytest
(与py.test
命令)是真正的使用乐趣的几个原因:
- 可以运行用其它的框架,多数测试(单元测试,鼻子......)
- 非常容易创建第一个测试功能。
- 测试功能可以保持非常简单,优秀的灯具将注入所需的值。一旦你尝试了,你将不会使用其他方法。
- 允许自然延长了测试套件
- 非常好的开始原型代码和发展生产一个:
- 开始测试功能
- 搬出测试功能的独立功能在同一个测试文件
- 移动到外部模块(和大部分的测试代码不变)
避免在测试套件目录
使用__init__.py
见Choosing a test layout/import rules的解释和使用__init__.py
按照建议避免的。
总之,事情会更简单。
请注意,其他方法也可以工作,并没有错 - 我只是想分享一下对我有用的东西。
看一看[这里](http://*.com/questions/16981921/relative-imports-in-python-3) –