【问题标题】:Python, importing modules for testingPython,导入模块进行测试
【发布时间】:2016-02-25 19:39:11
【问题描述】:

我很难设置一个简单的测试。

我的项目结构如下:

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

我想测试运行test.pyuser.py 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:password@localhost:5432/projectdbtest"
    SessionMaker = sessionmaker()
    engine = create_engine(TEST_DB_URI)
    SessionMaker.configure(bind=engine)

    session = SessionMaker()
    user = User("test subject", "testsubject@gmail.com", "~/testsubject.jpg", "I am a test subject")
    session.add(user)
    session.commit()

但是,当我运行 python3 -m test.py 时出现以下错误:

系统错误:父模块''未加载,无法执行相对导入

我想我可能需要将模块包添加到 python 路径?

【问题讨论】:

标签: python import


【解决方案1】:

这里有几件事,它们简化了我的测试并且对我非常有效。

始终从项目根目录测试

最初我假设,我的测试用例可以从任何目录使用。

事实上,没有理由以这种方式使测试用例变得灵活,从项目根目录运行所有测试的决定只会极大地简化解决方案。

这对许多程序员来说可能很明显,但对我来说,这是朝着简化测试迈出的一大步。

将测试目录与包代码分开

将生产代码与测试代码混合起来似乎合乎逻辑,但很快就会变得混乱。

最后我决定在项目中使用单独的tests(复数)目录,它对我来说效果很好。

优点是:

  • 测试是“接近”的选择(参见与py.test 相关的下一部分)并手动使用或通过其他工具(如tox)使用。
  • 无需在包目录中的某处寻找测试目录,它们只是生活在不同的地方
  • 可以放心地尝试测试 - 因为您已脱离主代码。

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

使用pytest测试框架

有多种测试框架(unittestnosenose2pytest),实际上都提供了您需要的基础知识。

无论如何,我发现pytest(使用py.test 命令)使用起来非常有趣,原因有以下几点:

  • 可以运行在其他框架(unittest、nose...)中编写的大多数测试
  • 很容易创建第一个测试函数。
  • 测试函数可以保持非常简单,优秀的夹具会向其中注入所需的值。一旦你尝试过,你将不会使用其他方法。
  • 允许自然扩展测试套件
  • 非常好开始对您的代码进行原型设计并演变为生产代码:
    • 在测试功能中开始
    • 将测试函数移出到同一测试文件中的独立函数
    • 移至外部模块(大部分测试代码不会改变)

避免在测试套件目录中使用__init__.py

请参阅Choosing a test layout/import rules 以获得解释并遵循建议以避免使用__init__.py

简而言之,事情会更简单。

请注意,其他方法也可以,并且没有错 - 我只是想分享对我非常有效的方法。

【讨论】:

  • 这是一个非常有争议的观点:“将测试目录与包代码分开”
猜你喜欢
  • 2012-07-06
  • 1970-01-01
  • 1970-01-01
  • 2018-04-07
  • 2011-06-13
  • 1970-01-01
  • 2020-09-11
  • 2017-06-30
  • 1970-01-01
相关资源
最近更新 更多