Модульный тест Python PostgreSQL не завершает выполнение

У меня есть юнит-тест как

class TestUser(TestCase):
    def setUp(self):
        print 'setting db up'
        db.create_all()

    def test_new_user(self):
        user = User('test_new_user@none.com', 'welcome')
        db.session.add(user)
        db.session.commit()
        users_in_db = User.query.all()
        self.assertEquals(1, len(users_in_db))
        self.assertEquals(user.email, users_in_db[0].email)
        self.assertEquals(user._password, users_in_db[0]._password)
    def tearDown(self):
        print 'destroying db'
        db.drop_all()

Когда я запускаю это в командной строке, я вижу

python -m unittest discover
secret key: test secret key
db url: postgresql+psycopg2://testuser:testpasswd@localhost/mydb
setting db up
destroying db

Но это никогда не выходит, продолжайте висеть, что я делаю не так? Я новичок в модульном тестировании в Python и не знаю, как проверить, когда мне нужно подключиться к базе данных. пожалуйста, порекомендуйте

1 ответ

Решение

Поработав некоторое время и осмотревшись, у меня началось следующее. Это неэффективно, поскольку отбрасывает всю таблицу и создает их заново для каждого теста, но сейчас, в соответствии с вариантом использования, все в порядке, и оптимизация будет добавлена ​​позже.

Как хорошо сказал Дональд Кнут

"преждевременная оптимизация - первопричина всего зла"

class TestUser(TestCase):
    def setUp(self):
        db.create_all()

    def session_commit(self):
        try:
            db.session.commit()
        except:
            db.session.rollback()
        finally:
            pass

    def test_new_user(self):
        """
        test that new user is persisted in database
        """
        user = User('test_new_user@none.com', 'welcome')
        db.session.add(user)
        self.session_commit()
        users_in_db = db.session.query(User).all()
        self.assertEquals(1, len(users_in_db))
        self.assertEquals(user.email, users_in_db[0].email)
        self.assertEquals(user._password, users_in_db[0]._password)

    def tearDown(self):
        db.session.close()
        for tbl in reversed(db.metadata.sorted_tables):
            db.engine.execute(tbl.delete())
Другие вопросы по тегам