Skip to main content

一个简单的库,用于为单元测试添加数据库夹具,只使用 JSON 或 YAML。

项目描述

一个简单的库,允许您使用 JSON 或 YAML 为单元测试添加数据库设备。

安装

安装 Flask-Fixtures 很简单,只需像这样进行典型的 pip 安装:

pip install flask-fixtures

If you are going to use JSON as your data serialization format, you
should also consider installing the dateutil package since it will
add much more powerful and flexible parsing of dates and times.

要从源代码安装库,只需下载源代码,或者检查系统上是否安装了 git,然后运行 ​​install 命令。

git clone https://github.com/croach/Flask-Fixtures.git
cd /path/to/flask-fixtures
python setup.py install

设置

要设置库,您只需要告诉 Flask-Fixtures 它可以在哪里找到您的测试的夹具文件。Fixtures 可以驻留在文件系统的任何位置,但默认情况下,Flask-Fixtures在应用程序根目录中名为fixtures的目录中查找这些文件。要将更多目录添加到要搜索的列表中,只需将名为FIXTURES_DIRS的属性添加到应用程序的配置对象。该属性应该是一个字符串列表,其中每个字符串是一个固定装置目录的路径。绝对路径按原样添加,但相对路径将相对于您的应用程序的根目录。

一旦你配置了扩展,你就可以开始为你的测试添加fixture。

添加灯具

要添加一组夹具,您只需将描述要添加到测试数据库的单个夹具的任意数量的 JSON 或 YAML 文件添加到您在 FIXTURES_DIRS属性中指定的目录之一或默认夹具目录中。作为示例,我将假设我们有一个具有以下目录结构的 Flask 应用程序。

/myapp
    __init__.py
    config.py
    models.py
    /fixtures
        authors.json

__init__.py文件将负责创建我们的 Flask 应用程序对象。

# myapp/__init__.py

from flask import Flask

app = Flask(__name__)

config.py对象包含我们的测试配置文件。

# myapp/config.py

class TestConfig(object):
    SQLALCHEMY_DATABASE_URI = 'sqlite://'
    testing = True
    debug = True

最后,在models.py文件中,我们有以下数据库模型。

# myapp/models.py

from flask_sqlalchemy import SQLAlchemy

from myapp import app

db = SQLAlchemy(app)

