2013-03-30 2 views
0

je test unitaire commetest unitaire PostgreSQL python ne pas terminer l'exécution

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

    def test_new_user(self): 
     user = User('[email protected]', '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() 

Quand je lance ceci sur la ligne de commande, je vois

python -m unittest discover 
secret key: test secret key 
db url: postgresql+psycopg2://testuser:[email protected]/mydb 
setting db up 
destroying db 

Mais il ne sort jamais, continuer à la pendaison, qu'est-ce que je fais de mal? Je suis novice dans les tests unitaires en python et je ne sais pas comment tester quand je dois me connecter à une base de données. S'il vous plaît conseiller

Répondre

0

Après avoir lutté pendant un certain temps et en regardant autour de moi, ce qui suit a commencé à travailler pour moi. Il est inefficace car il supprime toutes les tables et les crée de nouveau pour chaque test, mais pour l'instant selon le cas d'utilisation, c'est bien et l'optimisation sera ajoutée plus tard.

Comme bien dit Donald Knuth

"l'optimisation prématurée est la cause racine de tous les maux"

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('[email protected]', '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())