代码之家  ›  专栏  ›  技术社区  ›  Bob Aman

如何使用Google App Engine设置TDD开发流程?

  •  15
  • Bob Aman  · 技术社区  · 16 年前

    我主要是一个Ruby爱好者,但最近我一直在研究很多Python的东西,特别是App Engine代码。在Ruby中,我会使用自动持续集成( autotest rcov reek heckle )在我的开发过程中,但我不确定如何最好地为App Engine环境设置类似的开发过程。我也对类似物感兴趣 RSpec Cucumber

    5 回复  |  直到 16 年前
        1
  •  15
  •   JasonSmith    16 年前

    在Python中,你并不总是能找到一对一的Ruby测试工具,但Python中有一些很棒的测试工具。我发现一些有用的工具包括:

    • unittest -Python标准库中包含的xUnit工具。它包括单元测试的所有基础知识。
    • doctest -标准库中一个很棒的部分,它允许您在函数、类、模块、方法的文档字符串中编写测试。它非常适合传达API的预期用途。 Ian Bicking 建议使用doctest进行行为驱动开发。Doctest非常适合 Sphinx 文档系统(您可以确保每次构建文档时,文档中的所有示例都通过)。
    • nose py.test 被视为unittest的下一代版本。它们可以运行所有现有的单元测试用例,但允许更简单的、非基于类的单元测试。py.test还允许分布式执行。
    • mock 是一个很好的模仿行为库。
    • tdaemon 监视一个目录以获取代码更新,并将重新执行测试套件。(我的 personal branch 包含一些未合并的改进)。
    • Buildbot , Bitten ,甚至 Hudson
    • coverage.py 计算代码的代码覆盖率。
    • pylint 将对您的代码进行类似lint的分析,确保它遵循常见的编码约定,没有任何常见的错误。还有一个“更轻”的分析工具, PyFlakes .
    • 有许多HTTP/Browser测试工具在Python中运行良好,包括 Twill , Selenium ,以及 Windmill .

    如果你在App Engine上使用Django,它包括 several extensions 到unittest,它允许您模拟HTTP客户端和数据库持久性。

    还有很多其他工具我没有使用过(比如 PySpec Behaviour )这也可能有所帮助。我还没有在Python中看到任何突变测试工具,但我打赌肯定有一个(我很想知道它是什么)。

    测试愉快!

        2
  •  26
  •   John Paulett    16 年前

    在我的GAE项目中,我使用:

    • NoseGAE --这是将所有其他部分联系在一起的关键部分
    • 嘲笑,就像约翰出色的回答一样。我主要将其用于AWS和其他web服务
    • 固定装置(包装,而不是想法)

    我也更喜欢Rails的许多习语。我使用Python包将测试分解为单元和函数。您可以使用以下命令运行测试的子集 --tests=unit --tests=functional 这一切都比Rails更手动,但至少我可以对困难的东西进行单元测试,并确保我永远不会有回归。

    我也做了一个简单的 FunctionalTest 类来执行Rails中许多非常常见的操作,例如 assert_response assert_xpath (类似于assert_select)。

    class FunctionalTest(Test):
      def get(self, *args, **kw):
        self.response = app.get(*args, **kw)
    
      def post(self, *args, **kw):
        self.response = app.post(*args, **kw)
    
      def assert_response(self, expected):
        pattern = str(expected) if re.search(r'^\d+$', expected) \
                                else (r'^\d+ %s' % expected)
        assert re.search(pattern, self.response.status, re.IGNORECASE), \
               'Response status was not "%s": %s' % (expected, self.response.status)
    
      def assert_xpath(self, path, expected):
        element = ElementTree.fromstring(self.response.body)
        found_nodes = element.findall('.' + path)
        if type(expected) is int:
          assert_equal(expected, len(found_nodes))
        elif type(expected) is str or type(expected) is unicode:
          assert (True in [(node.text == expected) for node in found_nodes])
        else:
          raise Exception, "Unknown expected value: %r" % type(expected)
    

    如果你正在进行大量的ListElement相等性搜索,一定要学习 --tests=foo 语法,因为测试列表中的匹配元素非常慢。

    有时我喜欢根据我的夹具数据加载Rails控制台,以查看测试环境中发生了什么(即。 script/console test --datastore_path="$TMPDIR/nosegae.datastore" (或可能替代 /tmp 为了 $TMPDIR .

        3
  •  3
  •   yamad    16 年前

    没有使用过App Engine,但我对最流行的python测试工具的感觉是

    • unittest/doctest 是Python标准的测试包吗 图书馆。unittest是python的xUnit。
    • nose 是一个测试跑步者/发现者。它有很多选择,包括 --with-coverage coverage 报告。
    • pylint 是python中最具特色的lint检查器。有用超越 语法检查器,因为它在以下情况下建议使用未使用的变量/函数 方法应该是函数,还有更多。
    • pester (突变检测)
    • buildbot (持续集成)

    您可能想参考以下(不太完整)列表 Python Testing Tools .

    对于BDD,上次我检查时字段很薄。许多真正的BDD工具 它们不能与nose一起使用和/或在所需的语法上过于受限。 你可能会有一些运气 spec ,这是一个类似BDD的nose插件。 刚刚发现 pyccuracy 试过了。

    不管它值多少钱,我现在只使用 nosetests -v (流鼻涕的 --verbose),它将使用测试运行器中docstring的第一行 输出。也就是说,给定这样的测试:

    class TestFoo(unittest.TestCase):
        def testAnyNameHere(self):
            """ Foo should be bar"""
            foo = "bar"
            self.assertEqual(foo, 'bar')
    

    鼻子测试将给出:

    $ nosetests -v
    Foo should be bar... ok
    
    -----------------------------
    Ran 1 tests in 0.002s
    OK
    
        4
  •  0
  •   Bob Aman    14 年前

    看起来另一个新的选择是 Agar google.appengine.ext.testbed ,App Engine SDK的一部分。看 this blog post