Как настроить скрипт тестирования во Flask с помощью SQLite?
Я пытаюсь выполнить модульное тестирование моего веб-приложения Flask. Я использую шаблон, который я видел в классе Udemy на Flask, и шаблон, похожий на мега-учебник Flask ( 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
Мое приложение init находится в той же папке и выглядит так:
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
Я не понимаю, что происходит. Он никогда не создает базу данных SQLite test.db. Он всегда создает производственную базу данных app.db. И если это там, это полностью портит базу данных там. Впоследствии, если я сделаю Python manage.py runserver - он больше не будет работать. Там написано, что таблица не найдена. Потому что демонтаж сорвал все столы. Что здесь происходит? И как мне это исправить?
2 ответа
Боже мой, я понял это. Я установил неправильный ключ для 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
ключ (это тот, который имеет значение).
Я встретил у вас тот же вопрос, но причина другая. моя ошибка заключается в использовании одного и того же имени базы данных в DevelopmentConfig и TestingConfig! это должно быть другое имя, например data-dev.sqlite и data-test.sqlite.
config.py
class DevelopmentConfig(Config):
DEBUG = True
SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir,
'data-dev.sqlite')
class TestingConfig(Config):
TESTING = True
SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir,
'data-test.sqlite')