问题描述
这是pydev coverage: pytest and local pytest plugin running in two separate processes,talking over http报告的问题的续篇,提供了解决方案。
现在,我想使所有内容在Eclipse:PyDev
内正常工作。
我制作了https://github.com/alanwilter/flask-pytest-example,其中包含一个示例,其中pytest-cov
在终端上运行时可以正常工作,但是由于我有兴趣使其在PyDev
中工作,如果我在终端(PyDev
用于运行pytest/coverage
的包装程序)上运行此命令:
python /Users/alan/.p2/pool/plugins/org.python.pydev.core_8.0.0.202009061309/pysrc/runfiles.py $PWD --py-test-params -sv --cov=handlers
Received parameters: ['/Users/alan/.p2/pool/plugins/org.python.pydev.core_8.0.0.202009061309/pysrc/runfiles.py','/Users/alan/Downloads/flask-pytest-example','--py-test-params','-sv','--cov=handlers']
Params for pydev: ['/Users/alan/Downloads/flask-pytest-example']
Params for test framework: --py-test-params,['-sv','--cov=handlers']
Final test framework args: ['-sv','--cov=handlers','/Users/alan/Downloads/flask-pytest-example']
py_test_accept_filter: {}
========================== test session starts ==========================
platform darwin -- Python 3.7.6,pytest-5.4.3,py-1.9.0,pluggy-0.13.1 -- /usr/local/Caskroom/miniconda/base/bin/python
cachedir: .pytest_cache
rootdir: /Users/alan/Downloads/flask-pytest-example
plugins: xdist-1.33.0,forked-1.2.0,cov-2.10.0
collected 1 item
tests/test_with_api.py::test_via_api * Serving Flask app "app" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production Wsgi server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
PASSED
>>>>Teardown app_service
---------- coverage: platform darwin,python 3.7.6-final-0 -----------
Name Stmts Miss Cover
------------------------------------------
handlers/__init__.py 0 0 100%
handlers/routes.py 8 0 100%
------------------------------------------
TOTAL 8 0 100%
========================== 1 passed in 2.11s ==========================
效果很好,报告覆盖率100%。
在Eclipse/PyDev
中尝试相同的操作,在-sv --cov=handlers
中使用Preference:PyDev:PyUnit
选项,并且在“代码覆盖率”视图中勾选了所有选项,但我没有成功。 Console
视图输出为:
Received parameters: ['/Users/alan/.p2/pool/plugins/org.python.pydev.core_8.0.0.202009061309/pysrc/runfiles.py','--port','62307','--coverage_output_dir','/Users/alan/workspace/.Metadata/.plugins/org.python.pydev.debug/coverage','--coverage_include','--cov=handlers']
Params for pydev: ['/Users/alan/Downloads/flask-pytest-example','/Users/alan/Downloads/flask-pytest-example']
Params for test framework: --py-test-params,'--cov=handlers']
Final test framework args: ['--cov-append','--cov-report=','--cov=/Users/alan/Downloads/flask-pytest-example','/Users/alan/Downloads/flask-pytest-example']
py_test_accept_filter: {}
============================= test session starts ==============================
platform darwin -- Python 3.7.6,pluggy-0.13.1 -- /usr/local/Caskroom/miniconda/base/bin/python3.7
cachedir: .pytest_cache
rootdir: /Users/alan
plugins: xdist-1.33.0,cov-2.10.0
collecting ... collected 1 item
../Downloads/flask-pytest-example/tests/test_with_api.py::test_via_api ERROR
==================================== ERRORS ====================================
________________________ ERROR at setup of test_via_api ________________________
@pytest.fixture(scope="session")
def app_server():
with TestProcess("python","app.py") as app_server:
> wait_for_strings(app_server.read,10,"Running")
../Downloads/flask-pytest-example/tests/fix_api.py:19:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
cb = <bound method BufferingBase.read of TestProcess(pid=28144,is_alive=False)>
seconds = 10,strings = ('Running',),start = 1599658625.855597
buff = ' File "/usr/local/Caskroom/miniconda/base/lib/python3.7/site.py",line 177\n file=sys.stderr)\n ^\nSyntaxError: invalid Syntax\n'
check_strings = ['Running']
def wait_for_strings(cb,seconds,*strings):
"""
This checks that *string appear in cb(),IN THE GIVEN ORDER !
"""
start = time.time()
while True:
buff = cb()
check_strings = list(strings)
check_strings.reverse()
for line in buff.splitlines():
if not check_strings:
break
while check_strings and check_strings[-1] in line:
check_strings.pop()
if not check_strings:
return
if time.time() - start > seconds:
break
time.sleep(0.05)
raise AssertionError("Waited %0.2fsecs but %s did not appear in output in the given order !" % (
> seconds,check_strings
))
E AssertionError: Waited 10.00secs but ['Running'] did not appear in output in the given order !
/usr/local/Caskroom/miniconda/base/lib/python3.7/site-packages/process_tests.py:247: AssertionError
=========================== short test summary info ============================
ERROR ../Downloads/flask-pytest-example/tests/test_with_api.py::test_via_api
============================== 1 error in 10.49s ===============================
尝试调试/理解此错误,我对fix_api.py
进行了以下修改:
with TestProcess("python","app.py") as app_server:
wait_for_strings(app_server.read,"Running")
# time.sleep(2)
到
with TestProcess("python","app.py") as app_server:
# wait_for_strings(app_server.read,"Running")
time.sleep(2)
这在终端上仍然有效,我知道app_server
在2秒钟内启动,并在子进程中运行。
现在,在Eclipse / PyDev上运行,我得到了:
Received parameters: ['/Users/alan/.p2/pool/plugins/org.python.pydev.core_8.0.0.202009061309/pysrc/runfiles.py','63024',cov-2.10.0
collecting ... collected 1 item
../Downloads/flask-pytest-example/tests/test_with_api.py::test_via_api File "/usr/local/Caskroom/miniconda/base/lib/python3.7/site.py",line 177
file=sys.stderr)
^
SyntaxError: invalid Syntax
Failed
>>>>Teardown app_service
[snip]
它应该已经打印:
...
tests/test_with_api.py::test_via_api * Serving Flask app "app" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production Wsgi server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
...
因此,这说明了为什么我的最初方法不起作用,因为从未给wait_for_strings()
分配缓冲区来检测Running
的键盘输入然后超时。
有人知道为什么它会失败吗?是因为Eclipse/PyDev
的另一个子进程正在运行PyTest/Coverage
吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)