您在App Engine上使用了哪些方法进行轻量级Pythonunit testing?

我即将开始一些基于Python的大型App Engine项目,我认为在进行unit testing之前,我应该检查Stack Overflow的“人群智慧”。 我想要使​​用一个现有的unit testing框架(基于unittest的自定义运行和扩展),所以像鼻子 , webtest或gaeunit这些“重量级”/“侵入性”的东西似乎并不合适。 在我的世界观中,关键的unit testing是非常轻量级和快速的,在极短的时间内运行,所以我可以不断地运行它们,而不会破坏我的开发节奏(例如,对于不同的项目, 97%左右的20K线项目覆盖率,几十次超快速testing,总体耗时5-7秒,这是一个典型的运行时间,这就是我认为的一个体面的小型快速unit testing套件,testing)。 当然,我还会进行更丰富/更重的testing,一直到用selenium或风车进行集成testing,这不是我所要求的;-) – 我关注这个问题(在我的大部分开发工作中;-)就是小而轻的unit testing,它能轻而易举地覆盖我的代码,而不是更深的代码。

所以我想我所需要的实质上是一组小的,非常轻量级的App Engine子系统模拟 – 数据存储,memcache,请求/响应对象以及对webapp处理程序,用户处理,邮件和c的调用优先顺序。 我还没有find我正在寻找的东西,所以在我看来,我应该依靠mox ,就像我以前经常做的那样,这基本上意味着嘲笑在给定testing中使用的每个子系统,并设置所有的期望&c(每一次都很强,但是很多工作,而且对被testing代码的内部非常敏感,也就是非常“白匣子”),或者滚动我自己的每个子系统的模拟(并且在模拟的子系统上进行断言)作为unit testing的一部分)。 鉴于GAE的Python方面强大的“存根”架构,后者似乎是可行的,但我不敢相信我需要推出我自己的,也就是说,没有人已经写过这么简单的模拟器!)例如,对于数据存储,它看起来像我所需要的或多或less是已经是SDK一部分的“数据存储在文件”存根(stub),另外还有一种方法来标记它是只读和易于使用的访问器,用于断言数据存储的状态; 子系统 – 每个子系统似乎都需要“比SDK中已经存在的多一点”,位于现有“存根”架构的“顶端”。

所以,在深入研究和花费一两天宝贵的开发时间来“单独testing”GAE子系统的模拟来进行unit testing之前,我想我会仔细检查一下SO人群,看看你们是怎么想的。 ..或者,如果已经有一些现有的开放源代码的模拟器集合,我可以简单的重复使用(或者是最小的调整!),而我在search中却没有发现这些东西 – )

编辑 :澄清,如果我做我自己的,我打算在可行的情况下利用SDK提供的存根(stub) 但是,例如,对于最初从文件读入数据存储区但没有保存在最后的数据存储区,没有存根,因此我需要对现有存储区进行子类化和调整(也不提供特别便利的方法来对其进行断言状态 – 与邮件服务存根相同,等等)。 这就是我所说的“滚动自己的” – 而不是“从头开始改写” – )

编辑 :“为什么不GAEUnit” – GAEUnit是很好的自己的用例,但运行dev_appserver和在我的浏览器(甚至通过urllib.urlopen)看到的结果是绝对不是我以后 – 我想使用完全自动化的设置,适合在基于扩展unittest的现有的testing运行框架内运行,并且没有HTTP方式(所述框架将“快速”testing定义为除了其他之外没有套接字和最小磁盘I / O – 我们模拟或模拟这些 – 所以通过gaeunit我可以做比“中等”testing没有更好的)+没有方便的方式预先填充每个testing的数据存储(没有OO结构来帮助定制的东西)。

您不需要编写自己的存根(stub) – SDK包含它们,因为它们是用来模拟生产API的。 不是所有的都适合在unit testing中使用,但是大多数都是。 查看这个代码,了解使用内置存根需要的设置/拆卸代码示例。

NoseGAE是一个支持unit testing的插件,通过为您自动设置开发环境和testing数据存储来支持。 在dev_appserver上开发时非常有用。

我将GAEUnit用于Google App Engine应用程序,对testing的速度感到非常满意。 我喜欢GAEUnit的东西,我确信Webtest可以做到这一点,就是它为testing的所有东西创build了自己的版本,让你的“实时”版本单独用于testing。

所以,当你运行你的GAETests时,你可能用于开发的数据存储将保持原样。

我还可以补充一点, Fixture在我的unit testing中非常有用。 它可以让你创build模型的声明性语法,它转换成存储的实体,你可以在你的testing中加载。 这样您就可以在每个testing用例的开头都有相同的数据集,这样可以避免在每次testing开始时手动创build数据。 下面是Fixture文档中的一个例子:给定这个模型:

 from google.appengine.ext import db class Entry(db.Model): title = db.StringProperty() body = db.TextProperty() added_on = db.DateTimeProperty(auto_now_add=True) 

你的夹具看起来像这样:

 from fixture import DataSet class EntryData(DataSet): class great_monday: title = "Monday Was Great" body = """\ Monday was the best day ever. """ 

但请注意,我遇到以下问题:1. 此错误 ,但附带的修补程序可以补救它。 2.数据存储在testing用例之间不被默认重置。 所以我用这个强制每个testing用例的重置:

 class TycoonTest(unittest.TestCase): def setUp(self): # Clear out the datastore before starting the test. apiproxy_stub_map.apiproxy._APIProxyStubMap__stub_map['datastore_v3'].Clear() self.data = self.load_data() self.data.setup() os.environ['SERVER_NAME'] = "dev_appserver" self.after_setUp() def load_data(self): return datafixture.data(*dset.__all__) def after_setUp(self): """ After setup """ pass def tearDown(self): # Teardown data. try: self.data.teardown() except: pass 

SDK 1.4.3 Testbed API为本地集成testing提供了简单的存根库configuration。

由于SDK的1.3.1版本有内置的unit testing框架 。

现在只是Java,但我觉得:

  1. 你在你的问题中谈论的内容是相同的(还有更多 – 例如在云中运行testing)
  2. 而且使用SDK在Python上实现相同的function也是非常有可能的

那么这个框架的作者Max Ross也是如此,他在I / O演示文稿“Google App Engine的testing技术”中明确告诉我们,

有没有人有关于这个话题的任何更新?