如何使用 SQLite 在 Flask 中设置测试脚本?
How to setup testing script in Flask with SQLite?
我正在尝试对我的 Flask 网络应用程序进行单元测试。我使用的是我在 Flask 上的 Udemy class 中看到的模式和类似于在线 Flask Mega-Tutorial (http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-vii-unit-testing) 的模式。我遇到的问题是测试实际上并没有创建它自己的数据库——而是使用生产数据库并将其搞砸了。
tests.py 脚本如下所示:
import os,sys
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
basedir = os.path.abspath(os.path.dirname(__file__))
import unittest
from myapp import app, db
from user.models import User
class UserTest(unittest.TestCase):
def setUp(self):
self.db_uri = 'sqlite:///' + os.path.join(basedir, 'test.db')
app.config['TESTING'] = True
app.config['WTF_CSRF_ENABLED'] = False
app.config['SQL_ALCHEMY_DATABASE_URI'] = self.db_uri
self.app = app.test_client()
db.create_all()
def tearDown(self):
db.session.remove()
db.drop_all()
def test_models(self):
#Create a customer user
user = User("John Doe", "jdoe@jdoe.com", "jdoe", "password", is_consultant=False)
db.session.add(user)
db.session.commit()
#Create 2 consultant users
user1 = User("Jane Doe", "janedoe@gg.com", "janedoe", "password", is_consultant=True)
db.session.add(user1)
user2 = User("Nikola Tesla", "nikola@tesla.com", "nikola", "password", is_consultant=True)
db.session.add(user2)
db.session.commit()
#Check that all users exist
assert len(User.query.all()) is 3
我的应用程序初始化在同一个文件夹中,看起来像这样:
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.migrate import Migrate
from flask.ext.login import LoginManager
app = Flask(__name__)
app.config.from_object('config')
db = SQLAlchemy(app)
# flask-login extension setup
login_manager = LoginManager()
login_manager.init_app(app)
# migration setup
migrate = Migrate(app, db)
from user import views
我不明白这是怎么回事。它从不创建 test.db SQLite 数据库。它总是创建 app.db 生产数据库。如果它在那里,它会完全搞乱数据库。之后,如果我执行 python manage.py runserver -- 它不再起作用。它说 table 未找到。因为拆解掉了所有 table。到底是怎么回事?我该如何解决?
天哪,我想通了。我为数据库 URI 设置了错误的密钥。应该是:app.config['SQLALCHEMY_DATABASE_URI'] = self.db_uri.
所以一切都很好。只是做:
class UserTest(unittest.TestCase):
def setUp(self):
self.db_uri = 'sqlite:///' + os.path.join(basedir, 'test.db')
app.config['TESTING'] = True
app.config['WTF_CSRF_ENABLED'] = False
app.config['SQLALCHEMY_DATABASE_URI'] = self.db_uri
self.app = app.test_client()
db.create_all()
一切都按预期进行。
我通过在测试中放置一个断点并查看 app.config 是什么来检查发生了什么 -- 我看到有一个 SQL_ALCHEMY_DATABASE_URI
键(没有做任何事情,我正在设置)和一个 SQLALCHEMY_DATABASE_URI
键(这是重要的)。
我正在尝试对我的 Flask 网络应用程序进行单元测试。我使用的是我在 Flask 上的 Udemy class 中看到的模式和类似于在线 Flask Mega-Tutorial (http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-vii-unit-testing) 的模式。我遇到的问题是测试实际上并没有创建它自己的数据库——而是使用生产数据库并将其搞砸了。
tests.py 脚本如下所示:
import os,sys
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
basedir = os.path.abspath(os.path.dirname(__file__))
import unittest
from myapp import app, db
from user.models import User
class UserTest(unittest.TestCase):
def setUp(self):
self.db_uri = 'sqlite:///' + os.path.join(basedir, 'test.db')
app.config['TESTING'] = True
app.config['WTF_CSRF_ENABLED'] = False
app.config['SQL_ALCHEMY_DATABASE_URI'] = self.db_uri
self.app = app.test_client()
db.create_all()
def tearDown(self):
db.session.remove()
db.drop_all()
def test_models(self):
#Create a customer user
user = User("John Doe", "jdoe@jdoe.com", "jdoe", "password", is_consultant=False)
db.session.add(user)
db.session.commit()
#Create 2 consultant users
user1 = User("Jane Doe", "janedoe@gg.com", "janedoe", "password", is_consultant=True)
db.session.add(user1)
user2 = User("Nikola Tesla", "nikola@tesla.com", "nikola", "password", is_consultant=True)
db.session.add(user2)
db.session.commit()
#Check that all users exist
assert len(User.query.all()) is 3
我的应用程序初始化在同一个文件夹中,看起来像这样:
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.migrate import Migrate
from flask.ext.login import LoginManager
app = Flask(__name__)
app.config.from_object('config')
db = SQLAlchemy(app)
# flask-login extension setup
login_manager = LoginManager()
login_manager.init_app(app)
# migration setup
migrate = Migrate(app, db)
from user import views
我不明白这是怎么回事。它从不创建 test.db SQLite 数据库。它总是创建 app.db 生产数据库。如果它在那里,它会完全搞乱数据库。之后,如果我执行 python manage.py runserver -- 它不再起作用。它说 table 未找到。因为拆解掉了所有 table。到底是怎么回事?我该如何解决?
天哪,我想通了。我为数据库 URI 设置了错误的密钥。应该是:app.config['SQLALCHEMY_DATABASE_URI'] = self.db_uri.
所以一切都很好。只是做:
class UserTest(unittest.TestCase):
def setUp(self):
self.db_uri = 'sqlite:///' + os.path.join(basedir, 'test.db')
app.config['TESTING'] = True
app.config['WTF_CSRF_ENABLED'] = False
app.config['SQLALCHEMY_DATABASE_URI'] = self.db_uri
self.app = app.test_client()
db.create_all()
一切都按预期进行。
我通过在测试中放置一个断点并查看 app.config 是什么来检查发生了什么 -- 我看到有一个 SQL_ALCHEMY_DATABASE_URI
键(没有做任何事情,我正在设置)和一个 SQLALCHEMY_DATABASE_URI
键(这是重要的)。