тестирование чередующихся длинных запросов в django - PullRequest
7 голосов
/ 21 мая 2011

Я пытаюсь написать тесты для запросов 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

Я бы хотел понять, что происходит,Кроме того, я хотел бы знать, существует ли лучшая стратегия для тестирования параллельных запросов.

Ответы [ 2 ]

1 голос
/ 28 июня 2015

Как говорит Роб, в то время, когда задавался вопрос, это было невозможно с SQLite.Однако, начиная с Django 1.8 (см. https://docs.djangoproject.com/en/1.8/topics/testing/overview/):

. При использовании базы данных SQLite в памяти с Python 3.4+ и SQLite 3.7.13+, общий кэш будет включен, поэтому вы можете писать тестыс возможностью совместного использования базы данных между потоками.

Так что, если у вас есть возможность обновить, она должна работать.

1 голос
/ 14 июля 2011

Вы не можете использовать многопоточность в базах данных памяти (в данном случае sqlite3), в Django посмотрите эту ошибку . Ваш тест, вероятно, будет работать с PostgreSQL или MySQL.

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