pydev覆盖:pytest和本地pytest插件在两个单独的进程中运行,通过http进行通信 [英] pydev coverage: pytest and local pytest plugin running in two separate processes, talking over http

查看:85
本文介绍了pydev覆盖:pytest和本地pytest插件在两个单独的进程中运行,通过http进行通信的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所有内容均从此处开始:

All started here: https://github.com/pytest-dev/pytest-cov/issues/425

I can say by now that I have a working solution on my terminal, so when I run:

pytest --cov views --cov db --cov-report term-missing:skip-covered -sv
       
==================== 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/myproject
plugins: xdist-1.33.0, forked-1.2.0, cov-2.10.0
collected 46 items

tests/test_admin.py::test_attempt_create_user PASSED
tests/test_auth.py::test_login_logout  * Serving Flask app "views" (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
2020-09-03 18:26:26,157-INFO-werkzeug::_internal|113::  * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

PASSED
...
---------- coverage: platform darwin, python 3.7.6-final-0 -----------
Name                          Stmts   Miss  Cover   Missing
-----------------------------------------------------------
views/general.py                 52      2    96%   111, 113
views/helpers.py                 18     11    39%   10-14, 18-24
views/individual.py             218    113    48%   49-68, 74-125, 129-139, 145-155, 190, 336-382, 386-393, 400-428
views/save_configuration.py      34     23    32%   17-44
views/users.py                  128    104    19%   18-37, 52-90, 96-140, 144-155, 159-164, 168-173, 177-184
views/variant.py                 61      5    92%   34-36, 74-75
-----------------------------------------------------------
TOTAL                           985    258    74%

11 files skipped due to complete coverage.

I can see the coverage correctly reporting.

Now I'm trying to get that to work inside Eclipse/PyDev.

Essentially, when running Eclipse:Run:Run As:Python unit-test

Tests using my local pytest plugin (fix_api.py) will fail complaining basically that it waited for the application service to start and it timed out.

@pytest.fixture(scope="session")

    def app_server():

        with TestProcess("python", "application.py") as app_server:

>           wait_for_strings(app_server.read, 10, "Running")



../Programmes/myproject/tests/fix_api.py:17: 

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 



cb = <bound method BufferingBase.read of TestProcess(pid=78818, is_alive=False)>

seconds = 10, strings = ('Running',), start = 1599149418.9482582

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

The most important feature for me is to be able to use the "Code Coverage" view in Eclipse and be able to quickly see the the code not covered.

If I can't make pytest with two separated processes to work for coverage, I was wondering how I could load the coverage.xml file for PyDev when running in my terminal, something like:

pytest --cov views --cov db --cov-report xml:coverage.xml -sv

Code Coverage view has this button "Open cov" but it does not do what I hoped it for, neither doing a "Refresh" loads from my local .coverage file.

So, if anyone could give any tip here on how to get it to work that would be highly appreciated.

解决方案

On the PyDev side, code-coverage information is loaded from a specific directory.

In the code coverage view there's a Open cov dir (see picture below) where the coverage contents must be placed (I can see that PyDev sets --coverage_output_dir and --coverage_include -- https://github.com/fabioz/Pydev/blob/master/plugins/org.python.pydev.debug/src/org/python/pydev/debug/ui/launching/PythonRunnerConfig.java#L913 -- in the command line when you have set Enable code coverage for new launches? and already chose the dir to analyze, so, if you're running tests from inside PyDev it should work out of the box).

Now, if you run it from the terminal, you have to set those from the command line when running the test.

Files in the PyDev coverage directory are expected to be named: .coverage.<xxx> (then on Refresh PyDev will gather all the multiple files that start with .coverage. and will consolidate them in a single .coverage which will then be used to show coverage info inside of PyDev).

So, what you need to do is make it so that the generated coverage files are created in the proper place (which should be possible either running from PyDev or using the proper command line arguments to create the files in the PyDev coverage dir and manually refreshing later).

这篇关于pydev覆盖:pytest和本地pytest插件在两个单独的进程中运行,通过http进行通信的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