`

我怎么在Google App Engine上进行敏捷开发(GAE下的unit test较好实践)

阅读更多

GAE上面的Unittest总结: http://ihere.appspot.com/post/2465
我是个推崇敏捷开发 重构 TDD 小步迭代 快速交付的 开发者,本来一直都用java来开发 , 最近迷上了python, google app engine, django
一开始我就想python上面的敏捷开发应该是怎么样的, 那阵还真不太了解 碰了不少壁:-( 经过一段时间的总结在 现在慢慢找到python gae上面开发的套路了, 觉得这个应该是GAE上开发以及unittest的较好实践了:P  特此发文分享:-)

参考:unit-tests-for-google-app-engine-apps, gaeunit, appengine helper

首先我想直接通过django的test 来测试gae上的app, 众所周知 appengine的mode层与django完全不同 这样其实直接运行test是不可取的 通过查阅这篇文章unit-tests-for-google-app-engine-apps得知 :其实appengine 的开发sdk本身已经提供了很多api stub 来帮助我们写unit test.  其实主要的地方是在test的setup方法里面注册这些stub 以及设置必要的环境变量, 以我发的demo 做个讲解

# coding=UTF-8
import unittest,os,urllib
from django.test.client import Client
#import the stubs, i.e. the fake datastore, user and mail service and urlfetch
from google.appengine.api import apiproxy_stub_map
from google.appengine.api import datastore_file_stub
#from google.appengine.api import mail_stub
from google.appengine.api import urlfetch_stub
from google.appengine.api import user_service_stub
from google.appengine.api.memcache import memcache_stub

from django.utils.encoding import force_unicode,smart_str
from google.appengine.api import users
from django.test import TestCase

from google.appengine.ext.db.djangoforms import ModelForm
import unittest
from django.test.client import Client
from google.appengine.api import users
import logging
from models import *

#How I do gae test:-)
#1.
#using gaeunit: http://code.google.com/p/gaeunit/
#and need to fix a bug of Django : Ticket #5176
#http://code.djangoproject.com/ticket/5176

#2.
#using appengine_django_helper:
#http://code.google.com/intl/zh-CN/appengine/articles/appengine_helper_for_django.html
#http://appengineguy.com/2008/06/proper-unit-testing-of-app-enginedjango.html [GFW blocked]
#run from cmd: manage.py test upload
#Here i use the 2nd way:P
#enjoy
class FileTest(unittest.TestCase):
  
    def setUp(self):      
        # Start with a fresh api proxy.
        apiproxy_stub_map.apiproxy = apiproxy_stub_map.APIProxyStubMap()

        # Use a fresh stub datastore.
        # From this point on in the tests, all calls to the Data Store, such as get and put,
        # will be to the temporary, in-memory datastore stub.       
        stub = datastore_file_stub.DatastoreFileStub(u'myTemporaryDataStorage', '/dev/null', '/dev/null')
        apiproxy_stub_map.apiproxy.RegisterStub('datastore_v3', stub)

        # Use a fresh stub UserService.
        apiproxy_stub_map.apiproxy.RegisterStub('user', user_service_stub.UserServiceStub())
        os.environ['AUTH_DOMAIN'] = 'gmail.com'
        os.environ['USER_EMAIL'] = 'myself@appengineguy.com' # set to '' for no logged in user
        os.environ['SERVER_NAME'] = 'testserver'
        os.environ['SERVER_PORT'] = '80'
        os.environ['USER_IS_ADMIN'] = '1' #admin user 0 | 1
        os.environ['APPLICATION_ID'] = 'appId'
      
        # Use a fresh urlfetch stub.
        apiproxy_stub_map.apiproxy.RegisterStub('urlfetch', urlfetch_stub.URLFetchServiceStub())

        #User a memcache stub
        apiproxy_stub_map.apiproxy.RegisterStub('memcache', memcache_stub.MemcacheServiceStub())

        # Use a fresh mail stub. mail stub have a conflit with the other api by now in the real gae environment. so comment it.
#        apiproxy_stub_map.apiproxy.RegisterStub('mail', mail_stub.MailServiceStub())

        # Every test needs a client. using django test client
        self.client = Client()     

...

可以看到 蓝色部分是在注册gae的api stub (想深入研究 可以看看sdk 里面的dev_appserver.py 那里有具体的使用方法)
注意我使用了 Django的Test Client 来模拟Http请求  使用时候需要fix个bug 改django.zip里面的文件 如果使用我得demo 的话是已经改好的:-)

接下来是个简单的test:

    def test_add_file(self):
        file=open('upload/testtxt.txt')
      
        response = self.client.post('/album/', {'file': file})
        file.close()
        self.failUnlessEqual(response.status_code, 302)
      
        returnResponse = self.client.get('/album/')
        self.assertTrue('testtxt.txt' in returnResponse.content)
        userFile=UserFile.all().filter("name =","testtxt.txt").get()
        self.assertTrue(userFile is not None)

向'/album/' 发起post请求  上传一个文件  并对response进行验证.

def tearDown(self):
        #For that we are using a temporary datastore stub located in the memory,we don't have to clean up.
        pass

tearDown不需要做任何动作  因为最开始setup的时候 只是在内存中建立了一个临时datastore


这就是一个完整的 unit test 例子:-)

上面这个例子 在本地控制台 直接 manage test upload 可以直接运行 不需要启动gae的dev_appserver
但是通过一段时间的开发发现本地的sdk环境与gae的实际环境不完全相同.本机调试ok ,上传之后 ,可能在实际环境中还会有意料之外的bug:-(  有没有一种方式可以在实际的环境中进行测试呢? 老外已经看到这个了 并且有了解决方案 就是 : gaeunit    它由http ajax驱动test的执行, 大家可以看我页面sidebar左下 lab 里面有个run test 就是这个出于安全原因当然只有admin才可以执行. 下面说下怎么将django 本身的test与gae unit结合,并且不留重复code:-)
gaeunit 执行的时候会执行所有test文件夹下的test 我的demo 中test/test_upload.py
中只有一句话:
from upload.tests import FileTest

简单吧:P 而FileTest就是我们之前写的django unit test .这样集成之后这两种方式可以混用而且没有重复test code :-)
本地开发时候可以运行 manage test upload
而在gae 实际环境中又可以 直接在浏览器:http://yourhost/test
来执行gae unit test
每次看到这个都很高兴:-)

 

  • 大小: 24.5 KB
  • 大小: 37.5 KB
8
1
分享到:
评论

相关推荐

    云端代码Google App Engine编程指南 高清带书签

    在谈论《云端代码Google App Engine编程指南》之前,我们需要先了解一下Google App Engine(GAE)平台的背景知识。Google App Engine(简称GAE)是由Google公司提供的一个无服务器(serverless)的云计算平台,该...

    Google App Engine 入门教程

    标题中提到的“Google App Engine 入门教程”意味着本文将介绍如何开始使用GAE这一服务,而描述中提到了“eclipse插件”,说明教程将会涉及如何在Eclipse开发环境中使用Google App Engine插件来开发应用。...

    google app engine开发人员文档

    Google App Engine(GAE)是谷歌提供的一种云计算平台,它允许开发者构建并托管Web应用程序,无需管理和维护服务器硬件。这个平台支持多种编程语言,包括Python、Java、Go和PHP,为开发者提供了强大的服务,如数据...

    在Google App Engine上开发Flex应用(含简单示例源码)

    在Google App Engine上开发Flex应用是一项技术性强且充满挑战的任务,它涉及到多个技术栈的集成。Google App Engine(GAE)是一个基于云的平台,用于构建和运行Web应用程序,而Flex是一种用于创建富互联网应用程序...

    基于Google App Engine(GAE)的Java和GWT应用开发

    基于Google App Engine(GAE)的Java和GWT应用开发_Google App Engine Java and GWT Application Development Nov.2010

    google app engine示例源代码

    clock.rar 这是我今天做的一个基于google app engine写的一个在该平台上开发app的示例,通过该示例的学习,我们可以很快上手学会怎样在GAE上开发属于你的应用程序了,希望对大家有用!

    Using Google App Engine

    Google App Engine(GAE)是Google推出的一款用于构建和托管Web应用的平台服务,它为开发者提供了丰富的工具和资源,使得开发者能够轻松地在Google的基础设施上运行应用程序。本文章将深入探讨GAE的核心概念、工作...

    Google App Engine的一些限制

    Google App Engine (GAE) 是Google Cloud Platform的重要组成部分之一,它为开发者提供了构建高效、可扩展的应用程序的平台。本文旨在详细介绍GAE在资源使用方面的一些关键限制,帮助开发者更好地理解和规划应用程序...

    GAE(Google App Engine)空间申请使用教程及 GAE域名捆绑方法

    ### GAE(Google App Engine)空间申请使用教程及 GAE域名捆绑方法 #### GAE简介与功能概述 GAE(Google App Engine)是由谷歌提供的一个强大的云服务平台,它允许开发者构建并托管各种类型的应用程序。从实用性...

    google app engine开发实例

    在这个"google app engine开发实例"中,我们将探讨如何在GAE上实现基本的数据操作:插入、更改、删除和搜索。 1. **数据存储模型**: GAE使用一种名为Datastore的分布式NoSQL数据库,它支持非关系型数据存储。在...

    Google App Engine 开发包(part1,共2部分)

    Eclipse Google 插件 Google App Engine SDK for Java Google App Engine文档 按钮 Google App Engine 开发包

    基于Google.App.Engine(GAE)的Java和GWT应用开发.pdf

    中文名: 基于Google App Engine(GAE)的Java和GWT应用开发 原名: Google App Engine Java and GWT Application Development 作者: Daniel Guermeur, Amy Unruh 资源格式: PDF 版本: 文字版 出版社: Packt ...

    Google App Engine

    Google App Engine(GAE)是谷歌提供的一款云端应用程序开发平台,允许开发者使用Python、Java、Go或PHP等语言编写应用,并在谷歌的基础设施上运行。它提供了完整的服务器环境,包括存储、数据库、计算资源和网络...

    Google App Engine开发人员指南

    Google App Engine Docs,Google App Engine开发人员指南(Java版),简体中文离线文档,起始页为主目录下的appengine\docs\docs.html

    GAE for linux (google_appengine_1.9.10)

    google_appengine_1.9.10 for linux 发布于2014-08-28 To install on Linux: Unzip the App Engine SDK file you downloaded (google_appengine_1.9.10.zip), for example: unzip google_appengine_1.9.10.zip ...

    使用Google App Engine架设网站.pdf

    接着,下载并安装Google App Engine SDK,注意SDK的安装需要在Python已安装的基础上进行。安装后可能出现一些错误,如日志文件中的错误,通常关闭重试或清理相关日志文件即可解决。 【本地测试】 准备好网站源码后...

    WingIDE部署GAE(google app engine)

    这篇文章将带你深入了解如何使用WingIDE这一强大的Python集成开发环境来部署应用程序到Google App Engine(GAE),一个由Google提供的云服务平台,允许开发者构建、运行和托管Web应用。WingIDE以其高效的代码编辑、...

Global site tag (gtag.js) - Google Analytics