大熊猫和Unittest之间的冲突?

时间:2016-08-03 22:50:53

标签: python-3.x pandas python-unittest

考虑以下代码块(在Jupyter笔记本中开发),由于未触发RIGHT,因此需要引发AssertionError

UserWarning

对于那些不熟悉jupyter笔记本的人,第一行只是将所有后续行导出到指定的文件中。

现在,如果我执行命令:

%%writefile Game/tests/tests.py
import unittest
import pandas as pd

class TestGame(unittest.TestCase):
    def test_getters(self):
        print('Just before the critical line.')
        with self.assertWarns(UserWarning):
            print('Just testing...')

suite = unittest.TestLoader().loadTestsFromTestCase(TestGame)
unittest.TextTestRunner().run(suite)
从终端

(我在Ubuntu 14.04上使用Python 3.5.1),我得到一个python3 tests.py - 堆栈跟踪如下:

Runtime Error

显然结果不如预期。但是,我注意到以下任一选项都会获得预期的结果。

  1. 使用Just before the critical line: E ====================================================================== ERROR: test_getters (__main__.TestGame) ---------------------------------------------------------------------- Traceback (most recent call last): File "tests.py", line 8, in test_getters with self.assertWarns(UserWarning): File "/opt/anaconda3/lib/python3.5/unittest/case.py", line 225, in __enter__ for v in sys.modules.values(): RuntimeError: dictionary changed size during iteration ---------------------------------------------------------------------- Ran 1 test in 0.004s FAILED (errors=1) 注释第一行并使用Jupyter笔记本运行代码片段(使用相同的python解释器)。
  2. 注释掉%%writefile ...行并使用之前给出的命令从终端运行。
  3. 有谁知道这里发生了什么?

    作为参考,import pandas as pd模块中case.py中的相关行

    unittest

    这似乎是良性代码(我也认为已经足够测试它说它不是问题的根源)。

1 个答案:

答案 0 :(得分:1)

此错误已提交到Python's bug tracker

问题在于在sys.modules中的unittest.case._AssertWarnsContext.__enter__()上进行迭代,并访问每个模块的__warningregistry__属性。通过此访问,类模块对象可以执行任意操作,包括导入扩展了sys.modules的其他模块。

sys.modules是将模块名称映射到已加载模块的字典。

这个问题很难重现,因为测试运行程序如何对测试进行排序是“ something platform dependent”。