pydev涵盖范围:pytest和本地pytest插件在两个单独的进程中运行,通过http,第2部分进行讨论

问题描述

这是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 (将#修改为@)