Как настроить скрипт тестирования во 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')
Другие вопросы по тегам