Отладка Pytest в док-контейнере с использованием VS Code

У меня проблемы с настройкой отладки кода py.test в контейнере докеров с использованием VS Code.

Изучив это: https://code.visualstudio.com/docs/python/debugging И это: Как удаленно отлаживать код Python в контейнере Docker с помощью VS Code

Я установил следующую конфигурацию отладки в vscode:

{
  "name": "Python: Attach",
  "type": "python",
  "request": "attach",
  "localRoot": "${workspaceFolder}",
  "remoteRoot": "/capi",
  "port": 3000,
  "secret": "secret_text",
  "host": "localhost"
}

Я импортировал этот бит в свой тестовый файл:

import ptvsd
ptvsd.enable_attach("secret_text", address = ('0.0.0.0', 3000))
ptvsd.wait_for_attach()

И я убедился, что открываю этот порт 3000 в файле docker-compose:

 ports:
      - 3000:3000

Я дважды проверил, что порт открыт:

nmap -p 3000 localhost

Starting Nmap 7.60 ( https://nmap.org ) at 2018-07-19 10:53 CEST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000074s latency).

PORT     STATE SERVICE
3000/tcp open  ppp

Nmap done: 1 IP address (1 host up) scanned in 0.11 seconds

Кажется, это так. Когда я запускаю файл pytest из контейнера, он запускается и ждет подключения отладчика:

===================================================== test session starts =====================================================
platform linux2 -- Python 2.7.15, pytest-3.5.1, py-1.5.3, pluggy-0.6.0
rootdir: /capi, inifile:
plugins: requests-mock-1.5.0, xdist-1.14, metadata-1.7.0, html-1.16.1, cov-2.5.1
collecting 0 items  

Но когда я запускаю эту конфигурацию из VS Code, похоже, ничего не происходит.

введите здесь описание изображения Кажется, зависает. Ничего в консоли отладки или в контейнере докера.

Я настроил удаленную отладку для простого консольного приложения hello-world.py только для тестирования, и, похоже, оно работает. Итак, я предполагаю, что это как-то связано с тем, что я пытаюсь отладить pytest.

Кому-нибудь удалось это сделать? Буду признателен за помощь.


person Pavel K    schedule 19.07.2018    source источник
comment
Вам когда-нибудь удавалось добиться какого-либо прогресса в выполнении этой задачи?   -  person jminardi    schedule 10.01.2019
comment
нет, в конце концов я просто запустил их в локальной среде :(   -  person Pavel K    schedule 10.01.2019
comment
даже у меня много проблем с этим, я устал как в pycharm, так и в vscode   -  person Ronald Das    schedule 07.06.2019


Ответы (1)


Я столкнулся с той же проблемой, и ваш пост почти решает проблему. Когда я попытался реализовать ваше решение, я столкнулся со следующей проблемой:

ImportError while loading conftest '/app/tests/conftest.py'.
     tests/conftest.py:36: in <module>
ptvsd.enable_attach("secret_text", address=("0.0.0.0", 5678))
E   TypeError: enable_attach() got multiple values for argument 'address'

Удаление значения secret_text позволило мне достичь точки wait_for_attach() и успешно подключить отладчик к коду. Я смог попасть в точки останова в своих тестах. Благодарю вас!

.vscode/launch.json

{
  "name": "Python: Attach",
  "type": "python",
  "request": "attach",
  "localRoot": "${workspaceFolder}/path/to/code",
  "remoteRoot": "/app",
  "port": 5678,
  "host": "localhost"
}

docker-compose.yml

ports:
 - "5678:5678"

conftest.py

import ptvsd
ptvsd.enable_attach(address=("0.0.0.0", 5678))
ptvsd.wait_for_attach()

Примечание. Строки ptvsd помещаются после всего импорта.

Команда CLI для выполнения тестов:

import subprocess
import click

@click.command()
def cli():
    return subprocess.call("pytest test", shell=True)

Последовательность отладки тестов:

  1. docker-compose up (запустить контейнер)
  2. docker-compose exec MODULE CONTAINER_NAME FUNCTION_THAT_EXECUTES_TEST
  3. Прикрепить отладчик в VSCode

Тесты будут выполняться и достигать любой установленной вами точки останова.

person Kevin    schedule 06.07.2020
comment
Куда вы помещаете CLI command to execute tests? - person toose121; 11.05.2021