Pytest-如何在每个测试函数之后删除创建的数据

问题描述 投票:0回答:1

我有一个 FastAPI + SQLAlchemy 项目,我正在使用 Pytest 为 API 编写单元测试。

在每个测试函数中,我使用 SQLAlchemy 在一些表(用户表、帖子表、评论表等)中创建一些数据。每个测试功能中创建的这些数据将在测试功能完成后保留在表中,并会影响其他测试功能。

例如,在第一个测试函数中,我创建了 3 个帖子和 2 个用户,然后在第二个测试函数中,这 3 个帖子和 2 个用户仍然保留在表中,这使得我的测试预期错误。

以下是我的 pytest 固定装置:

@pytest.fixture
def session(engine):
    Session = sessionmaker(bind=engine)
    session = Session()
    yield session
    session.rollback()  # Removes data created in each test method
    session.close()  # Close the session after each test

我使用

session.rollback()
删除会话期间所有创建的数据,但它不会删除数据。

以下是我的测试功能:

class TestAllPosts(PostBaseTestCase):

    def create_logged_in_user(self, db):
        user = self.create_user(db)
        return user.generate_tokens()["access"]

    def test_can_api_return_all_posts_without_query_parameters(self, client, session):
        posts_count = 5
        user_token = self.create_logged_in_user(session)
        for i in range(posts_count):
            self.create_post(session)

        response = client.get(url, headers={"Authorization": f"Bearer {user_token}"})
        assert response.status_code == 200
        json_response = response.json()
        assert len(json_response) == posts_count

    def test_can_api_detect_there_is_no_post(self, client, session):
        user_token = self.create_logged_in_user(session)
        response = client.get(url, headers={"Authorization": f"Bearer {user_token}"})
        assert response.status_code == 404

在最新的测试函数中,我没有得到 404,而是通过 5 个帖子得到了 200(来自上一个测试函数)

测试功能完成后如何删除每个测试功能中创建的数据?

sqlalchemy pytest fastapi
1个回答
0
投票

提交事务后,您无法回滚到提交之前的状态。 根据 ACID 原则中的持久性,一旦提交事务,回滚将不会影响已提交的数据: https://dba.stackexchange.com/questions/188653/rollback-after-commit

所以你应该手动删除这些记录。

© www.soinside.com 2019 - 2024. All rights reserved.