【发布时间】:2017-08-11 16:30:12
【问题描述】:
我正在尝试使用 unittest 为某些代码编写单元测试:
https://docs.python.org/3/library/unittest.html
假设我正在编写的每个测试都需要导入math、os 和datetime 模块。现在我将它们导入到我正在编写的每个测试中:
#...code for which I'm writing the unit tests...
import unittest
class TestMyCode(unittest.TestCase):
def test_method_1(self):
# unit test for method 1
import math
import os
import datetime
.
.
def test_method_2(self):
# unit test for method 2
import math
import os
import datetime
.
.
if __name__ == "__main__":
unittest.main()
为避免代码重复,是否可以在类级别只导入一次?这个:
#...code for which I'm writing the unit tests...
import unittest
class TestMyCode(unittest.TestCase):
import math
import os
import datetime
def test_method_1(self):
# unit test for method 1
.
.
def test_method_2(self):
# unit test for method 2
.
.
if __name__ == "__main__":
unittest.main()
导致错误
NameError: name 'math' is not defined
所以这显然不是正确的方法。
EDIT 只是为了清楚起见,我正在为其编写单元测试的代码(实际上仅由两个方法组成)和(两个)单元测试都在同一个模块中,我们称之为MyCode.py。
【问题讨论】:
-
为什么不在模块级别导入它们?
-
@BrenBarn 好主意!事实是我将单元测试放在包含要测试的代码的同一模块中。(我不知道这是否是正确的做法:我今天才开始这项工作,我不是专业程序员)。
math不被主代码使用,而仅被单元测试使用。因此,在我看来,通过添加仅由测试使用的导入来修改我正在编写测试的代码有点“肮脏”。在实践中,为了编写测试,我正在修改我应该测试的代码。你怎么看? -
如果您将测试代码包含在它正在测试的代码中,那么您已经通过添加测试代码来修改主代码,所以我认为担心也没有意义很多关于那个。如果您想保持视觉上的分离,您可以将单元测试导入放在模块级别,但靠近文件末尾(就在您的单元测试代码之前,以及
import unittest)。如果您的测试代码变得足够大以至于无法将所有内容放在同一个文件中,那么您应该将其移动到单独的文件中。 -
@BrenBarn 你是对的,我已经在修改它了:) 并且通过将导入放在单元测试之前,一切也很好地在视觉上分离。现在代码很短(毕竟它只是两种方法),但如果它增长,我肯定会在不同的文件中分开。谢谢!!!
标签: python unit-testing python-import