我一直致力于通过sympy项目获得更好的py.test支持,并遇到一个奇怪的问题,即py.test收集过程正在改变测试结果。
如果我指定测试文件明确,测试通过(那里有一些测试已经表现出这种行为,但我刚刚选择了一个)
$ py.test sympy/physics/vector/tests/test_frame.py -k test_coordinate_vars -v --showlocals
============================= test session starts ==============================
platform linux -- Python 3.4.1 -- py-1.4.25 -- pytest-2.6.3 -- /home/ptb/miniconda3/bin/python3
architecture: 64-bit
cache: yes
ground types: python
collected 4 items
sympy/physics/vector/tests/test_frame.py::test_coordinate_vars PASSED
================ 3 tests deselected by '-ktest_coordinate_vars' ================
==================== 1 passed, 3 deselected in 2.12 seconds ====================
如果我只是指定目录而不是文件,我会收到以下错误
$ py.test sympy/physics/vector/tests -k test_coordinate_vars -v
============================= test session starts ==============================
platform linux -- Python 3.4.1 -- py-1.4.25 -- pytest-2.6.3 -- /home/ptb/miniconda3/bin/python3
architecture: 64-bit
cache: yes
ground types: python
collected 39 items
sympy/physics/vector/tests/test_frame.py::test_coordinate_vars FAILED
=================================== FAILURES ===================================
_____________________________ test_coordinate_vars _____________________________
def test_coordinate_vars():
"""Tests the coordinate variables functionality"""
> assert CoordinateSym('Ax', A, 0) == A[0]
E assert Ax == A_x
E + where Ax = CoordinateSym('Ax', A, 0)
sympy/physics/vector/tests/test_frame.py:12: AssertionError
DO *NOT* COMMIT!
=============== 38 tests deselected by '-ktest_coordinate_vars' ================
=================== 1 failed, 38 deselected in 0.22 seconds ====================
请注意' A'有问题的是在任何函数/类定义之外的文件顶部声明。如果我移动“A' A'进入函数而不是两次使用pass但我真的很想了解发生了什么,因为我们使用了在测试文件顶部声明的大量模块级变量。
有人可以了解正在发生的事情或指出我对文档的相关部分吗?
更新
根据这个answer稍微不同的问题,我提出以下看起来比移动' A'进入文件中的每个test_function:
@pytest.fixture(autouse=True)
def global_vars(request):
request.function.__globals__['A'] = ReferenceFrame('A')
如果有解决方案不涉及搞乱全局命名空间,我会很高兴知道它们。 (以及原始失败的原因)
UPDATE2
原来这是由于涉及ReferenceFrame
的缓存错误。由于缓存是全局的,它无意中允许来自一个文件的设置代码破坏运行的测试文件中的一些数据。