假设我有一个简单的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
?因为我在指南和教程中都看过,输出是相同的。另外:测试仅适用于那个功能,但是在运行测试时执行整个程序,因此我在控制台中获得程序的输出。这不应该发生,对吗?
答案 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"模块的水平。