Python unittest调用和意外程序运行

时间:2014-04-15 07:51:53

标签: python unit-testing

假设我有一个简单的python程序和一个简单的测试文件

iseven.py:

import math

def is_even(n):
    return n%2==0

print is_even(2)
print is_even(3)

和test_iseven.py:

import unittest
from iseven import is_even

class IsevenTests(unittest.TestCase):
    def test1(self):
        self.assertTrue(is_even(2))
        self.assertFalse(is_even(3))

if __name__ == '__main__':
    unittest.main()

之间运行测试是否有区别
python test_iseven.py

python -m unittest test_iseven.py

?因为我在指南和教程中都看过,输出是相同的。另外:测试仅适用于那个功能,但是在运行测试时执行整个程序,因此我在控制台中获得程序的输出。这不应该发生,对吗?

1 个答案:

答案 0 :(得分:1)

  

......之间是否存在差异?

执行测试没有太大区别。

主要区别在于,在后一种情况下,您可以省略

if __name__ == '__main__':
    unittest.main()

但每次要运行测试时,都必须在命令行上输入更多内容。

所以我更喜欢第一种解决方案。

  

Python执行整个程序。

行为是正确的。为了能够从模块is_even导入iseven,Python必须解析整个模块。它实际上只是看功能。

由于Python是一种脚本语言,解析模块意味着它必须执行其中的所有命令。从Python的角度来看,def是一个像print这样的命令,它创建一个新的函数实例并将其添加到当前范围。

或者换句话说:如果它不会运行print,它也无法运行def

此行为通常用于做魔术。例如,在我的Python i18n模块中,我使用:

@i18n
def name(): pass

在运行时,我收集用@i18n修饰的所有函数,并将它们转换为检查当前语言的代码,从转换文件加载正确的文本并将其返回。这意味着我可以稍后再做:

print name()

它会做正确的事。

编辑现在,您的模块中可能只有当模块作为"程序"运行时才能执行。 (即不是从其他地方进口的)。以下是如何做到这一点:

def is_even(n):
    return n%2==0

def main():
    print is_even(2)
    print is_even(3)

if __name__ == '__main__':
    main()

常规配方:始终将所有代码移动到函数中;避免在" root"模块的水平。