使用pytest导入单元测试资源:模块级别还是测试级别?

时间:2017-05-03 18:39:13

标签: python pytest

我一直在了解测试驱动开发的优势,并尝试使用pytestsetuptools 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"

这当然假设在其他任何地方都不需要测试资源。

除了要求输入字符的差异外,做一个还是另一个有优势吗?

4 个答案:

答案 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中也推荐使用此模式。