【问题标题】:Python using doctest on the mainlinePython 在主线上使用 doctest
【发布时间】:2010-08-14 01:04:15
【问题描述】:

您好,我想知道这是否可能,如果可能,如何?从主线做 doctests 或类似的事情,而不是像 doctest docs 中描述的那样测试一个函数 即

"""
>>> 
Hello World
"""

if __name__ == "__main__":
    print "Hello"
    import doctest
    doctest.testmod()

这是能够根据文档字符串测试学生脚本的一部分,我发现这段代码允许我输入两个强项

import doctest
from doctest import DocTestRunner, DocTestParser
enter code here
def run_doctest(code, test):
    import doctest
    from doctest import DocTestRunner, DocTestParser
    code = code + '\n__dtest=__parser.get_doctest(__test, globals(), "Crunchy Doctest", "crunchy", 0)\n__runner.run(__dtest)\n'
    runner = DocTestRunner()
    parser = DocTestParser()
    exec code in {'__runner':runner, '__parser':parser, '__test':test}

这或多或少,但似乎并不理想,关于任何一点的建议

【问题讨论】:

    标签: python string doctest


    【解决方案1】:

    doctest仅限于测试功能。例如,如果dt.py 是:

    '''
      >>> foo
      23
    '''
    
    foo = 23
    
    if __name__ == '__main__':
        import doctest
        doctest.testmod()
    

    然后,例如:

    $ py26 dt.py -v
    Trying:
        foo
    Expecting:
        23
    ok
    1 items passed all tests:
       1 tests in __main__
    1 tests in 1 items.
    1 passed and 0 failed.
    Test passed.
    

    (如果没有-v 也可以工作,但它不会有太多显示:只是沉默;-)。这是你要找的吗?

    【讨论】:

    • 不,如果程序正常运行会发生什么,我会更多
    • ...和?运行主脚本的主体和 doctest 有什么不“正常”的地方?似乎与您的复杂代码所做的没有任何不同——例如,在我的 A 示例中,foo = 23(然后检查foo 是否为23)。请编辑您的 Q 以提供您期望代替 enter code here 的示例以及为什么仅运行模块的 doctests(在其主体之后)不是您想要的,因为我认为我很困惑;-)。
    • 例如测试程序的输出(即通过打印输出的常规内容)
    • @Hugoagogo,为了针对已知(又名“黄金”)预期结果测试任何程序的整个标准输出,doctest 不是最优的(您在其设计之外使用它参数)。相反,使用subprocess 运行另一个程序,捕获其输出,并使用assertListEqual(参见docs.python.org/library/…)检查行列表与从“参考”(又名“黄金”)文件准备的行列表;或者,使用difflibdocs.python.org/library/difflib.html 进行更细微的比较(例如忽略空格等)。
    • mmm 那是我的原始路径,但我希望能够使用它以及标准文档测试,我可能不得不尝试结合使用两者
    猜你喜欢
    • 2018-06-21
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 2018-06-25
    • 2015-12-21
    • 1970-01-01
    相关资源
    最近更新 更多