van.pg е Python модул, който осигурява възможност за лесно създаване на PostgreSQL бази данни (и клъстери) за единица тестване.
<Силен> Мръсни Базите
Тестови бази данни да отнеме много време, за да се създаде. По принцип трябва да бъде малко по-внимателни, когато решите да изтриете / пресъздаде тела тест база данни.
Също така, изглежда, че не е решително в PostgreSQL фигуриращ ако базата данни е извършено или не.
Така van.pg има друг избор, освен да се прехвърля отговорността върху вас да го уведоми, когато базата данни е мръсна. Ако това не е направено правилно, изолация тест ще бъде компрометирана. Това не е идеално, но най-доброто което можем да направим.
Едно изключение е ако сте постоянно използват пакета на сделката (http://pypi.python.org/pypi/transaction) за управление на база данни, се задължава. В този случай можете да попитате за ресурса да се dirtied когато е извършил сделка.
<Силен> Интеграция с testresources
Типичният начин за използване на тези тела е направо testresources (http://pypi.python.org/pypi/testresources/):
& Nbsp; >>> от testresources внасят ResourcedTestCase
& Nbsp; >>> от van.pg внос DatabaseManager
& Nbsp; >>> внос psycopg2
& Nbsp; >>> Def init_db (db):
& Nbsp; ... Кон = psycopg2.connect (хост = 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; ... Кон = psycopg2.connect (хост = 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 () # променихме ПБ, така че трябва повторно товарене
Всъщност това изпълнете теста:
& Nbsp; >>> от unittest внос TextTestRunner
& Nbsp; >>> внос Сис
& Nbsp; >>> бегач = TextTestRunner (поток = sys.stdout)
& Nbsp; >>> runner.run (MyTest ()) # doctest: + елипса
& Nbsp ;.
& Nbsp; ...
& Nbsp; OK
& 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; OK
& Nbsp; ...
<Силен> интеграция сделка
Ако ключовата дума argumen dirty_on_commit е True, а DatabaseManager ще отбележи на базата данни като dirtied след всеки успешен комит извършва чрез модула на сделката. Това означава всеки тест, който на мръсотиите на базата данни, не трябва да го уведоми ръчно.
& 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 тест = / TMP / pgcluster питон setup.py
ВНИМАНИЕ: всички бази данни, като се започва с test_db в целевата база данни има вероятност да бъде премахнато.
<Силен> Крайни Connections
Внимавайте за правилното затваряне на всички връзки към базата данни, след като си тест се прави с него. PostgreSQL не позволява отпадане бази данни, докато там са отворени връзки. Това ще доведе до van.pg на грешка при опит да се откажа от базата данни на тест.
<Силен> Programatically създаване на клъстер
На по-ниско ниво, можете също програмно манипулира собствения PostgreSQL клъстер.
Инициализиране на клъстера:
& Nbsp; >>> от van.pg внос Cluster
& 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; >>> вр = psycopg2.connect (база данни = DBNAME, домакин = cluster.dbdir)
& Nbsp; >>> тек = conn.cursor ()
Въртя на базата данни, за да се уверете, че не можем да направим основите:
& Nbsp; >>> cur.execute ("Създаване на маса х (у INT)")
& Nbsp; >>> cur.execute ("INSERT INTO Х-стойности (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; >>> вр = 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 е None
& Nbsp; True
& Nbsp; >>> os.path.exists (dbdir)
& Nbsp; False
<Силен> развитие
Развитие се извършва на GitHub:
& Nbsp; HTTP: //github.com/jinty/van.pg
Какво ново в тази версия:
- Поддръжка Python 3.2.
- Drop Python 2.5 поддръжка.
- Добави tox.ini за тестване срещу няколко версии питон.
- Run PostgreSQL като подпроцес, а не като демон (чрез pg_ctl).
- реорганизира код за подобряване повторна употреба и изпитването покритие.
<силни> Изисквания :
- Python
Коментари не е намерена