📜  评论mettre en place les fixtures (1)

📅  最后修改于: 2023-12-03 14:57:41.090000             🧑  作者: Mango

如何确定合适的fixtures

在测试Python应用程序时,fixtures是非常常见的。fixtures是Python函数的一种特殊类型,它们可以将一组初始化代码提取到单独的函数中,以便在多个测试用例之间共享。然而,在使用fixtures之前,您需要确定哪些数据和状态需要进行初始化。通常,这需要您对应用程序的身份验证,数据库连接以及其他关键状态进行深入了解。

创建fixtures

一旦您知道要初始化的数据和状态,就可以开始创建自己的fixtures。一个好的起点是使用pytest框架自带的fixtures。这些fixtures涵盖了所有标准用例,例如修改测试数据库中的数据或模拟HTTP请求。

您可以根据需要编写自己的fixtures,以便在测试期间自动设置状态和数据。例如,如果您正在测试应用程序的邮件发送功能,则可以编写一个名为email_fixture的fixture,该fixture设置SMTP选项并验证电子邮件是否成功发送。

fixtures的范围

fixtures的范围与常规Python函数的范围不同。fixtures可以具有不同的作用域,例如session,module,class和function。这种灵活性使您可以控制fixtures何时初始化以及如何共享数据。例如,如果您需要在多个测试用例之间共享单个数据库连接,则可以使用scope ='session'属性将连接直接传递给session范围fixture。

最佳实践

  • 了解要初始化的数据和状态,以及它们在应用程序中的位置。
  • 使用pytest框架自带的fixtures作为起点,在需要时编写并重构自己的fixtures。
  • 考虑fixture的范围,以便尽可能有效地控制数据和资源共享。
  • 编写良好的文档,以便其他开发人员可以理解fixture的作用和用法。

代码示例

下面是一个简单的fixture示例,它从测试数据库加载数据并在测试中使用:

import pytest
from myapp import create_app
from myapp.models import User, db

@pytest.fixture(scope='session')
def app():
    app = create_app()
    return app

@pytest.fixture(scope='function')
def client(app):
    with app.test_client() as client:
        db.create_all()
        data = [
            User("Alice"),
            User("Bob"),
            User("Charlie")
        ]
        db.session.add_all(data)
        db.session.commit()
        yield client
        db.drop_all()

此fixture定义了app和client两个fixture。其中,app fixture是在session范围内使用的,而client fixture是在每个测试函数中使用的。使用client fixture之前,它会自动加载以Alice、Bob和Charlie作为初始数据的测试数据库。之后,测试使用client fixture进行应用程序的HTTP请求测试。在完成测试后,fixture会清空数据库以避免污染其他测试。