Модульное тестирование Django: Как протестировать параллельные операции с базой данных? - PullRequest
8 голосов
/ 07 марта 2011

Я создаю библиотеку Django, которая использует оптимистический контроль параллелизма , чтобы предотвратить одновременную запись и привести к несогласованности данных. Я бы хотел написать модульные тесты для этой функции, но я не уверен, как этого добиться.

Я знаю, что модульные тесты Django являются однопоточными, поэтому я могу представить себе работу тестов, если одновременно открыть два отдельных подключения к базе данных (к одной и той же базе данных) и переключить, какое соединение используется Django ORM при выполнении запросов хотя я не уверен, что переключение соединения возможно даже в Django.

Какие существуют методы для тестирования одновременных операций с базой данных с Django?

Ответы [ 4 ]

3 голосов
/ 07 марта 2011

Какие существуют методы для тестирования одновременных операций с базой данных с Django?

На самом деле, Django здесь не проблема.

Ваша библиотека для оптимистичного управления параллелизмом должен быть самодостаточным для тестирования.

Снаружи Django;используя только unittest.

Вам потребуется протестировать многопоточные (и многопроцессорные) тестовые драйверы.За пределами Django.

Как только вы убедитесь, что это работает, вы можете проверить в Django, просто чтобы убедиться, что API работает.

Как только вы убедитесь, что все это работает, вы должнынаписать простой тестовый драйвер urllib2, который выполняет множество параллельных транзакций на отдельном сервере Django.Мы написали небольшую программу, которая запускает сервер Django, запускает тесты, используя urllib2, а затем убивает сервер Django.

В более фундаментальном смысле вам понадобится какое-то довольно формальное доказательство того, что ваша идея работает,Это намного, намного важнее любого тестирования.

2 голосов
/ 08 марта 2011

На самом деле, проверка работоспособности параллельной техники практически невозможна. Очень легко пропустить одно маленькое условие гонки. Единственный реальный способ - это доказать ваш код, однако это большая работа;)

1 голос
/ 08 марта 2011

Один из способов справиться с этим - создать несколько копий сервера выполнения Django в отдельных процессах, направленных на одну и ту же БД.Затем ваш модульный тест порождает потоки / процессы, и все они стучат по серверам выполнения, осуществляющим ваш параллелизм.Во время разрыва вы присоединяетесь ко всем своим процессам.

0 голосов
/ 28 января 2019

используйте gevent:

import gevent

def foo():
    print('Running in foo')
    gevent.sleep(0)
    print('Explicit context switch to foo again')

def bar():
    print('Explicit context to bar')
    gevent.sleep(0)
    print('Implicit context switch back to bar')

gevent.joinall([
    gevent.spawn(foo),
    gevent.spawn(bar),
])


Running in foo
Explicit context to bar
Explicit context switch to foo again
Implicit context switch back to bar

http://sdiehl.github.io/gevent-tutorial/

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