【问题标题】:Unit test imports, with imports isolation单元测试导入,导入隔离
【发布时间】:2021-03-13 16:01:23
【问题描述】:

我有一个使用 dev 和 prod 库的 python 包。 我想确保该包中的某些文件永远不会导入任何开发库,因为这些文件用于部署 并且应该只导入产品库。

例如,我想要一个单元测试,它使用如下所示的 my_package.__init__.py 文件失败,但如果我们删除 dev 库导入则成功。

import libraries.prod 
import libraries.dev 

制作满足这些条件的独立测试很容易,并且预计会在开发导入my_package.__init__.py 上失败,而在其他情况下成功,例如:

 def test_dev_libraries_not_imported_in_package_init(): 
     with mock.patch.dict(sys.modules): 
         import_module("my_package") 
         assert "libraries.dev" not in sys.modules 

但是,当运行完整的单元测试套件时,例如使用 pytest,此测试可能会失败。 如果同一套件中有另一个单元测试针对开发库运行一些测试,则会发生这种情况,例如:

 def test_dev_libraries(): 
     import_module("libraries.dev") 
     assert "libraries.dev" in sys.modules 

理想情况下,我希望这两个测试能够共存于同一个 unit_tests 目录中,但似乎导入在所有测试开始时都一起加载。我想知道是否有办法隔离它?

我看到了一些模拟 sys.module 对象的相关问题,但它没有帮助:独立运行测试工作正常,但不运行是在测试套件级别。

我为重现性创建了一个小型存储库:

https://github.com/Edouard360/unit-test-imports-with-imports-isolation/issues/1

【问题讨论】:

    标签: python unit-testing import mocking


    【解决方案1】:

    因此,我认为您可以修改一个孤立的测试用例,而不是修改所有周围的测试,以确保您获得预期的效果。如果您在导入之前从 sys.modules 字典中删除,您仍将在控制孤立案例的同时测试相同的结果。我打算在这里建议del,但如果你想模拟一张白板,clear 可能更合适:

    def test_dev_libraries_not_imported_in_package_init(): 
        with mock.patch.dict(sys.modules): 
            sys.modules.clear()  # or del sys.modules['libraries.dev']
            import_module("my_package") 
            assert "libraries.dev" not in sys.modules 
    

    编辑:这是我使用import json 提出的一个小例子:

    import sys
    
    from importlib import import_module
    from unittest import mock
    
    with mock.patch.dict(sys.modules):
        sys.modules.clear()
        print(sys.modules.keys())
        import_module('json')
        print(sys.modules.keys())
    
    print(sys.modules.keys())
    

    运行它表明您从一个空白页转到 json 导入所需的模块,然后返回到所有测试导入的原始导入模块。

    【讨论】:

      猜你喜欢
      • 2015-09-30
      • 1970-01-01
      • 1970-01-01
      • 2013-12-16
      • 2015-12-10
      • 1970-01-01
      • 2018-07-18
      • 2016-01-25
      • 2020-04-16
      相关资源
      最近更新 更多