gpt4 book ai didi

python - unittest.py 与 trace.py 配合不佳 - 为什么?

转载 作者:太空狗 更新时间:2023-10-29 18:28:55 25 4
gpt4 key购买 nike

哇。我今晚发现使用 unittest 模块编写的 Python 单元测试不能很好地与 trace 模块下的覆盖率分析配合使用。这是最简单的单元测试,在 foobar.py 中:

import unittest

class Tester(unittest.TestCase):
def test_true(self):
self.assertTrue(True)

if __name__ == "__main__":
unittest.main()

如果我用 python foobar.py 运行它,我得到这个输出:

 .
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

太棒了。现在我也想执行覆盖测试,所以我用 python -m trace --count -C 再次运行它。 foob​​ar.py,但现在我明白了:

----------------------------------------------------------------------
Ran 0 tests in 0.000s

OK

不,Python,这不行 - 你没有运行我的测试!似乎在 trace 的上下文中运行以某种方式破坏了 unittest 的测试检测机制。这是我想出的(疯狂的)解决方案:

import unittest

class Tester(unittest.TestCase):
def test_true(self):
self.assertTrue(True)

class Insane(object):
pass

if __name__ == "__main__":
module = Insane()
for k, v in locals().items():
setattr(module, k, v)

unittest.main(module)

这基本上是一种变通方法,通过伪造顶级模块的副本来具体化抽象的、不可命名的名称。然后我可以将该名称传递给 unittest.main() 以回避 trace 对其产生的任何影响。无需向您展示输出;看起来就像上面的成功示例。

所以,我有两个问题:

  1. 这是怎么回事?为什么 trace 搞砸了 unittest

  2. 有没有更简单和/或更简单的方法来解决这个问题?

最佳答案

一个更简单的解决方法是将模块的名称显式传递给 unittest.main:

import unittest

class Tester(unittest.TestCase):
def test_true(self):
self.assertTrue(True)

if __name__ == "__main__":
unittest.main(module='foobar')

trace 搞乱了 unittest 中的测试发现,因为 trace 如何加载它正在运行的模块。 trace 读取模块源代码,编译它,并在 __name__ 全局设置为 '__main__' 的上下文中执行它。这足以使大多数模块的行为就像它们被称为主模块一样,但实际上并没有改变在 Python 解释器中注册为 __main__ 的模块。当 unittest 请求 __main__ 模块扫描测试用例时,它实际上得到了从命令行调用的 trace 模块,这当然不会'包含单元测试。

coverage.py 采用不同的方法实际替换 sys.modules 中名为 __main__ 的模块。

关于python - unittest.py 与 trace.py 配合不佳 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23691509/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com