【问题标题】:How to test if a class object was created using Pytest如何测试是否使用 Pytest 创建了类对象
【发布时间】:2021-07-12 18:06:20
【问题描述】:

我编写了一个习惯跟踪器应用程序并使用 SQLAlchemy 将数据存储在 SQLite3 数据库中。现在我正在使用 Pytest 为我编写的所有函数编写单元测试。除了返回值的函数外,还有一些函数通过创建对象在数据库中创建条目。这是我的对象关系映射器设置和两个主要类:

from sqlalchemy import create_engine, Column, Integer, String, ForeignKey, Date
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

# Setting up SQLAlchemy to connect to the local SQLite3 database
Base = declarative_base()
engine = create_engine('sqlite:///:main:', echo=True)
Base.metadata.create_all(bind=engine)
Session = sessionmaker(bind=engine)
session = Session()

class Habit(Base):    
    __tablename__ = 'habit'
    habit_id = Column('habit_id', Integer, primary_key=True)
    name = Column('name', String, unique=True)
    periodicity = Column('periodicity', String)
    start_date = Column('start_date', Date)

class HabitEvent(Base):
    __tablename__ = 'habit_event'
    event_id = Column('event_id', Integer, primary_key=True)
    date = Column('date', Date)
    habit_id = Column('fk_habit_id', Integer, ForeignKey(Habit.habit_id))

其中一个创建函数如下:

def add_habit(name, periodicity):
    if str(periodicity) not in ['d', 'w']:
        print('Wrong periodicity. \nUse d for daily or w for weekly.')
    else:
        h = Habit()
        h.name = str(name)
        if str(periodicity) == 'd':
            h.periodicity = 'Daily'
        if str(periodicity) == 'w':
            h.periodicity = 'Weekly'
        h.start_date = datetime.date.today()
        session.add(h)
        session.commit()
        print('Habit added.')

这是我的问题:由于此函数不会返回可以与预期结果匹配的值,因此我不知道如何测试对象是否已创建。当我想使用以下函数检查是否所有对象都被删除时,我也遇到了同样的问题:

def delete_habit(habitID):    
    id_list = []
    
    id_query = session.query(Habit).all()
    for i in id_query:
        id_list.append(i.habit_id)
        
    if habitID in id_list:
        delete_id = int(habitID)
        session.query(HabitEvent).filter(
                HabitEvent.habit_id == delete_id).delete()
        session.query(Habit).filter(Habit.habit_id == delete_id).delete()
        session.commit()
        print('Habit deleted.')     
    else:
        print('Non existing Habit ID.')

【问题讨论】:

  • 您能否使用 sqlalchemy 通过 select 语句查询数据库,并比较作为测试断言的一部分从该语句返回(或未返回)的内容?换句话说,查询数据库以查看是否实际插入或删除了记录。
  • 我可以通过编写一个查询数据库的函数来手动完成。但是我如何把它放到一个测试断言中呢? add_habit 函数仍然没有输出。我只能测试新函数以显示add_habit 函数有效。 delete_habit 函数也是如此。而且只有在使用相应的函数将值存储到数据库中或从数据库中删除时,这才是正确的。 (而不是 excel 数据导入,例如)
  • 您不需要从 add_habit 或 delete_habit 返回任何内容。相反,测试函数本身将查询数据库并使用作为测试断言的一部分的结果。如果我没有正确理解,请道歉。
  • 我为 get_habits 函数编写了一个测试,它返回所有存储的习惯。但这仍然不包括数据是使用add_habit 函数添加的。因此,该功能本身尚未经过正确测试。如果您有不同的想法,也许您可​​以发布一些代码。

标签: python sqlalchemy orm pytest


【解决方案1】:

如果我理解正确,您可以利用 get_habits 函数作为 add_habit 测试的一部分。

def test_add_habit():

    name = 'test_add_habit'
    periodicity = 'd'

    add_habit(name, periodicity)

    # not sure of the input or output from get_habits, but possibly:
    results = get_habits(name)
    assert name in results['name']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多