【问题标题】:Writing unit tests: can I import all modules I need just once at class level, or do I have to import them again in each test?编写单元测试:我可以在类级别只导入一次我需要的所有模块,还是必须在每次测试中再次导入它们?
【发布时间】:2017-08-11 16:30:12
【问题描述】:

我正在尝试使用 unittest 为某些代码编写单元测试:

https://docs.python.org/3/library/unittest.html

假设我正在编写的每个测试都需要导入mathosdatetime 模块。现在我将它们导入到我正在编写的每个测试中:

#...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


【解决方案1】:

鉴于您要删除的重复代码包含导入,我完全同意 BrenBarn 的回应,因为您不需要多次导入模块。 对于您希望在类中的每个测试之前或之后运行相同代码的一般情况,您应该使用类 unittest.TestCase 的 setUp() 和 tearDown() 方法。

【讨论】:

  • 嘿太棒了!我不知道这些方法。谢谢!只是澄清一下:您说没有必要多次导入模块。它甚至会有害吗?我的印象是两次导入pandas 模块,一次在module 级别,然后在test_method_2(self) 内部生成了很多警告。也许是因为那会创建重复的命名空间?很抱歉没有向您展示测试用例,但我今天正在度假,我无法访问我的工作代码。
  • PS 如果你想知道为什么在地球上有人会两次导入同一个模块,好吧,这只是一个错误:P 我在 module 级别添加了导入,然后将其删除从所有测试中,除了我忘记删除它的一个。
  • 我不知道为什么在那个例子中你第二次看到很多警告;它对我来说按预期工作。如果您想了解更多导入时发生的情况,可以使用选项 -v 运行 python。它会输出大量信息。例如,当您第一次导入 pandas 时,它会显示很多有关正在导入的其他模块的信息。第二次导入时,没有任何反应。即使您导入了另一个模块,该模块又导入了 pandas,解释器也会跟踪导入的模块并且不会重新导入。更多信息:docs.python.org/3/reference/import.html
猜你喜欢
  • 2011-02-02
  • 1970-01-01
  • 2018-04-25
  • 2018-10-21
  • 2016-09-04
  • 1970-01-01
  • 1970-01-01
  • 2017-01-24
  • 1970-01-01
相关资源
最近更新 更多