问题
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