Python单元测试调用和意外的程序运行

Python单元测试调用和意外的程序运行,python,unit-testing,Python,Unit Testing,假设我有一个简单的python程序和一个简单的测试文件 iseven.py: import math def is_even(n): return n%2==0 print is_even(2) print is_even(3) import unittest from iseven import is_even class IsevenTests(unittest.TestCase): def test1(self): self.assertTrue(i

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

iseven.py:

import math

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

print is_even(2)
print is_even(3)
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()
和测试_iseven.py:

import math

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

print is_even(2)
print is_even(3)
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

??因为我在指南和教程中都看到过,并且输出是相同的。另外:测试只针对一个函数,但是整个程序在运行测试时都会执行,所以我在控制台中获得程序的输出。这是不应该发生的,对吗

这两者之间有区别吗

在执行测试时没有大的区别

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

if __name__ == '__main__':
    unittest.main()
但是,每次要运行测试时,都必须在命令行上键入更多内容

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

Python执行整个程序

这种行为是正确的。为了能够从模块
iseven
导入
甚至是
,Python必须解析整个模块。它不能只看函数

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

或者换一种说法:如果它不运行
打印
,它也不能运行
def

这种行为经常被用来施魔法。例如,在我的i18n Python模块中,我使用:

@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()

常规方法:始终将所有代码移动到函数中;避免将任何内容保留在模块的“根”级别。

好的,谢谢你的回答。第二部分仍然很烦人,因为它显示现有的打印,如果主程序执行一些数字运算,意味着简单单元测试的运行时间很长。此外,视频中从未提到过这一点:x