van.pg είναι μια ενότητα Python που παρέχει εύκολη δημιουργία βάσεων δεδομένων PostgreSQL (και clusters) για τον έλεγχο της μονάδας.
Dirty βάσεις δεδομένων
Βάσεις δεδομένων δοκιμής πάρει πολύ χρόνο για να δημιουργήσει. Σε γενικές γραμμές θα πρέπει να είναι λίγο προσεκτικοί όταν αποφασίσετε να διαγράψετε / αναδημιουργήσει ένα φωτιστικό δοκιμαστική βάση δεδομένων.
Επίσης, δεν φαίνεται να υπάρχει ισχυρή τρόπο στην PostgreSQL του υπολογισμού για το εάν μια βάση δεδομένων διαπράχθηκε ή όχι εκεί.
Έτσι van.pg δεν έχει άλλη επιλογή από το να τοποθετήσει την ευθύνη για το σας για να ειδοποιεί όταν μια βάση δεδομένων είναι βρώμικο. Εάν αυτό δεν γίνει σωστά, η απομόνωση της δοκιμής θα είναι σε κίνδυνο. Δεν είναι ιδανικό, αλλά το καλύτερο που μπορούμε να κάνουμε.
Μια εξαίρεση είναι εάν χρησιμοποιείτε συνεχώς το πακέτο της συναλλαγής (http://pypi.python.org/pypi/transaction) για τη διαχείριση της βάσης δεδομένων δεσμεύεται. Σε αυτή την περίπτωση, μπορείτε να ζητήσετε για τον πόρο να λασπώσει όταν ολοκληρωθεί η συναλλαγή.
Ενσωμάτωση με testresources
Ο συνήθης τρόπος για να χρησιμοποιήσετε αυτά τα φωτιστικά είναι μέσω testresources (http://pypi.python.org/pypi/testresources/):
& Nbsp? >>> Από testresources εισαγωγή ResourcedTestCase
& Nbsp? >>> Από van.pg DatabaseManager εισαγωγής
& Nbsp? >>> Psycopg2 εισαγωγής
& Nbsp? >>> Def init_db (dB):
& Nbsp? ... Conn = psycopg2.connect (host = db.host, βάση δεδομένων = db.database)
& Nbsp? ... Τρέχ = conn.cursor ()
& Nbsp? ... Cur.execute ("δημιουργία τραπεζιού foo (μπαρ ακέραιος αριθμός)?")
& Nbsp? ... Conn.commit ()
& Nbsp? ... Conn.Close ()
& Nbsp? >>> Τάξη myTest (ResourcedTestCase):
& Nbsp? ...
& Nbsp? ... Πόροι = [(«DB», DatabaseManager (initialize_sql = init_db))]
& Nbsp? ...
& Nbsp? ... Def runTest (αυτο):
& Nbsp? ... Conn = psycopg2.connect (host = self.db.host, βάση δεδομένων = self.db.database)
& Nbsp? ... Τρέχ = conn.cursor ()
& Nbsp? ... Cur.execute ("Insert Into ΤΙΜΕΣ foo (1)?")
& Nbsp? ... Conn.commit ()
& Nbsp? ... Τρέχ = conn.cursor ()
& Nbsp? ... Cur.execute ("SELECT * FROM foo")
& Nbsp? ... Self.assertEquals (cur.fetchall (), [(1,)])
& Nbsp? ... # ΣΗΜΕΙΩΣΗ: πρέπει να κλείσει τις συνδέσεις ή την πτώση των βάσεων δεδομένων αποτυγχάνει
& Nbsp? ... Conn.Close ()
& Nbsp? ... Self.db.dirtied () # αλλάξαμε την DB, γι 'αυτό χρειάζεται εκ νέου φόρτωση
Στην πραγματικότητα εκτελέστε τον έλεγχο:
& Nbsp? >>> Από unittest TextTestRunner εισαγωγής
& Nbsp? >>> Sys εισαγωγής
& Nbsp? >>> Δρομέας = TextTestRunner (ρεύμα = sys.stdout)
& Nbsp? >>> Runner.run (myTest ()) # doctest: + ελλειπτικό
& Nbsp ;.
& Nbsp? ...
& Nbsp? ΟΚ
& Nbsp? ...
Βάσεις δεδομένων Χρήση προτύπου
Αν χρειαστεί να αναδημιουργήσει την ίδια βάση δεδομένων πολλές φορές, μπορεί να είναι πιο γρήγορα να αφήσουμε PostgreSQL αντιγράψετε τη βάση δεδομένων από μια βάση δεδομένων πρότυπο. Μπορείτε να το κάνετε αυτό, έχοντας ένα DatabaseManager να χρησιμεύσει ως πρότυπο για μια άλλη:
& Nbsp? >>> Template_db = DatabaseManager (initialize_sql = init_db)
& Nbsp? >>> Κατηγορία MyTest2 (myTest):
& Nbsp? ... Πόροι = [(«DB», DatabaseManager (πρότυπο = template_db))]
& Nbsp? >>> Runner.run (MyTest2 ()) # doctest: + ελλειπτικό
& Nbsp ;.
& Nbsp? ...
& Nbsp? ΟΚ
& Nbsp? ...
ολοκλήρωση της συναλλαγής
Αν η λέξη-κλειδί argumen dirty_on_commit είναι αλήθεια ότι ένας DatabaseManager θα σηματοδοτήσει τη βάση δεδομένων ως dirtied μετά από κάθε επιτυχημένη commit γίνεται μέσω της μονάδας της συναλλαγής. Αυτό σημαίνει ότι κάθε δοκιμή που λερώνει τη βάση δεδομένων δεν πρέπει να κοινοποιήσουν το χέρι.
& Nbsp? >>> Άνθρωπος = DatabaseManager (dirty_on_commit = True)
Εάν χρησιμοποιήσετε αυτήν τη δυνατότητα, θα πρέπει να εξαρτάται από την συναλλαγή (http://pypi.python.org/pypi/transaction) πακέτο από μόνοι σας.
Χρήση μιας υπάρχουσας βάσης δεδομένων
Από προεπιλογή, van.pg δημιουργεί ένα νέο σύμπλεγμα PostgreSQL σε έναν προσωρινό κατάλογο και εγκαινιάζει ένα δαίμονα PostgreSQL. Αυτό λειτουργεί το μεγαλύτερο μέρος του χρόνου, αλλά δεν είναι πολύ γρήγορη.
Εάν έχετε ήδη τρέχει συμπλέγματος PostgreSQL, μπορείτε να πείτε van.pg να το χρησιμοποιήσει, ορίζοντας τη μεταβλητή περιβάλλοντος VAN_PG_HOST. Για παράδειγμα, για να εκτελέσετε δοκιμές van.pg ενάντια σε ένα τοπικό διακομιστή PostgreSQL με το είναι υποδοχές στο / tmp / pgcluster κάνετε:
VAN_PG_HOST δοκιμή setup.py = / tmp / pgcluster Python
ΠΡΟΕΙΔΟΠΟΙΗΣΗ: οποιεσδήποτε βάσεις δεδομένων που αρχίζουν με test_db στη βάση δεδομένων στόχος είναι πιθανό να πέσει.
Συνδέσεις Κλείσιμο
Να είστε προσεκτικοί για να κλείσει σωστά όλες τις συνδέσεις με τη βάση δεδομένων μόλις το τεστ γίνεται με αυτό. PostgreSQL δεν επιτρέπει την πτώση των βάσεων δεδομένων, ενώ υπάρχουν ανοιχτές συνδέσεις. Αυτό θα προκαλέσει van.pg σε λάθος όταν προσπαθεί να ρίξει τη βάση δεδομένων της δοκιμής.
Programatically δημιουργώντας ένα σύμπλεγμα
Σε χαμηλότερο επίπεδο, μπορείτε επίσης προγραμματισμού χειραγωγήσουν τη δική σύμπλεγμα PostgreSQL σας.
Διαμορφώστε το Cluster:
& Nbsp? >>> Από van.pg συμπλέγματος των εισαγωγών
& Nbsp? >>> Σύμπλεγμα = Cluster ()
& Nbsp? >>> Cluster.initdb ()
Η οποία δημιουργεί μια βάση δεδομένων σε έναν προσωρινό κατάλογο:
& Nbsp? >>> Os εισαγωγής
& Nbsp? >>> Dbdir = cluster.dbdir
& Nbsp? >>> «PG_VERSION» σε os.listdir (dbdir)
& Nbsp? True
Ξεκινήστε το:
& Nbsp? >>> Cluster.start ()
Δημιουργία / Δοκιμάστε μια βάση δεδομένων:
& Nbsp? >>> Dbname = cluster.createdb ()
Μπορούμε να συνδεθεί με τη βάση δεδομένων:
& Nbsp? >>> Psycopg2 εισαγωγής
& Nbsp? >>> Conn = psycopg2.connect (βάση δεδομένων = dbname, υποδοχής = cluster.dbdir)
& Nbsp? >>> Τρέχ = conn.cursor ()
Παίζω τη βάση δεδομένων για να βεβαιωθείτε ότι μπορούμε να κάνουμε τα βασικά:
& Nbsp? >>> Cur.execute ("δημιουργία τραπεζιού x (y int)")
& Nbsp? >>> Cur.execute («insert into x values (1)")
& Nbsp? >>> Conn.commit ()
& Nbsp? >>> Cur.execute ("SELECT * από χ")
& Nbsp? >>> Cur.fetchall () [0] [0]
& Nbsp? 1
Τερματισμός του δαίμονα σύμπλεγμα:
& Nbsp? >>> Conn.Close ()
& Nbsp? >>> Cluster.stop ()
Ξεκινήστε πάλι:
& Nbsp? >>> Cluster.start ()
& Nbsp? >>> Conn = psycopg2.connect (βάση δεδομένων = dbname, υποδοχής = cluster.dbdir)
& Nbsp? >>> Τρέχ = conn.cursor ()
& Nbsp? >>> Cur.execute ("SELECT * από χ")
& Nbsp? >>> Cur.fetchall () [0] [0]
& Nbsp? 1
Και τον καθαρισμό:
& Nbsp? >>> Conn.Close ()
& Nbsp? >>> Cluster.cleanup ()
& Nbsp? >>> Cluster.dbdir είναι Κανένας
& Nbsp? True
& Nbsp? >>> Os.path.exists (dbdir)
& Nbsp? Λάθος
Ανάπτυξη
Ανάπτυξη γίνεται στο GitHub:
& Nbsp? Http: //github.com/jinty/van.pg
Τι είναι καινούργιο σε αυτήν την έκδοση:
- Υποστήριξη Python 3.2.
- Drop Python 2.5 υποστήριξη.
- Προσθήκη tox.ini για δοκιμές σε σχέση με πολλαπλές εκδόσεις της python.
- Run PostgreSQL ως δευτερεύουσα και όχι ως ένα δαίμονα (μέσω pg_ctl).
- Re-οργανώσει κωδικό για να βελτιωθεί η επαναχρησιμοποίηση και η κάλυψη δοκιμή.
Απαιτήσεις :
- Python
Τα σχόλια δεν βρέθηκε