このエントリでは、vscodeのTask機能を使って、
LinterやUnitTestを少しの手間で動かせるようにする設定手順を示します。

Pythonのプロジェクトに、
ruff(formatter), flake8(linter), pytest(unittest)
を導入する流れを説明しますが、他の言語でも同じような流れになると思います。

作業ディレクトリの準備

対象プロジェクトの作業ディレクトリを用意します。
(この項目はvscode関係ありません)

Python用のリポジトリを作る

ディレクトリを作って、Python仮想環境を用意します。

mkdir vscode-tasks-study && cd $_
python -m venv venv
. venv/bin/activate

コード・テストを追加する

pytestのインストール、対象コード・テストコードを用意します。

pip install pytest
pip freeze > requirements.txt

module/main.py

def func_foo():
    return True

tests/test_main.py

import main
def test_main():
    assert main.func_foo()

pytest.ini

[pytest]
testpaths = tests
pythonpath = .

pytestのテストの動作確認をします。

pytest

formatter(ruff)を追加する

formatter(ruff)を追加します。

pip install ruff
pip freeze > requirements.txt

ruffの動作確認をします。

ruff format .

linter(flake8)を追加する

linter(flake8)を追加します。

pip install flake8
pip freeze > requirements.txt

setup.cfg

[flake8]
exclude = venv

flake8の動作確認をします。

flake8

タスクを定義する

それでは、vscodeにTask定義を追加していきます。

各タスクの定義

ruff(formatter), flake8(linter), pytest(unittest)用の定義を追加します。

.vscode/tasks.json

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "ruff",
            "type": "shell",
            "command": "venv/bin/ruff format ${relativeFile}",
            "problemMatcher": [],
            "presentation": {"reveal": "silent", "close": true},
        },
        {
            "label": "flake8",
            "type": "shell",
            "command": "venv/bin/flake8 ${relativeFile}",
            "problemMatcher": ["$flake8"],
            "presentation": {"reveal": "silent", "revealProblems": "onProblem", "close": true},
        },
        {
            "label": "pytest",
            "type": "shell",
            "command": "venv/bin/pytest ${relativeFile}",
            "problemMatcher": [],
            "presentation": {"reveal": "always", "clear": true},
            "group": {"kind": "test", "isDefault": true}
        },
    ],
}

設定方法や各項目の意味は、次のサイトを参照してください。

参考: Integrate with External Tools via Tasks | Visual Studio Code
https://code.visualstudio.com/docs/editor/tasks

参考: Schema for tasks.json | Appendix | Visual Studio Code
https://code.visualstudio.com/docs/editor/tasks-appendix

ここまでの設定で、
Ctrl+Shift+P → 「Tasks: Run Task」
から、各タスク(ruff,flake8,pytest)を呼び出せるようになります。

onsaveでの実行 (formatter, linter)

ruff(formatter), flake8(linter)は、
ファイル保存時に自動実行できると便利なので、その対応を行います。

vscode標準で対応できないので、以下の拡張をインストールします。

Trigger Task on Save | Gruntfuggly | VisualStudio Marketplace
https://marketplace.visualstudio.com/items?itemName=Gruntfuggly.triggertaskonsave

インストール後、次の設定を追加すると、
pythonファイル保存時に、自動でruff/flake8が動くようになります。
また、flake8で問題がある場合は「PROBLEMS」が開いて問題箇所の指摘が表示されます。

.vscode/settings.json

{
  "triggerTaskOnSave.tasks": {
    "ruff": [
      "*/*.py",
    ],
    "flake8": [
      "*/*.py",
    ],
  }
}

ショートカットキーの設定 (unittest)

最後に、pytestの実行ステップがちょっと面倒なので、
ショートカットキーの設定を行います。

Ctrl+Shift+Pでコマンドパレットを開き、
「Preferences: Open Keyboard Shortcuts(JSON)」を実行すると、
キーボードショートカットの設定ファイルが開くので、次のように指定します。

[
    {
        "key": "Shift+Ctrl+F11",
        "command": "workbench.action.tasks.test",
    },
]

この設定を行った後、
tests/test_main.pyを開いて「Shift+Ctrl+F11」でpytestが実行されるようになります。

以上。