Как ускорить или протестировать управление контекстом в библиотеке Google cloud-ndb? - PullRequest
1 голос
/ 29 февраля 2020

Я нахожусь в процессе миграции приложения, работающего в Google App Engine Python 2.7 Стандартная среда от встроенной NDB до библиотеки в более новую библиотеку cloud-ndb (до перехода на Python 3 ). Новая библиотека требует контекста для всех вызовов NDB, и после некоторых исследований и разговоров с другими в списке электронной почты устройства я запустил подход, который вводит контекст в unittest setUp() и tearDown(). Все мои тестовые файлы получены из базового тестового класса shim.

#speed_test.py
from test._base_test import MyTestCase

class SpeedTest(MyTestCase):
  def test_simple(self):
    string = 'string'
    self.assertEqual('string', string)
#_base_test.py
import requests
import unittest
import webapp2

from google.cloud import ndb


class MyTestCase(unittest.TestCase):
  def setUp(self):
    self.testapp = webapp2.WSGIApplication([])
    # clear datastore
    requests.post('http://localhost:8089/reset')
    self.ndb_context = ndb.Client().context()
    self.ndb_context.__enter__()

  def tearDown(self):
    self.ndb_context.__exit__(None, None, None)
    mock.patch.stopall()

Проблема в том, что такой способ ввода контекста добавляет чуть менее 2 секунд к каждому из моих тестов. Это слегка раздражает мои тестовые файлы с дюжиной или меньшим количеством тестов, но наш полный набор тестов имеет 681 тест, и эта скорость просто неосуществима.

Приведенный выше простой тест скорости должен занимать долю секунды, чтобы завершено, но оно последовательно выполняется за 1,7 с или более. Если я закомментирую self.ndb_context = ndb.Client().context() и self.ndb_context.__enter__(), он падает примерно до 0,003 с.

Такое чувство, что менеджер контекста работает долго, но я не уверен, как дальше отлаживать производительность в этот момент. Я рад принять предложения о лучшем подходе или средствах для отладки того, что здесь происходит, чтобы я мог подать проблему с библиотекой, если это необходимо. Спасибо!

Ответы [ 2 ]

1 голос
/ 05 марта 2020

Проблема заключалась в неоднократном создании клиентского объекта NDB в методах setUp () / tearDown (). Как только я переместил клиента в переменную вне класса, он вернулся к ожидаемому уровню производительности.

#_base_test.py
import requests
import unittest
import webapp2

from google.cloud import ndb

NDB_CLIENT = ndb.Client()

class MyTestCase(unittest.TestCase):
  def setUp(self):
    self.testapp = webapp2.WSGIApplication([])
    # clear datastore
    requests.post('http://localhost:8089/reset')
    self.ndb_context = NDB_CLIENT.context()
    self.ndb_context.__enter__()

  def tearDown(self):
    self.ndb_context.__exit__(None, None, None)
    mock.patch.stopall()
0 голосов
/ 03 марта 2020

Может быть, вам следует вводить контекст только один раз вместо каждого теста. Попробуйте еще раз, но войдите в контекст, используя методы setUpClass и tearDownClass вместо setUp и tearDown. Вы найдете эти методы в документации unittest .

...