如果我有这样的功能:
def any_function(type_name, field_name):
def another_function(name):
...
我怎么去测试any_function
?
如果我使用错误的测试定义,我的意思是写print(any_function(...))
仅用于测试和调试目的,在开头放置一个globlal another_function
语句,但不要忘记在测试后删除它。这将使您能够在调用外部函数一次以初始化它之后调试该内部函数。否则,因为another_function()
将在any_function()
的本地范围内,所以将调试放在any_function()
中。
def any_function(type_name, field_name):
global another_function # Delete line in functional versions
def another_function(name):
pass
any_function(None, None)
print(another_function(...))
要么
def any_function(type_name, field_name):
def another_function(name):
pass
print(another_function(...)) # Delete line in functional versions
any_function(None, None)
你不会测试内部函数。你只需要测试外部函数的功能;内部函数是实现细节,而不是单元提供的API。您通常使用内部函数来生成闭包,使内部函数依赖于作用域。
现在,如果内部函数由外部返回,则测试返回值,就像你将任何函数的产品一样。
如果内部函数是独立的并且需要自己的测试,则不应该嵌套它。
想象一下another_function
被误删了。写一个测试来抓住它。
现在想象another_function
又回来了。你怎么知道?
想象一下another_function
中的一些代码被删除,或者在某种程度上被错误地改变了。编写测试以检测该错误。
函数创建一个函数来a)使用它或b)返回它。在Python中,b)可能比a)更常见。 Martijn Pieters报道了a)。对于b),测试外部函数意味着调用它然后测试返回的函数。通常应该对外部函数的多个输入集合执行此操作,也就是说,对于多个返回的函数。一个例子:
import unittest as u
def adder(n):
return lambda m: m+n
class Test(u.TestCase):
def test_adder(self):
add3 = adder(3)
self.assertEqual((add3(-1), add3(0), add3(1)), (2, 3, 4))
add_3 = adder(-3)
self.assertEqual((add_3(-1), add_3(0), add_3(1)), (-4,-3,-2))
u.main()