pydev coverage: pytest and local pytest plugin running in two separate processes, talking over http

坚强是说给别人听的谎言 提交于 2021-01-29 17:40:40

问题


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.


回答1:


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).



来源:https://stackoverflow.com/questions/63793891/pydev-coverage-pytest-and-local-pytest-plugin-running-in-two-separate-processes

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!