理系学生日記

おまえはいつまで学生気分なのか

VSCode Extensionのテストをdevcontainerの中で実施したい

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のテストが実行できそうですね。

参考文献