【问题标题】:How to test python module privates?如何测试python模块私有?
【发布时间】:2015-03-05 07:35:57
【问题描述】:

在 python 2.7 中,是否可以测试模块私有?

运行后:

import unittest

__private_stuff = 1 # if it would have single underscore, it would not be a problem.

class ComplexTestCase(unittest.TestCase):
    def test_internal_symbol(self):
        self.assertEqual(__private_stuff, 1)

unittest.main(__name__)

结果是:

E
======================================================================
ERROR: test_internal_symbol (__main__.ComplexTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\files\y.py", line 7, in test_internal_symbol
    self.assertEqual(__private_stuff, 1)
NameError: global name '_ComplexTestCase__private_stuff' is not defined

----------------------------------------------------------------------


有什么办法解决吗?
(不修改我要添加测试的代码)

替代方案(我想避免)

一种方法是重命名方法。
其他方法是添加额外的重命名符号private_stuff = __private_stuff

但这很快就会变得非常乏味。
代码库使用这些“__xyz”作为公共符号(用于其他模块),其中有很多。
还有总是存在“_xyz”和“xyz”符号。

(试图找到“为什么”的答案,想出了唯一合理的解释
是前导下划线用于标记“修改”,因为在数学公式中使用“素数”。 例如xx' 相似,但不一样)

【问题讨论】:

    标签: python python-2.7 unit-testing


    【解决方案1】:

    __private_stuff 实际定义在哪里?因为我怀疑它是在您的测试用例模块中定义的。如果确实如此,那么这将起作用:

    import unittest
    
    __private_stuff = 1 # if it would have single underscore, it would bot be a problem.
    
    class ComplexTestCase(unittest.TestCase):
        def test_internal_symbol(self):
            private_stuff = globals()['__private_stuff']
            self.assertEqual(private_stuff, 1)
    
    unittest.main(__name__)
    

    否则,如果它在其他模块中,这应该可以工作,尽管我没有测试它:

    import unittest
    import other_module
    
    __private_stuff = 1 # if it would have single underscore, it would bot be a problem.
    
    class ComplexTestCase(unittest.TestCase):
        def test_internal_symbol(self):
            private_stuff = getattr(other_module, '__private_stuff')
            self.assertEqual(private_stuff, 1)
    
    unittest.main(__name__)
    

    【讨论】:

    • 是的,测试用例将位于与__private_stuff 不同的文件中。 (只是试图使帖子尽可能短,因为两种情况都会引发相同的错误)
    【解决方案2】:

    有几种方法可以防止 python 在你的类中调用名称修改算法

    使用getattr 检索被测属性的值(根据 1.618 的回答):

    class ComplexTestCase(unittest.TestCase):
        def test_internal_symbol(self):
            private_stuff = getattr(module_under_test, '__private_stuff')
            self.assertEqual(private_stuff, 1)
    

    在类之外编写测试方法:

    def test_internal_symbol(self):
        self.assertEqual(module_under_test.__private_stuff, 1)
    
    class ComplexTestCase(unittest.TestCase):
        test_internal_symbol = test_internal_symbol
    

    重构私有属性名称以三个下划线结尾:

    class ComplexTestCase(unittest.TestCase):
        def test_internal_symbol(self):
            self.assertEqual(module_under_test.__private_stuff___, 1)
    

    【讨论】:

      猜你喜欢
      • 2011-08-07
      • 2015-11-09
      • 2016-07-02
      • 1970-01-01
      • 2023-03-06
      • 2013-03-04
      • 1970-01-01
      • 1970-01-01
      • 2019-07-24
      相关资源
      最近更新 更多