#django #multithreading #unit-testing
#django #многопоточность #модульное тестирование
Вопрос:
Я пытаюсь написать тесты для запросов django, обработка которых может занять много времени и, следовательно, может чередоваться с другими запросами. Мой план состоял в том, чтобы выдать длительный запрос и внедрить утверждения в места, где он может приостановиться.
Но попытка использовать многопоточность в моем модульном тестировании, похоже, не работает должным образом:
class ThreadTest(test.TestCase):
def thread_test(self):
def printer():
print models.Daemon.objects.count()
d = models.Daemon(url='http://lockss.notadomain:8088')
d.save()
printer()
t = threading.Thread(target=printer)
t.start()
t.join()
Вызов printer () работает так, как я ожидал в первый раз, но затем при вызове из потока не удается найти таблицу:
1
Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib/python2.6/threading.py", line 532, in __bootstrap_inner
self.run()
File "/usr/lib/python2.6/threading.py", line 484, in run
self.__target(*self.__args, **self.__kwargs)
File "/home/bhayes/lockss-code/hare/lockss-django/autest/tests.py", line 247, in printer
print models.Daemon.objects.count()
File "/usr/lib/pymodules/python2.6/django/db/models/manager.py", line 120, in count
return self.get_query_set().count()
File "/usr/lib/pymodules/python2.6/django/db/models/query.py", line 326, in count
return self.query.get_count(using=self.db)
File "/usr/lib/pymodules/python2.6/django/db/models/sql/query.py", line 394, in get_count
number = obj.get_aggregation(using=using)[None]
File "/usr/lib/pymodules/python2.6/django/db/models/sql/query.py", line 366, in get_aggregation
result = query.get_compiler(using).execute_sql(SINGLE)
File "/usr/lib/pymodules/python2.6/django/db/models/sql/compiler.py", line 727, in execute_sql
cursor.execute(sql, params)
File "/usr/lib/pymodules/python2.6/django/db/backends/sqlite3/base.py", line 200, in execute
return Database.Cursor.execute(self, query, params)
DatabaseError: no such table: autest_daemon
Я хотел бы понять, что происходит. Кроме того, я хотел бы знать, существует ли лучшая стратегия для тестирования параллельных запросов.
Комментарии:
1. Не уверен, действительно ли это применимо к тестированию, но рассматривали ли вы возможность использования celeryd для выполнения асинхронной обработки?
2. Возможно, Джек прав, celeryd действительно надежен.
Ответ №1:
Вы не можете использовать потоковую обработку с базами данных в памяти (в данном случае sqlite3) в Django, смотрите эту ошибку. Ваш тест, вероятно, будет работать с PostgreSQL или MySQL.
Ответ №2:
Как говорит Роб, на момент, когда был задан вопрос, это было невозможно с SQLite. Однако, начиная с Django 1.8 (см. https://docs.djangoproject.com/en/1.8/topics/testing/overview /):
При использовании базы данных SQLite в памяти с Python 3.4 и SQLite 3.7.13 общий кэш будет включен, поэтому вы можете писать тесты с возможностью совместного использования базы данных между потоками.
Итак, если у вас есть возможность обновить, это должно сработать.