我一直在了解测试驱动开发的优势,并尝试使用pytest和setuptools develop
选项开发我的第一个TDD应用。到目前为止一切顺利。我有一个问题:要在我的test_*
模块中导入要测试的资源在哪里?
例如,我可以在模块级别导入:
from app.module1 import resource1, resource2
def test_resource1():
assert test_resource1 == "expected value 1"
def test_resource2():
assert test_resource2 == "expected value 2"
另一方面,在每个测试函数中进行导入似乎更有意义:
def test_resource1():
from app.module1 import resource1
assert test_resource1 == "expected value 1"
def test_resource2():
from app.module1 import resource2
assert test_resource2 == "expected value 2"
这当然假设在其他任何地方都不需要测试资源。
除了要求输入字符的差异外,做一个还是另一个有优势吗?
答案 0 :(得分:2)
standard style guide告诉“导入总是放在文件的顶部”。
功能级别的导入不会带来重大的架构或技术优势。
唯一有价值的例外是临时插入的断点,在调试后将其删除:import pdb; pdb.set_trace()
或__import__('pdb').set_trace()
。
答案 1 :(得分:1)
如果在函数/方法级别导入,对象将在更短的时间内进行范围,从而允许它们比其他情况更快地进行垃圾收集。因此,它主要是内存消耗的好处。
答案 2 :(得分:1)
这里的问题是关于测试的范围,如果测试A旨在涵盖模块的导入,那么选项B是好的。请记住,他们在导入相同模块时都会失败(如果该模块存在问题)。
选项在大多数情况下更容易(更少打字),因为如果你有很多测试,他们不会真正运行(你将无法收集测试)
在这种情况下还要担心的另一件事是副作用,并且这两个选项在这方面都没有帮助,py.test可以选择在测试之间清除/重新加载所有加载的模块(它是' s不是默认的)总结一下,这更像是一种报道风格问题。
答案 3 :(得分:1)
将导入放在顶部是一个标准约定,否则(除了临时调试的其他答案中所述)将使您的代码对大多数python开发人员的可读性降低。
在类/功能级别导入没有任何好处。如果您担心要导入的对象之间的命名空间冲突,请执行from app.module1 import resource1
而不是import app.module1
执行app.module1.resource1
并在测试中调用{{1}}。由于https://docs.python.org/2/howto/doanddont.html中解释的原因,在python docs Idioms和Anti-Idioms中也推荐使用此模式。