在GAE中对webapp.RequestHandler进行单元测试 - Python

5 投票
2 回答
962 浏览
提问于 2025-04-16 18:52

我在设置我的开发环境以进行测试驱动开发(TDD)时遇到了一些困难,特别是在使用Google App Engine和Python方面。(我对Python也还很陌生。)我的环境配置如下:

  • Google App Engine 1.5.0
  • IntelliJ 10.2
  • IntelliJ设置为这个项目使用Python 2.5.4

我在使用带有Python插件的IntelliJ,所以运行单元测试只需要按下ctrl-shft-f10就可以了。

我也阅读了关于测试环境的文档,并成功测试了数据存储和内存缓存。但是,我现在卡住了,不知道怎么对我的请求处理器(RequestHandlers)进行单元测试。我在Google上查阅了很多文章,大部分都是在gaetestbed合并到gae作为测试环境之前的内容。

在下面的代码示例中,我想知道如何编写一个单元测试(可以在IntelliJ中运行),来测试对'/'的调用是否返回了-> 首页。

from google.appengine.ext import webapp
import wsgiref.handlers

class MainHandler(webapp.RequestHandler):

    def get(self):
        self.response.out.write('Home Page')

paths = [
          ('/', MainHandler)
        ]

application = webapp.WSGIApplication(paths, debug=True)

def main():
    wsgiref.handlers.CGIHandler().run(application)

if __name__ == '__main__':
    main()

根据Nick Johnson的回答,我添加了一个名为test的新文件夹,并在这个文件夹中添加了一个叫做unit_test.py的文件。在这个文件中,我添加了以下代码(根据Kris的回答进行了修改):

from StringIO import StringIO
from main import MainHandler
import unittest
from google.appengine.ext import webapp

class MyTestCase(unittest.TestCase):
    def test_get(self):
        request = webapp.Request({
            "wsgi.input": StringIO(),
            "CONTENT_LENGTH": 0,
            "METHOD": "GET",
                            "PATH_INFO": "/",
        })
        response = webapp.Response()
        handler = MainHandler()
        handler.initialize(request, response)
        handler.get()
        self.assertEqual(response.out.getvalue(), "Home Page")

现在它可以正常工作了!

2 个回答

1

最简单的方法是创建一个处理器,然后把请求和响应对象传给它,接着检查结果是否正确:

request = webapp.Request({
    "wsgi.input": StringIO.StringIO(),
    "CONTENT_LENGTH": 0,
    "METHOD": "GET",
})
request.path = '/'
response = webapp.Response()
handler = MainHandler()
handler.initialize(request, response)
handler.get()
self.assertEqual(response.body, "Home Page")
3

我发现我需要对Nick Johnson的代码做一些小修改:

request = webapp.Request({
    "wsgi.input": StringIO.StringIO(),
    "CONTENT_LENGTH": 0,
    "METHOD": "GET",
    "PATH_INFO": "/",
})
response = webapp.Response()
handler = MainHandler()
handler.initialize(request, response)
handler.get()
self.assertEqual(response.out.getvalue(), "Home Page")

撰写回答