如何在Google应用引擎中运行Python单元测试

4

我对Google App Engine和Python还比较陌生,请谅解。 我正在尝试在GAE上第一次运行一个Python单元测试,遵循Webapp2指南的步骤。

但是当我运行测试时,一直出现以下错误:

Traceback (most recent call last):
  File "test.py", line 2, in <module>
    import webapp2
ImportError: No module named webapp2

这是我的test.py文件:
import unittest
import webapp2

# from the app main.py
import main

class TestHandlers(unittest.TestCase):
   def test_hello(self):
       # Build a request object passing the URI path to be tested.
       # You can also pass headers, query arguments etc.
       request = webapp2.Request.blank('/')
       # Get a response for that request.
       response = request.get_response(main.app)

       # Let's check if the response is correct.
       self.assertEqual(response.status_int, 200)
       self.assertEqual(response.body, 'Hello, world!')

if __name__ == '__main__':
    unittest.main()

这是我的main.py文件:

import webapp2

class HelloHandler(webapp2.RequestHandler):
    def get(self):
        self.response.write('Hello, world!')

app = webapp2.WSGIApplication([('/', HelloHandler)])

def main():
    app.run()

if __name__ == '__main__':
    main()

这是我的app.yaml文件:

application: test-app
version: 1
runtime: python27
api_version: 1
threadsafe: true

- url: /.*
  script: main.app

libraries:
- name: jinja2
  version: latest

builtins:
- remote_api: on

我的当前文件夹结构如下:

Test-app
         app.yaml
         main.py
         test.py
         index.yaml

我正在进行测试的运行:

$ cd test-app
$ python test.py

有人能指点我正确的方向,告诉我为什么会出现上面的错误信息以及为什么我无法运行这个简单的测试吗?

我尽可能地发布了尽可能多的信息,希望能足够让有经验的人帮我一下。

谢谢。

3个回答

2

Webapp2已包含在Google提供的运行时中,但需要通过在app.yaml中使用libraries指令来配置其支持。

请参阅有关直接支持的第三方库的文档:https://developers.google.com/appengine/docs/python/tools/libraries27

在您的情况下,您需要包含:

libraries:
- name: webapp2
  version: "latest" 

在你的app.yaml文件中加入这段代码,这样你就可以在不必将webapp2包含到你的代码库中的情况下部署你的代码。
对于未列在第三方库文档或未列出版本的库,另一个答案是正确的。

1

感谢Tim Hoffman和cdonts的回复,他们确实让我思考了这个问题,而且Tim Hoffman几乎是正确的。

我的意思是webapp2已经作为一个库包含在google app engine中(google_appengine/lib/webapp2-2.5.2)。所以我无法运行我的测试是因为我没有将google_appengine/lib添加到$PYTHONPATH,这就是为什么"import webapp2"没有按预期工作的原因。

因此,由于我正在使用virtualenv,我所做的就是简单地将google_appengine/lib(目录)添加到我的virtualenv的$PYTHONPATH中,方法如下:

# add2virtualenv ---> adds/this/directory/to/the/PYTHONPATH
$ add2virtualenv google_appengine/lib/webapp2-2.5.2 

# check which directories have been added to the virtualenv
$ add2virtualenv
Usage: add2virtualenv dir [dir ...]

Existing paths:
google_appengine/lib/webapp2-2.5.2 

测试现在正在运行并且按预期工作,谢谢你们。


-1

Google App Engine支持一些Web框架:Django,web.py,webapp2等,但不包括它们。您需要将它们的源代码(或在您的情况下是webbapp2源代码)与应用程序一起放置。

您可以从 此处 下载webapp2框架。

因此,现在您将拥有:

Test-app
     app.yaml
     main.py
     test.py
     index.yaml
     webapp2/

部署完成,准备就绪!

希望能对您有所帮助。


1
虽然这通常适用于许多第三方库,但对于一些Django版本、Webapp和Webapp2等不正确。请参阅此文档,了解在运行时提供的第三方库。https://developers.google.com/appengine/docs/python/tools/libraries27 - Tim Hoffman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接