2017-07-30 3 views
0

Die Frage ist einfach, die Antwort weiß ich nicht ...Python Doctest: Wie testet man eine Datenbank einfügen oder löschen Funktion?

Ich bin Anfänger mit Tests und ich habe Probleme beim Testen der Klasse für eine SQL3-Datenbank. Was ist der beste Weg, um eine Klasse wie diese zu testen? Testen Sie die Klasse oder testen Sie die init Funktion ist kein Problem, aber die anderen? der Test eine Testreihe einfügen?

import sqlite3 


class DataBase: 
    def __init__(self): 
     self._database_path = 'data.sql' 
     self._conn = sqlite3.connect(self._database_path) 
     self._cursor = self._conn.cursor() 

    def get(self, sql): 
     # select 
     self._cursor.execute(sql) 
     dataset = [] 
     for row in self._cursor: 
      dataset.append(row) 

     return dataset 

    def post(self, sql): 
     # insert 
     self._cursor.execute(sql) 
     self._conn.commit() 

Vielen Dank für alle von Ihnen, vielen Dank für Ihre Antworten !!

Antwort

0

Sie können die Rollback-Funktion der Datenbank verwenden. Ersetzen Sie einfach self._conn.commit() durch self._conn.rollback() und Sie können die Gültigkeit Ihrer SQL ohne Auswirkungen auf die Daten testen.

Wenn Sie eine Reihe von Aktionen testen müssen (zB: Daten abrufen-> Daten ändern-> neue Daten einfügen-> einige Daten löschen-> Daten erneut abrufen) Sie können alle _conn.commit() in Ihrem Code entfernen, führen Sie die Tests und schließlich Anruf _conn.rollback().

Beispiel:

import sqlite3 


class DataBase: 
    def __init__(self): 
     self._database_path = 'data.sql' 
     self._conn = sqlite3.connect(self._database_path) 
     self._cursor = self._conn.cursor() 

    def get(self, sql): 
     # select 
     self._cursor.execute(sql) 
     dataset = [] 
     for row in self._cursor: 
      dataset.append(row) 

     return dataset 

    def post(self, sql): 
     # insert 
     self._cursor.execute(sql) 

    def delete(self, sql): 
     # delete 
     self._cursor.execute(sql) 

    def rollback(self): 
     self._conn.rollback() 

# You do your tests: 
db = DataBase() 
data = db.get('select name from table') 
new_data = ['new' + name for name in data] 
db.post('insert into table values {}'.format(','.join('({})'.format(d) for d in new_data))) 
db.delete('delete from table where name = \'newMario\'') 
check = bool(db.get('select name from table where name = \'newMario\'')) 
if check: 
    print('delete ok') 

# You make everything as before the test: 
db.rollback() 
+0

Vielen Dank für Ihre Antwort aber: Was ist, wenn ich es mit DocTest tun muss? Es ist möglich, ausführlicher Code in DocTest auszuführen? – user1936566

0

Ich denke, die CursorTests in offiziellen sqlite3 Tests ist ein gutes Beispiel.

https://github.com/python/cpython/blob/master/Lib/sqlite3/test/dbapi.py#L187

Sie können setUp und tearDown Methoden schreiben, die Datenbank einzurichten und zu Rollback.

from unittest import TestCase 


class TestDataBase(TestCase): 
    def setUp(self): 
     self.db = DataBase() 

    def test_get(self): 
     pass # your code here 

    def test_post(self): 
     pass # your code here 
+0

Vielen Dank für Ihre Antwort, aber: Was, wenn ich es mit DocTest tun muss? Es ist möglich?? – user1936566

Verwandte Themen