很长一段时间以来,我一直在AppEngine上使用任务队列来安排任务,就像我应该的那样。
但是我一直想知道的是如何为此编写测试?到目前为止,我只是进行了测试,以确保在排队任务的API上不会发生错误,然后为执行任务的API编写更合适的测试。
但是最近我开始对此感到有点不满意,我正在寻找一种方法来实际测试正确的任务是否已添加到正确的队列中。希望这可以通过部署代码并希望最好的方式来完成。
我正在使用django-nonrel,如果这与答案有关。
回顾:如何编写单元测试以确认任务已排队?
答案 0 :(得分:18)
如果您使用google.appengine.ext.testbed
代替GAE Testbed(GAE Testbed现已弃用且已移至ext.testbed
),您可以执行以下操作:
import base64
import unittest2
from google.appengine.ext import deferred
from google.appengine.ext import testbed
class TestTasks(unittest2.TestCase):
def setUp(self):
self.testbed = testbed.Testbed()
self.testbed.activate()
self.testbed.init_taskqueue_stub()
self.taskqueue_stub = self.testbed.get_stub(testbed.TASKQUEUE_SERVICE_NAME)
def tearDown(self):
self.testbed.deactivate()
def test_send_contact_request(self):
# Make the request to your app that "defers" something:
response = ...
self.assertEqual(response.status_int, 200)
# Get the task out of the queue
tasks = self.taskqueue_stub.get_filtered_tasks()
self.assertEqual(1, len(tasks))
# Run the task
task = tasks[0]
deferred.run(task.payload)
# Assert that other things happened (ie, if the deferred was sending mail...)
self.assertEqual(...)
答案 1 :(得分:13)
使用GAE Test Bed将允许您存根任务队列。
如果您继承自FunctionalTestCase
或TaskQueueTestCase
,则会获得get_tasks
和assertTasksInQueue
等方法。
您也可以实际执行任务。如何操作取决于您是使用任务还是延迟。
对于延期,我有一些像这样的代码:
from google.appengine.ext import deferred
import base64
# gets the most recent task -- since the task queue is reset between tests,
# this is usually what you want
def get_task(self):
for task in self.get_task_queue_stub().GetTasks('default'):
return task
# decode and execute the deferred method
def run_deferred(task):
deferred.run(base64.b64decode(task['body']))
运行任务类似,但在您获取任务后,您使用WebTest(GAE测试床构建在其上)作为POST请求以其参数提交给任务的URL。
答案 2 :(得分:1)
有一个名为gaetestbed的小测试框架可能适合您的需要。有关详细信息,请参阅:https://github.com/jgeewax/gaetestbed。
此测试环境与nose,nose-gae插件和WebTest包有关。考虑到python包的混合是我所关注的测试GAE应用程序的最佳方法。
答案 3 :(得分:0)
SDK 1.4.3 Testbed API为本地集成测试提供了简单的存根库配置。
Task Queue
的服务存根可用。