pydev 覆盖率:pytest 和本地 pytest 插件 运行 在两个独立的进程中,通过 http 进行交谈

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

一切从这里开始:https://github.com/pytest-dev/pytest-cov/issues/425

我现在可以说我的终端上有一个可行的解决方案,所以当我 运行:

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.

我可以正确地看到报道。

现在我正试图让它在 Eclipse/PyDev 中工作。

本质上,当运行宁Eclipse:Run:Run As:Python unit-test

使用我的本地 pytest 插件 (fix_api.py) 进行的测试将失败,主要是抱怨它等待应用程序服务启动并且超时。

@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

对我来说最重要的功能是能够在 Eclipse 中使用“代码覆盖率”视图并能够快速查看未覆盖的代码。

如果我不能用两个独立的进程来制作 pytest 来覆盖,我想知道当 运行 在我的终端中时如何为 PyDev 加载 coverage.xml 文件,比如:

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

代码覆盖率视图有这个按钮“打开 cov”,但它没有按照我希望的方式执行,也没有从我的本地 .coverage 文件执行“刷新”加载。

因此,如果有人可以在这里提供任何关于如何让它工作的提示,我们将不胜感激。

在 PyDev 端,code-coverage 信息从特定目录加载。

在代码覆盖率视图中有一个 Open cov dir(见下图)必须放置覆盖率内容(我可以看到 PyDev 设置 --coverage_output_dir--coverage_include -- https://github.com/fabioz/Pydev/blob/master/plugins/org.python.pydev.debug/src/org/python/pydev/debug/ui/launching/PythonRunnerConfig.java#L913 -- 在命令行中设置了 Enable code coverage for new launches? 并且已经选择了要分析的目录,因此,如果您从 PyDev 内部进行 运行ning 测试,它应该开箱即用).

现在,如果你从终端 运行 它,你必须在 运行 测试时从命令行设置它们。

PyDev 覆盖目录中的文件应命名为:.coverage.<xxx>(然后在 Refresh PyDev 将收集所有以 .coverage. 开头的多个文件并将它们合并到一个 .coverage,然后将用于显示 PyDev 内部的覆盖信息。

因此,您需要做的是在正确的位置创建生成的覆盖文件(这应该可以从 PyDev 运行ning 或使用正确的命令行参数创建PyDev 覆盖目录中的文件,稍后手动刷新)。