VSCode Extensionの開発を行うことになりました。開発PCはWindowsになるし、開発チームの環境も揃えたいと言うことでdevcontainerを使って開発環境を構築するつもりです。さて、テストはどうしましょうか。
なお、この記事におけるVSCodeのバージョンは次のとおり。
code -v 1.93.1 38c31bc77e0dd6ae88a4e9cc93428cc27a56ba40 arm64
VSCode Extensionのテスト
VSCode Extensionの実装は、どうしてもVS Code APIと密結合せざるを得ません。このため、たとえメソッド単位でテストを実施しようと思っても、そのメソッド中でVS Code APIを使っている限り、それをなんとかしないといけない。
もちろんこの辺りはVSCode Extensionのエコシステムが存在しており、@vscode/test-cliがvscode-test
というツールを提供しています。このツールは、Extension Development Hostと呼ばれる特殊なVSCodeインスタンスを立ち上げ、その中でテストを実行することで、VSCode APIを使ったテストを実現します。
課題
このvscode-test
コマンド、devcontainerの中で動かすと、SIGSEGVで落ちます。
npx vscode-test ✔ Validated version: 1.93.1 ✔ Found existing install in /workspaces/vscode-extension/.vscode-test/vscode-linux-arm64-1.93.1 [794:0914/164429.845155:ERROR:bus.cc(407)] Failed to connect to the bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory (略) [0914/164430.495903:ERROR:file_io_posix.cc(145)] open /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq: No such file or directory (2) Exit code: SIGSEGV
どうもvscode-test
では仮想ディスプレイを要求しているようでした。これを何とかしなければコンテナの中でテストが実行できません。
仮想ディスプレイ環境を用意する
まずはコンテナの中に必要なパッケージをインストールします。devcontainerのDockerfileは次の内容としました。 apt-get installでバージョンをpinしていますが、動作確認が取れた最新版を指定しているだけで、強い意味はありません。
FROM mcr.microsoft.com/vscode/devcontainers/javascript-node:20 RUN apt-get update \ && export DEBIAN_FRONTEND=noninteractive \ && apt-get -y install --no-install-recommends \ libnss3=2:3.87.1-1 \ libdbus-1-3=1.14.10-1~deb12u1 \ libatk1.0-0=2.46.0-5 \ libatk-bridge2.0-0=2.46.0-5 \ libgtk-3-0=3.24.38-2~deb12u2 \ libgbm1=22.3.6-1+deb12u1 \ libasound2=1.2.8-1+b1 \ xvfb=2:21.1.7-3+deb12u7 \ xauth=1:1.1.2-1 \ && apt-get autoremove -y \ && apt-get clean -y \ && rm -rf /var/lib/apt/lists/* \
上記Dockerfileによって構築されたコンテナの中で、xvfb-run
を使ってvscode-test
を実行します。
xvfb-runは
は、指定されたコマンドを、仮想Xサーバー環境で実行してくれるコマンドです。
xvfb-run npx vscode-test ✔ Validated version: 1.93.1 ✔ Found existing install in /workspaces/vscode-extension/.vscode-test/vscode-linux-arm64-1.93.1 [707:0914/165246.887320:ERROR:bus.cc(407)] Failed to connect to the bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory (略) Started local extension host with pid 966. Loading development extension at /workspaces/vscode-extension [707:0914/165252.950687:ERROR:bus.cc(407)] Failed to connect to the bus: Could not parse server address: Unknown address type (examples of valid types are "tcp" and on UNIX "unix") Extension Test Suite ✔ Sample test 1 passing (55ms) [main 2024-09-14T16:52:53.392Z] Extension host with pid 966 exited with code: 0, signal: unknown. Exit code: 0
テストが正常終了しました。これでdevcontainerの中でVSCode Extensionのテストが実行できそうですね。