Python 如何区分webapp和unittest之间的模型类

Python 如何区分webapp和unittest之间的模型类,python,google-app-engine,Python,Google App Engine,我开始在使用谷歌应用程序引擎时查看unittest。从我所读到的来看,这似乎有点棘手。因为您不能(也不想)对数据存储运行测试 我编写了一个抽象类来模拟数据存储模型类。在get、all、fetch等返回类似dbModel的结果时(仅在小规模上进行了尝试),它返回模拟数据的效果非常好 有一件事我还没有找到一个我满意的解决方案,那就是如何区分要使用哪个模型类。我想使用实体模型进行单元测试,并在webapp运行时使用实际的db.Model 我当前的解决方案在My.py(包含所有db.Models)中如下

我开始在使用谷歌应用程序引擎时查看unittest。从我所读到的来看,这似乎有点棘手。因为您不能(也不想)对数据存储运行测试

我编写了一个抽象类来模拟数据存储模型类。在get、all、fetch等返回类似dbModel的结果时(仅在小规模上进行了尝试),它返回模拟数据的效果非常好

有一件事我还没有找到一个我满意的解决方案,那就是如何区分要使用哪个模型类。我想使用实体模型进行单元测试,并在webapp运行时使用实际的db.Model

我当前的解决方案在My.py(包含所有db.Models)中如下所示:

if 'SERVER_SOFTWARE' in os.environ:
    class dbTest(db.Model):
        content = db.StringProperty()
        comments = db.ListProperty(str)
else:
    class dbTest(Abstract):
        content = 'Test'
        comments = ['test1', 'test2']

感觉它随时都可能破裂。这是一种方法,还是可以将它们组合为一个类,如果正确调用db.Model,则使用其他模型?

而不是弄乱您的
models.py
,我会同意

我在几个项目中成功地使用了它,我喜欢的功能有:

  • 只需将一个文件(gaeunit.py)添加到您的项目中,您就差不多完成了
  • Gaeunit将测试数据存储与开发存储区隔离(即测试不会污染开发数据库)

  • 我不会弄乱你的
    模型.py
    ,我会选择它

    我在几个项目中成功地使用了它,我喜欢的功能有:

  • 只需将一个文件(gaeunit.py)添加到您的项目中,您就差不多完成了
  • Gaeunit将测试数据存储与开发存储区隔离(即测试不会污染开发数据库)

  • 你要解决的问题不止一个

    首先,对于使用GAE仿真运行测试,您可以看一看,这是我最喜欢的。如果不想从浏览器中运行它们,则可以查看(部分)。这将为您提供命令行测试


    第二,关于你关于“创建依赖项开销”的评论,听起来你在寻找一个好的单元测试和模拟框架。这将允许您模拟数据库进行不需要点击的测试。试试看。

    这里有不止一个问题需要解决

    首先,对于使用GAE仿真运行测试,您可以看一看,这是我最喜欢的。如果不想从浏览器中运行它们,则可以查看(部分)。这将为您提供命令行测试

    第二,关于你关于“创建依赖项开销”的评论,听起来你在寻找一个好的单元测试和模拟框架。这将允许您模拟数据库进行不需要点击的测试。尝试并退出。

    签出()。它省去了数据存储(以及所有其他服务,如memcache),并使从命令行进行测试变得非常容易。它确保在每次测试运行之前都有一个干净的环境

    我个人认为它比我见过的其他解决方案更好。

    请查看()。它省去了数据存储(以及所有其他服务,如memcache),并使从命令行进行测试变得非常容易。它确保在每次测试运行之前都有一个干净的环境

    我个人认为这比我见过的其他解决方案要好

    因为你不能(也不想) 对数据存储运行测试

    事实并非如此。您可以而且应该将本地数据存储实现用作测试工具—没有理由浪费时间为每个数据存储行为创建模拟。正如其他海报所建议的,您可以使用诸如noseGAE或gaeunit之类的工具,但如果您想自己设置,请参阅

    因为你不能(也不想) 对数据存储运行测试


    事实并非如此。您可以而且应该将本地数据存储实现用作测试工具—没有理由浪费时间为每个数据存储行为创建模拟。正如其他海报所建议的,您可以使用noseGAE或gaeunit等工具,但如果您想自己设置,请参见。

    谢谢,我以前看过if。但是我觉得在浏览器上运行我的所有测试有点混乱,最重要的是我想把发生的事情的逻辑分开。但是我错过了分离数据存储的一部分,这很好。也许这是正确的方法。看,你可以用某种方式从命令行运行你的测试。“分离发生的逻辑”是什么意思?对于一些测试来说,数据是如何产生的并不重要,重要的是如何处理数据类型。假设我想基于同一对象的另一个属性的值来操作一个属性。我希望能够像在webapp中一样运行相同的代码,但是测试本身应该关心它是如何获得数据的。我觉得在我的测试中加入一个真实的数据存储会产生依赖性的开销。但是我觉得在浏览器上运行我的所有测试有点混乱,最重要的是我想把发生的事情的逻辑分开。但是我错过了分离数据存储的一部分,这很好。也许这是正确的方法。看,你可以用某种方式从命令行运行你的测试。“分离发生的逻辑”是什么意思?对于一些测试来说,数据是如何产生的并不重要,重要的是如何处理数据类型。假设我想基于同一对象的另一个属性的值来操作一个属性。我希望能够像在webapp中一样运行相同的代码,但是测试本身应该关心它是如何获得数据的。我觉得在我的测试中使用真实的数据存储会产生依赖性的开销。请不要调用变量
    列表
    !请不要调用变量
    列表
    !我一直认为这就是unittest和实现测试之间的区别,但我得到了纠正。感谢您的链接,我们在这里基于WebTest()和Nick的代码片段进行应用程序引擎测试。他们工作得很好