VS Code Django Unit Test Debugging
Might need to add permissions to the test db for the master user:
mysql --host 127.0.0.1 -u root -p'root' -e "GRANT ALL PRIVILEGES ON test_cuic.* TO 'master'@'%';"
GRANT ALL PRIVILEGES ON test_.* TO 'master'@'%';
https://devpress.csdn.net/python/62fe07607e66823466192fa3.html
ve/bin/pip install pytest pytest-django
ve/bin/pip install hypothesis==6.4.0 hypothesis-jsonschema==0.19.0
specifyweb/pytest.ini ->
[pytest]
DJANGO_SETTINGS_MODULE=specifyweb.settings
python_files=*test*.py testparsing.py
addopts = --ignore=specifyweb/specify/selenium_tests.py
.vscode/settings.json ->
{
"python.pythonPath": "ve/bin/python",
"python.testing.pytestArgs": [
"specifyweb",
"-s",
"-vv"
],
"python.testing.pytestEnabled": true,
"python.testing.nosetestsEnabled": false,
"python.testing.unittestEnabled": false
}
.env -> not needed
PYTHONPATH=specifyweb/
manage.py -> paste between “os.environ.setdefault” … “try: from django.core.management”
from django.conf import settings
if settings.DEBUG:
if os.environ.get('RUN_MAIN') or os.environ.get('WERKZEUG_RUN_MAIN'):
import debugpy
debugpy.listen(("0.0.0.0", 3000))
print('Attached!')
requirement-testing.txt ->
debugpy==1.6.5
pytest==7.2.1
pytest-django==4.5.2
docker-compose.yml ->
ports:
- 3000:3000 # Django Debug
- 8888:8888 # debugging service (ptvsd)
SECRET_KEY=bogus
Dockerfile ->
COPY --chown=specify:specify requirements-testing.txt /home/specify/
RUN python3.8 -m venv ve \
&& ve/bin/pip install --no-cache-dir -r /home/specify/requirements-testing.txt \
&& ve/bin/pip install --no-cache-dir -r /home/specify/requirements.txt
For the non-container instance of vscode, the debugger is used at runtime with the front-end:
.vscode/launch.json ->
{
"version": "0.2.0",
"configurations": [
{
"name": "Run Django",
"type": "python",
"request": "attach",
"pathMappings": [
{
"localRoot": "${workspaceFolder}/specifyweb",
"remoteRoot": "/opt/specify7/specifyweb"
}
],
"port": 3000,
"host": "127.0.0.1",
}
]
}
.vscode/settings.json ->
{
"python.testing.unittestArgs": [
"-v",
"-s",
"./specifyweb",
"-p",
"*test*.py"
],
"python.testing.pytestEnabled": false,
"python.testing.unittestEnabled": true,
"python.linting.mypyEnabled": true,
"python.linting.enabled": true
}
Get the VS Code debugger to work with the celery container
Add the worker debugger config to the .vscode/launch.json file
{
"version": "0.2.0",
"configurations": [
{
"name": "Run Django",
"type": "python",
"request": "attach",
"pathMappings": [
{
"localRoot": "${workspaceFolder}/specifyweb",
"remoteRoot": "/opt/specify7/specifyweb"
}
],
"port": 3000,
"host": "127.0.0.1",
},
{
"name": "Run Worker",
"type": "python",
"request": "attach",
"pathMappings": [
{
"localRoot": "${workspaceFolder}/specifyweb",
"remoteRoot": "/opt/specify7/specifyweb"
}
],
"port": 3001,
"host": "127.0.0.1",
}
]
}
Edit the celery worker container config in the docker-compose.yml file
specify7-worker:
build:
context: ./.
target: run-development
command: bash -c "ve/bin/python -m debugpy --listen 0.0.0.0:3001 --wait-for-client -m celery -A specifyweb worker -l INFO --concurrency=1 -Q $DATABASE_NAME"
init: true
volumes:
- "./config:/opt/Specify/config:ro"
- "static-files:/volumes/static-files"
- "./specifyweb:/opt/specify7/specifyweb"
extra_hosts:
- "host.docker.internal:host-gateway"
env_file: .env
ports:
- "3001:3001" # for debugging celery worker
Run docker compose up --build
Reload the vscode window (might not need to do)
In the VS Code debugger panel, next to “Run and Debug”, select the picklist and select “Run Worker”, and press the play button.
The breakpoints you set should now be caught!
Remember that the code in the celery worker container doens’t automatically get update, so need to do ‘docker compose down’ and ‘docker compose up’ after code changes before you can start debugging again.