van.pg adalah modul Python yang menyediakan penciptaan mudah database PostgreSQL (dan cluster) untuk unit testing.
Kotor Database
Database pengujian membutuhkan waktu lama untuk membuat. Secara umum Anda harus sedikit berhati-hati ketika Anda memutuskan untuk menghapus / menciptakan perlengkapan database test.
Juga, ada tampaknya tidak ada cara yang kuat dalam PostgreSQL mencari tahu apakah database tersebut dilakukan atau tidak.
Jadi van.pg tidak memiliki pilihan selain untuk menempatkan tanggung jawab pada Anda untuk memberitahu ketika database kotor. Jika hal ini tidak dilakukan dengan benar, uji isolasi akan dikompromikan. Ini tidak ideal, tapi yang terbaik yang bisa kita lakukan.
Satu pengecualian adalah jika Anda konsisten menggunakan paket transaksi (http://pypi.python.org/pypi/transaction) untuk mengelola database melakukan. Dalam hal ini Anda dapat meminta sumber daya yang akan kotor setiap kali transaksi berkomitmen.
Integrasi dengan testresources
Cara khas untuk menggunakan perlengkapan ini adalah melalui testresources (http://pypi.python.org/pypi/testresources/):
& Nbsp; >>> dari testresources impor ResourcedTestCase
& Nbsp; >>> dari van.pg impor DatabaseManager
& Nbsp; >>> impor psycopg2
& Nbsp; >>> def init_db (db):
& Nbsp; ... conn = psycopg2.connect (host = db.host, database = db.database)
& Nbsp; ... skr = conn.cursor ()
& Nbsp; ... cur.execute ("CREATE TABLE foo (bar INTEGER);")
& Nbsp; ... conn.commit ()
& Nbsp; ... conn.close ()
& Nbsp; >>> kelas MyTest (ResourcedTestCase):
& Nbsp; ...
& Nbsp; ... sumber = [('db', DatabaseManager (initialize_sql = init_db))]
& Nbsp; ...
& Nbsp; ... def runTest (self):
& Nbsp; ... conn = psycopg2.connect (host = self.db.host, database = self.db.database)
& Nbsp; ... skr = conn.cursor ()
& Nbsp; ... cur.execute ("INSERT INTO NILAI foo (1);")
& Nbsp; ... conn.commit ()
& Nbsp; ... skr = conn.cursor ()
& Nbsp; ... cur.execute ("SELECT * FROM foo")
& Nbsp; ... self.assertEquals (cur.fetchall (), [(1,)])
& Nbsp; ... # CATATAN: harus menutup koneksi atau menjatuhkan database gagal
& Nbsp; ... conn.close ()
& Nbsp; ... self.db.dirtied () # kami mengubah DB, sehingga perlu re-loading
Benar-benar menjalankan tes:
& Nbsp; >>> dari unittest impor TextTestRunner
& Nbsp; >>> import sys
& Nbsp; >>> pelari = TextTestRunner (stream = sys.stdout)
& Nbsp; >>> runner.run (MyTest ()) # doctest: + elipsis
& Nbsp ;.
& Nbsp; ...
& Nbsp; OK
& Nbsp; ...
Database Menggunakan Template
Jika Anda perlu menciptakan database yang sama berkali-kali, itu bisa lebih cepat untuk membiarkan PostgreSQL menyalin database dari database Template. Anda dapat melakukan ini dengan memiliki satu DatabaseManager berfungsi sebagai template untuk yang lain:
& Nbsp; >>> template_db = DatabaseManager (initialize_sql = init_db)
& Nbsp; >>> kelas MyTest2 (MyTest):
& Nbsp; ... sumber = [('db', DatabaseManager (template = template_db))]
& Nbsp; >>> runner.run (MyTest2 ()) # doctest: + elipsis
& Nbsp ;.
& Nbsp; ...
& Nbsp; OK
& Nbsp; ...
integrasi transaksi
Jika kata kunci argumen dirty_on_commit Benar, DatabaseManager akan menandai database sebagai kotor setelah setiap sukses komit dilakukan melalui modul transaksi. Ini berarti setiap tes yang dirties database tidak harus secara manual memberitahu itu.
& Nbsp; >>> man = DatabaseManager (dirty_on_commit = True)
Jika Anda menggunakan fitur ini, Anda perlu bergantung pada transaksi (http://pypi.python.org/pypi/transaction) paket sendiri.
Menggunakan database yang sudah ada
Secara default, van.pg menciptakan cluster PostgreSQL baru di direktori sementara dan meluncurkan daemon PostgreSQL. Ini bekerja sebagian besar waktu, tetapi tidak sangat cepat.
Jika Anda memiliki PostgreSQL klaster sudah berjalan, Anda dapat memberitahu van.pg menggunakannya dengan menetapkan variabel lingkungan VAN_PG_HOST. Misalnya, untuk menjalankan tes van.pg terhadap server PostgreSQL lokal dengan itu soket di / tmp / pgcluster lakukan:
VAN_PG_HOST = / tmp / pgcluster python uji setup.py
PERINGATAN: basis data dimulai dengan test_db dalam database target kemungkinan akan turun.
Koneksi Penutupan
Hati-hati untuk benar menutup semua koneksi ke database setelah pengujian dilakukan dengan itu. PostgreSQL tidak memungkinkan menjatuhkan database sementara ada koneksi terbuka. Hal ini akan menyebabkan van.pg kesalahan ketika mencoba untuk menjatuhkan database test.
Programatically menciptakan sebuah cluster
Pada tingkat yang lebih rendah, Anda juga bisa pemrograman memanipulasi klaster PostgreSQL Anda sendiri.
Inisialisasi Cluster:
& Nbsp; >>> dari van.pg impor Cluster
& Nbsp; >>> klaster = Cluster ()
& Nbsp; >>> cluster.initdb ()
Yang menciptakan database dalam direktori sementara:
& Nbsp; >>> import os
& Nbsp; >>> dbdir = cluster.dbdir
& Nbsp; >>> 'PG_VERSION' di os.listdir (dbdir)
& Nbsp; Benar
Memulainya:
& Nbsp; >>> cluster.start ()
Buat / Uji database:
& Nbsp; >>> dbname = cluster.createdb ()
Kita dapat terhubung ke database:
& Nbsp; >>> impor psycopg2
& Nbsp; >>> conn = psycopg2.connect (database = dbname, host = cluster.dbdir)
& Nbsp; >>> skr = conn.cursor ()
Bermalas database untuk memastikan bahwa kami dapat melakukan dasar-dasar:
& Nbsp; >>> cur.execute ("CREATE TABLE x (y int)")
& Nbsp; >>> cur.execute ("INSERT INTO x VALUES (1)")
& Nbsp; >>> conn.commit ()
& Nbsp; >>> cur.execute ("SELECT * dari x")
& Nbsp; >>> cur.fetchall () [0] [0]
& Nbsp; 1
Menghentikan daemon klaster:
& Nbsp; >>> conn.close ()
& Nbsp; >>> cluster.stop ()
Mulai lagi:
& Nbsp; >>> cluster.start ()
& Nbsp; >>> conn = psycopg2.connect (database = dbname, host = cluster.dbdir)
& Nbsp; >>> skr = conn.cursor ()
& Nbsp; >>> cur.execute ("SELECT * dari x")
& Nbsp; >>> cur.fetchall () [0] [0]
& Nbsp; 1
Dan pembersihan:
& Nbsp; >>> conn.close ()
& Nbsp; >>> cluster.cleanup ()
& Nbsp; >>> cluster.dbdir adalah None
& Nbsp; Benar
& Nbsp; >>> os.path.exists (dbdir)
& Nbsp; Salah
Pengembangan
Pembangunan berlangsung pada GitHub:
& Nbsp; http: //github.com/jinty/van.pg
Apa yang baru dalam rilis ini:
- Dukungan Python 3.2.
- Gugurkan Python 2.5 support .
- Tambahkan tox.ini untuk pengujian terhadap beberapa versi python.
- Run PostgreSQL sebagai subproses daripada sebagai daemon (melalui pg_ctl).
- Re-mengatur kode untuk meningkatkan penggunaan kembali dan cakupan tes.
Persyaratan :
- Python
Komentar tidak ditemukan