2011-11-14 24 views
3

如何让我的(Python 2.7)代码知道它是否在doctest中运行?如何确定代码是否在doctest中运行?

的情况如下:我有一个功能,print()小号一些输出传递作为参数文件描述符,这样的事情:

from __future__ import print_function 

def printing_func(inarg, file=sys.stdout): 
    # (do some stuff...) 
    print(result, file=file) 

但是当我尝试在一个文档测试使用printing_func() ,测试失败;由于我在调用print()时指定了关键字参数file,所以输出结果实际上是sys.stdout,而不是默认的输出重定向由doctest模块设置,并且doctest从未看到输出。

那么我怎么能让printing_func()知道它是否在doctest中运行,以便它在调用print()时知道不会通过file关键字参数?

回答

1

我想出答案阅读doctest.py后;张贴在这里为后人...

文档测试通过向sys.stdout分配新的文件描述符重定向标准输出。问题在于,在doctest重新定义之前,我的函数描述正在关闭原始文件描述符sys.stdout的值。

相反,如果我做到以下几点:

def printing_func(inarg, file=None): 
    # (do some stuff...) 

    if file is None: 
     file = sys.stdout 

    print(result, file=file) 

然后printing_func()将捕获sys模块,而不是sys.stdout,并且当它运行时将检索如果测试中运行文档测试的从sys重新定义stdout属性。

编辑:这也产生了一个简单的方法来检查我们是否在一个文档测试中运行:

def inside_doctest(original_stdout=sys.stdout): 
    return original_stdout != sys.stdout 
+0

这是一个比试图弄清楚你是否在doctest内更好的计划。 –

+0

我同意雷蒙德;将代码添加到您的系统以检查它是否正在测试并使其行为不同的想法绝对不是测试方法的理想选择! – Ben

+0

我一般都认同,但我认为如果只为了支持测试基础设施而这样做是有害的。 – mshroyer

0

我不知道有没有办法告诉你在文档测试短的是检查堆栈。

0

FWIW(和抱歉迟到和冗余),许多开发商认为,“如果测试”作为一个反。

I.e.如果被测试的代码在被测试时比在“真实”运行时做了不同的事情,那么你就会遇到麻烦。即使你相信你有一个很好的理由。因此,上述评论赞扬你的解决方案不这样做。当我试图使用“如果测试”模式时,我尝试对事物进行重构,这样就不需要了。

1

Niten的版本inside_doctest似乎过于宽泛。重新定义sys.stdout对于日志记录或在doctest以外的框架中测试时并不是不寻常的,因此它会给出误报。

较窄的测试看起来是这样的:

import sys 

def in_doctest(): 
    return hasattr(sys.modules['__main__'], '_SpoofOut') 

def test(): 
    """ 
    >>> print 'inside comments, running in doctest?', in_doctest() 
    inside comments, running in doctest? True 
    """ 
    print 'outside comments, running in doctest?', in_doctest() 

if __name__ == '__main__': 
    test() 

in_doctest测试为_SpoofOut类文档测试使用,以取代sys.stdout。 doctest模块还有其他一些属性可以通过相同的方式进行验证。并不是说你可以阻止另一个模块重用名字,但是这个名字并不常见,所以这可能是一个体面的测试。

把上面的代码放在test.py中。在非文档测试模式下运行它,python test.py产量:

在文档测试详细模式下运行,python -m doctest test.py -v产量:

Trying: 
    print 'inside comments, running in doctest?', in_doctest() 
Expecting: 
    inside comments, running in doctest? True 
ok 

我与其他人的意见一致认为,使代码知道文档测试的通常是一个坏理念。我只在有些异乎寻常的情况下才做到这一点 - 当我需要通过代码生成器创建测试用例时,因为太多而无法高效地手工制作。但如果你需要这样做,以上是一个体面的测试。

相关问题