class Author(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    first_name = db.Column(db.String(30))
    last_name = db.Column(db.String(30))

class Book(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(200))
    author_id = db.Column(db.Integer, db.ForeignKey('author.id'))
    author = db.relationship('Author', backref='books')

鉴于上面的模型类,如果我们想为我们的数据库模拟一些数据,我们可以在单个文件中这样做,或者我们甚至可以将我们的固定装置分成多个文件,每个文件对应于一个模型类。对于这个简单的示例,我们将使用一个名为 authors.json的文件。

固定装置文件包含对象列表。每个对象都包含一个名为records的键,该键包含另一个对象列表,每个对象代表表中的一行或模型的一个实例。如果您希望使用表,则需要使用 键指定表的名称。如果您更喜欢使用模型,请使用模型键指定模型的完全限定类名。指定要使用的表或模型后,您需要指定与每个表行或模型实例关联的数据。记录中的每个对象list 将保存单行或模型的数据。下面的示例是单个作者记录和与该作者关联的几本书的 JSON。创建一个名为 myapp/fixtures/authors.json的文件,并将下面的固定装置 JSON 复制并粘贴到该文件中。

[
    {
        "table": "author",
        "records": [{
            "id": 1,
            "first_name": "William",
            "last_name": "Gibson",
        }]
    },
    {
        "model": "myapp.models.Book",
        "records": [{
            "title": "Neuromancer",
            "author_id": 1
        },
        {
            "title": "Count Zero",
            "author_id": 1
        },
        {
            "title": "Mona Lisa Overdrive",
            "author_id": 1
        }]
    }
]

如果您安装了PyYAML,另一种选择是使用 YAML 语法而不是 JSON 来编写您的固定装置。就个人而言,我更喜欢使用 YAML;我发现它的语法更易于阅读,并且我发现向我的固定装置添加注释的能力非常宝贵。

如果您更喜欢使用 YAML,我在下面添加了一个用 YAML 编写的 authors.json 文件版本。只需将其复制并粘贴到名为 myapp/fixtures/authors.yaml的文件中即可,而不是创建上面的 JSON 文件。

- table: author
  records:
    - id: 1
      first_name: William
      last_name: Gibson

- model: myapp.models.Book
  records:
    - title: Neuromancer
      author_id: 1
      published_date: 1984-07-01
    - title: Count Zero
      author_id: 1
      published_date: 1986-03-01
    - title: Neuromancer
      author_id: 1
      published_date: 1988-10-01

在阅读了上一节之后,您可能会问自己为什么该库支持两种向数据库添加记录的方法。在创建夹具时支持表格和模型有几个很好的理由。使用表更快,因为我们可以利用 SQLAlchemy 的批量插入来一次添加多条记录。但是,要这样做,您必须首先确保记录列表是本地的。 换句话说,“记录”列表中的每个对象都必须具有相同的键/值对集,否则批量插入将不起作用。 但是,使用模型可以让您拥有一个异构的记录对象列表。

您可能想要使用模型而不是表的另一个原因是您将能够利用您在模型上设置的任何 python 级别的默认值、检查等。使用表,完全绕过模型并将数据直接插入数据库,这意味着您在创建基于表的夹具时需要考虑较低的层次。

用法

要在您的单元测试中使用 Flask-Fixtures,您需要确保您的测试类继承自FixturesMixin,并且您已经指定了要加载的夹具文件列表。下面的示例代码显示了如何执行这些步骤。

首先,确保您正在测试的应用程序已使用正确的配置进行初始化。然后导入并初始化FixturesMixin类,新建一个测试类,继承自FixturesMixin。现在您只需要告诉 Flask-Fixtures 哪些夹具文件用于您的测试。您可以通过设置fixtures类变量来做到这一点。这样做将在每次测试之间设置和拆除固定装置。要在测试中保持fixture,即仅在第一次创建类时设置fixture,并在所有测试完成执行后拆除它们,您需要将persist_fixtures 变量设置为True。固定装置变量应该设置为一个字符串列表,每个字符串都是要加载的夹具文件的名称。然后,Flask-Fixtures 将在FIXTURES_DIRS配置变量中的每个目录之后搜索默认的fixtures 目录,以查找与列表中每个名称匹配的文件,并将每个文件加载到测试数据库中。

# myapp/fixtures/test_fixtures.py

import unittest

from myapp import app
from myapp.models import db, Book, Author

from flask_fixtures import FixturesMixin

# Configure the app with the testing configuration
app.config.from_object('myapp.config.TestConfig')


# Make sure to inherit from the FixturesMixin class
class TestFoo(unittest.TestCase, FixturesMixin):

    # Specify the fixtures file(s) you want to load.
    # Change the list below to ['authors.yaml'] if you created your fixtures
    # file using YAML instead of JSON.
    fixtures = ['authors.json']

    # Specify the Flask app and db we want to use for this set of tests
    app = app
    db = db

    # Your tests go here

    def test_authors(self):
        authors = Author.query.all()
        assert len(authors) == Author.query.count() == 1
        assert len(authors[0].books) == 3

    def test_books(self):
        books = Book.query.all()
        assert len(books) == Book.query.count() == 3
        gibson = Author.query.filter(Author.last_name=='Gibson').one()
        for book in books:
            assert book.author == gibson

例子

要查看运行中的库,您可以在 tests/myapp目录中找到一个简单的 Flask 应用程序和一组与上面示例中的单元测试相匹配的单元测试。要自己运行这些示例,只需按照以下“贡献于 Flask-Fixtures”的说明进行操作。

为烧瓶夹具做贡献

目前,Flask-Fixtures 支持 python 版本 2.6 和 2.7 以及 py.test、nose 和 unittest(包含在 python 标准库中)库。要为 Flask-Fixtures 贡献错误修复和功能,您需要确保您贡献的任何代码不会破坏任何这些环境中的任何现有单元测试。

要在所有六个受支持的环境中运行单元测试,我建议您安装tox并简单地运行 tox命令。但是,如果您坚持手动运行,则需要为 python 2.6 和 python 2.7 创建一个 virtualenv。然后,在每个 virtualenv 中安装鼻子和 py.test。最后,您可以使用下表中的命令运行测试。

图书馆

命令

py.test

py.test

鼻子

鼻子测试

单元测试

python -m unittest discover --start-directory 测试

下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

Flask-Fixtures-0.3.8.tar.gz (13.8 kB 查看哈希

已上传 source

内置分布

Flask_Fixtures-0.3.8-py2.py3-none-any.whl (12.1 kB 查看哈希

已上传 py2 py3