WEB开发网
开发学院软件开发Python Python 中的测试框架 阅读

Python 中的测试框架

 2007-03-30 12:35:07 来源:WEB开发网   
核心提示: 实用工具函数 pyobj_printer() 生成了任意 Python 对象(具体说是这样一个对象,它既没有用到 gnosis.xml.objectify 的任何其他实用工具,Python 中的测试框架(2),也没有用到 Gnosis Utilities 中的 任何其他东西)的一个 非-X

实用工具函数 pyobj_printer() 生成了任意 Python 对象(具体说是这样一个对象,它既没有用到 gnosis.xml.objectify 的任何其他实用工具,也没有用到 Gnosis Utilities 中的 任何其他东西)的一个 非-XML 表示。在以后的版本中,我将可能会把这个函数移到 Gnosis 包内的其他地方。无论如何, pyobj_printer() 使用各种类-Python 的缩进和符号来描述对象和它们的属性(类似于 pprint ,但是扩展了实例,而不仅限于扩展内置的数据类型)。

如果一些特别的 XML 可能不能正确被地“对象化(objectified)”, test_basic.py 脚本会提供一个很好的调试工具 -- 您可以可视化地查看结果对象的属性和值。此外,如果您重定向了 STDOUT,您可以查看 STDERR 上的简单消息,如这个例子中:

清单 2. 分析 STDERR 结果消息

$ python test_basic.py testns.xml > /dev/null
++ SUCCESS (using DOM)
++ FAILED (using EXPAT)

不过,上面运行的例子中对成功或失败的界定很不明显:成功只是意味着没有出现异常,而不表示(重定向的)输出 正确。

使用 doctest

doctest 模块让您可以在文档字符串(docstrings)内嵌入注释以显示各种语句的期望行为,尤其是函数和方法的结果。这样做很像是让文档字符串看起来如同一个交互式 shell 会话;完成这一任务的一个简单方法是,从一个 Python 交互式 shell 中(或者从 Idel、PythonWin、MacPython 或者其他带有交互式会话的 IDE 中)拷贝-粘贴。这一改进的 test_basic.py 脚本举例说明了自诊断功能的添加:

清单 3. 具有自诊断功能的 test_basic.py 脚本

import sys
from gnosis.xml.objectify import XML_Objectify, pyobj_printer, EXPAT, DOM
LF = "
"
def show(xml_src, parser):
  """Self test using simple or user-specified XML data
  >>> xml = '''<?xml version="1.0"?>
  ... <!DOCTYPE Spam SYSTEM "spam.dtd" >
  ... <Spam>
  ...  <Eggs>Some text about eggs.</Eggs>
  ...  <MoreSpam>Ode to Spam</MoreSpam>
  ... </Spam>'''
  >>> squeeze = lambda s: s.replace(LF*2,LF).strip()
  >>> print squeeze(show(xml,DOM)[0])
  -----* _XO_Spam *-----
  {Eggs}
    PCDATA=Some text about eggs.
  {MoreSpam}
    PCDATA=Ode to Spam
  >>> print squeeze(show(xml,EXPAT)[0])
  -----* _XO_Spam *-----
  {Eggs}
    PCDATA=Some text about eggs.
  {MoreSpam}
    PCDATA=Ode to Spam
  PCDATA=
  """
  try:
    xml_obj = XML_Objectify(xml_src, parser=parser)
    py_obj = xml_obj.make_instance()
    return (pyobj_printer(py_obj).encode('UTF-8'),
        "++ SUCCESS (using "+parser+")
")
  except:
    return ("","++ FAILED (using "+parser+")
")
if __name__ == "__main__":
  if len(sys.argv)==1 or sys.argv[1]=="-v":
    import doctest, test_basic
    doctest.testmod(test_basic)
  elif sys.argv[1] in ('-h','-help','--help'):
    print "You may specify XML files to objectify instead of self-test"
    print "(Use '-v' for verbose output, otherwise no message means success)"
  else:
    for filename in sys.argv[1:]:
      for parser in (DOM, EXPAT):
        output, message = show(filename, parser)
        print output
        sys.stderr.write(message)
        print "="*50

上一页  1 2 3 4 5 6 7  下一页

Tags:

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接