2016-02-08 4 views
0

Я использую Flask-Script для выполнения тестов на моем приложении важный бит моего manage.py файла выглядит следующим образом:нагрузки Колба-Script приложения перед запуском UnitTests

import unittest 

from flask.ext.script import Manager 
from project import app 

manager = Manager(app) 

@manager.command 
def test(): 
    """Run unit tests.""" 
    app.config.from_object('config.Test') 
    tests = unittest.TestLoader().discover('tests', pattern='*.py') 
    unittest.TextTestRunner(verbosity=1).run(tests) 

Но когда я бег python manage.py test он пытается Инициализирует все приложение, так что если, например, я не установил свои переменные окружения, он бросает KeyError из __init__.py файла моего проекта следующим образом:

File "project/__init__.py", line 19, in <module> app.config.from_object(os.environ['PROJECT_SETTINGS'])

Или, если я установил переменную окружения, я получаю сообщение об отсутствии таблиц базы данных.

Конечно, приложение должно инициализироваться только после запуска тестов, а переменные конфигурации были установлены в функции test().

+0

Вы импортируете 'приложение' в верхней части модуля. Что-то внутри 'project/__ init __. Py' будет запускаться, когда вы это сделаете. – dirn

+0

Спасибо @dim. Проблема заключается в том, что «Менеджер» требует этого, поэтому я не вижу, как я могу обойти это. – hammygoonan

ответ

1

Есть несколько вещей, которые вам нужно сделать, чтобы заставить это работать.

  1. Установите недостающие переменные окружающей среды (как вы уже сказали).

  2. Создайте тестовую базу данных для тестирования, чтобы ваши тесты включали функцию setup и функцию teardown, которые создают таблицы и удаляют их соответственно.

Чтобы обойти одного шага я предлагаю использовать Flask application factory pattern, который позволяет инкапсулировать создание вашего приложения внутри функции. Это позволит вам пройти в любом переменных и т.д., необходимых для запуска приложения под тестовой средой т.е.

def create_application(is_test=False): 
    app = Flask(__name__) 
    if not is_test: 
     setup_app_not_for_test(app) 
    else: 
     setup_test_for_app(app) 

    return app 

В отношении к шагу номера 2, если вы используете pytest или нос или какой-либо среды тестирования, которые использует приспособления, которые вы можете легко добавить setup и teardown функции для добавления/удаления таблиц базы данных. Кроме того, если вы используете ORM, например sqlalchemy, вы можете легко создать SQLite in memory database, чтобы выполнить свои тесты.

# create db instance 
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite://:memory:" 

# create all your tables 
db.create_all() 

# drop all your tables 
db.drop_all() 
+0

Nice one @ pech0rin - Мне придется немного реорганизовать это приложение и покончить с Flask-Script, но я вижу, как все это работает сейчас. Благодаря вашему ответу я также нашел [это] (http://stackoverflow.com/questions/13751277/how-can-i-use-an-app-factory-in-flask-wsgi-servers-and-why-might -это-быть небезопасным # 13754387) – hammygoonan

 Смежные вопросы

  • Нет связанных вопросов^_^