Python,导入模块进行测试

mrQ*_*RTY 8 python import

我正在努力设置一个简单的测试.

我的项目结构如下:

project:
   models:
      __init__.py
      user.py
      constants.py
      test:
         test.py
Run Code Online (Sandbox Code Playgroud)

我想测试user.pypy运行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)
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

但是,我运行时收到以下错误python3 -m test.py:

SystemError:父模块''未加载,无法执行相对导入

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

Jan*_*sky 12

这里有一些东西,它简化了我的测试,对我很有帮助.

始终从项目根目录进行测试

最初我假设,我的测试用例可以在任何目录中使用.

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

对于许多程序员来说,这可能是显而易见的,但对我而言,它是简化测试的重要一步.

保持测试目录与包代码分开

将生产代码与测试代码混合似乎是合乎逻辑的,但很快就会变得混乱.

最后我决定在项目中使用单独的tests(复数)目录,它对我来说非常有效.

优点是:

  • 测试是"接近"选择(参见下一部分相关py.test)并手动或使用其他工具tox.
  • 无需在包目录中的某个地方寻找测试目录,它们只是生活在不同的地方
  • 尝试测试是安全的 - 因为你不在主代码之外.

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

使用pytest测试框架

有多种测试框架(unittest,nose,nose2,pytest),事实上所有提供你所需要的基本知识.

无论如何,我发现pytest(带py.test命令)使用真的很有趣,原因如下:

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

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

有关说明,请参阅选择测试布局/导入规则,并遵循建议以避免使用__init__.py.

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

请注意,其他方法也会起作用并且没有错 - 我只想分享对我来说非常有效的方法.

  • 这是一个非常有争议的观点:“将测试目录与包代码分开” (4认同)