简体   繁体   English

使用带有flask-sql-alchemy的pythons单元测试setUp tearDown

[英]using pythons Unit-testing setUp tearDown with flask-sql-alchemy

The project is a webapp being deployed on heroku: 该项目是一个部署在heroku上的webapp:

Here are my simple unitests in db_test_many_create.py: 这是db_test_many_create.py中我最简单的单元:

import unittest
from petalapp.database.models import User, Hospital, Data, ROLE_USER
from petalapp import db

class BuildDestroyTables(unittest.TestCase):

    user_test_1 = User("test_user_nickname","user_email",ROLE_USER)
    data_test_1 = Data(1)
    hospital_test_1 = Hospital("test_hospital_1")

    def setUP(self):
        db.drop_all()
        db.create_all()


    def tearDown(self):
        db.session.remove()
        db.drop_all()


    def test_user_setup(self):

        db.session.add(self.user_test_1)
        db.session.commit()


if __name__ == "__main__":
    unittest.main()

When i run the command: 当我运行命令时:

heroku run python petalapp/database/db_test_many_create.py  --app warm-atoll-3630

to test it against my database, i get the following traceback: 要针对我的数据库对其进行测试,我得到以下回溯:

Running `python petalapp/database/db_test_many_create.py` attached to terminal... up, run.6505
E
======================================================================
ERROR: test_user_setup (__main__.BuildDestroyTables)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "petalapp/database/db_test_many_create.py", line 30, in test_user_setup
    db.session.commit()
  File "/app/.heroku/venv/lib/python2.7/site-packages/sqlalchemy/orm/scoping.py", line 114, in do
    return getattr(self.registry(), name)(*args, **kwargs)
  File "/app/.heroku/venv/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 703, in commit
    self.transaction.commit()
  File "/app/.heroku/venv/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 361, in commit
    self._prepare_impl()
  File "/app/.heroku/venv/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 340, in _prepare_impl
    self.session.flush()
  File "/app/.heroku/venv/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 1718, in flush
    self._flush(objects)
  File "/app/.heroku/venv/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 1789, in _flush
    flush_context.execute()
  File "/app/.heroku/venv/lib/python2.7/site-packages/sqlalchemy/orm/unitofwork.py", line 331, in execute
    rec.execute(self)
  File "/app/.heroku/venv/lib/python2.7/site-packages/sqlalchemy/orm/unitofwork.py", line 475, in execute
    uow
  File "/app/.heroku/venv/lib/python2.7/site-packages/sqlalchemy/orm/persistence.py", line 64, in save_obj
    table, insert)
  File "/app/.heroku/venv/lib/python2.7/site-packages/sqlalchemy/orm/persistence.py", line 558, in _emit_insert_statements
    execute(statement, params)
  File "/app/.heroku/venv/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1449, in execute
    params)
  File "/app/.heroku/venv/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1584, in _execute_clauseelement
    compiled_sql, distilled_params
  File "/app/.heroku/venv/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1698, in _execute_context
    context)
  File "/app/.heroku/venv/lib/python2.7/site-packages/sqlalchemy/engine/base.py", line 1691, in _execute_context
    context)
  File "/app/.heroku/venv/lib/python2.7/site-packages/sqlalchemy/engine/default.py", line 331, in do_execute
    cursor.execute(statement, parameters)
ProgrammingError: (ProgrammingError) relation "user" does not exist
LINE 1: INSERT INTO "user" (nickname, email, role) VALUES (E'test_us...
                    ^
 'INSERT INTO "user" (nickname, email, role) VALUES (%(nickname)s, %(email)s, %(role)s) RETURNING "user".id' {'nickname': 'test_user_nickname', 'role': 0, 'email': 'user_email'}

----------------------------------------------------------------------
Ran 1 test in 0.349s

FAILED (errors=1)

however if i make the changes (i thought it was making) in the interactive session: 但是,如果我在交互式会话中进行了更改(我认为是在进行更改):

In [2]: from petalapp.database.models import User, Hospital, Data, ROLE_USER

In [3]: from petalapp import db

In [4]: db.drop_all()

In [5]: db.create_all()

In [6]: user_test_1 = User("test_user_nickname","user_email",ROLE_USER)

In [7]: db.session.add(user_test_1)

In [8]: db.session.commit()

In [9]: u = User.query.get(1)

In [10]: print(u)
<Name : u'test_user_nickname'>

Everything turns out as i would expect, which leads me to believe i'm not using setUp and tearDown correctly. 一切都如我所料,这使我相信我没有正确使用setUp和tearDown。 How can I effectively test my database using unittests? 如何使用unittests有效地测试数据库?

I spot setUP() instead of setUp() in your code. 我在您的代码中发现了setUP()而不是setUp() This would explain why your db doesn't seem initialized, since unittest.TestCase 's setUp() is not overridden and thus not run. 这可以解释为什么您的数据库似乎没有初始化,因为unittest.TestCasesetUp()没有被覆盖,因此无法运行。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM