Django-подобная база данных модульного тестирования в простом Python - PullRequest
0 голосов
/ 28 июня 2018

У меня есть проект Python, который использует Postgresql. Я хотел бы использовать django-подобные модульные тесты, где база данных создается и уничтожается при каждом тесте. Однако я не хочу использовать sqlalchemy. Я пробовал что-то вроде этого:

pg = psycopg2.connect(
"host={} dbname={} user={} password={}".format(
POSTGRES_HOST, 'postgres', POSTGRES_USER, POSTGRES_PASSWORD))

pg.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)
cur = pg.cursor()




def reset_db():
    cur.execute('DROP DATABASE IF EXISTS {} '.format(POSTGRES_DB))
    cur.execute('CREATE DATABASE {}'.format(POSTGRES_DB))

    newconn = psycopg2.connect(
    "host={} dbname={} user={} password={}".format(
    POSTGRES_HOST, POSTGRES_DB, POSTGRES_USER, POSTGRES_PASSWORD))

    newcur =  newconn.cursor()

    # SCHEMAS is an imported dict containing schema creation instructions
    for schema in SCHEMAS:
        newcur.execute(SCHEMAS[schema])

    return newcur

class Test(TestCase):
    def setUp(self):
        os.environ['testing'] = 'true'
        self.cur = reset_db()

Затем метод setUp устанавливает переменную среды, которая информирует мой уровень базы данных об использовании базы данных тестирования.

Кажется, это работает нормально. Единственная проблема заключается в том, что reset_db () занимает около 0,8 секунд, что слишком много.

Есть ли лучшие подходы или способы оптимизировать мой подход?

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Вы можете попробовать то, что делает Django - запускать транзакцию перед каждым тестом и откатывать ее после, отменяя любые изменения БД, сделанные во время теста.

0 голосов
/ 28 июня 2018

Воссоздание БД после каждого теста является довольно дорогой операцией.

Возможно, одним из возможных решений было бы создание вашей БД один раз в начале, а затем только удаление всех данных из всех таблиц после каждого теста?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...