Meaningless Notebook

我輩は雑記帖である。名はまだない。


自作した拡張機能でテストコ-ドのカバレッジを確認したら 0% になってた件を、最新版の VSCode でも動作させる方法。

対応方法

istanbule のコマンドラインインタ-フェ-スである nyc をコマンド呼び出しするのではなく、テストランナ-スクリプトで呼び出すように組み込む。

(゚Д゚)ハァ?

と思う人もいるでしょう、私も思った。

でも残念ながらそれしかないようです。

ちなみに参考にしたのはこちら。

具体的にはテストランナ-スクリプトで nyc インスタンスを生成する。

生成してインストゥルメントしてテストが完了したらレポ-ト生成メソッドを呼び出す。

…楽勝だな !

index.ts

/* eslint @typescript-eslint/naming-convention: "off" */
import * as path  from 'path';
import * as Mocha from 'mocha';
import * as glob  from 'glob';

const NYC        = require('nyc');
const baseConfig = require('@istanbuljs/nyc-config-typescript');

function getNycInstance(): typeof NYC {
	const nyc = new NYC({
		...baseConfig,
		cwd: path.join(__dirname, '..', '..', '..' ),
		reporter: ['text-summary', 'lcov', 'html'],
		all: true,
		silent: false,
		instrument: true,
		hookRequire: true,
		hookRunInContext: true,
		hookRunInThisContext: true,
		sourceMap: true,
		include: ['src/**/*.ts', 'out/**/*.js'],
		exclude: ['**/test/*'],
	});

	nyc.reset();
	nyc.wrap();

	return nyc;
}

export async function run(): Promise<void> {
	const testsRoot = path.resolve(__dirname, '..');

	// Sets the test coverage
	const nyc = '1' === process.env['COVERAGE'] ? getNycInstance() : undefined;

	// Create the mocha test
	const mocha = new Mocha({
		ui:    'tdd',
		color: true
	});

	// Backup of settings.json and clear
	const { ExtensionSetting } = require('../../includes/settings/extension');
	const backup               = new ExtensionSetting();

	await new ExtensionSetting().uninstall();

	return new Promise((c, e) => {
		glob('**/**.test.js', { cwd: testsRoot }, (err, files) => {
			if (err) {
				return e(err);
			}

			// Add files to the test suite
			files.forEach(f => mocha.addFile(path.resolve(testsRoot, f)));

			try {
				// Run the mocha test
				mocha.run(async failures => {
					await backup.commit();

					if (failures > 0) {
						e(new Error(`${failures} tests failed.`));
					} else {
						if (nyc) {
							nyc.writeCoverageFile();
							await nyc.report();
						}

						c();
					}
				});
			} catch (err) {
				console.error(err);
				e(err);
			}
		});
	});
}

上の例は個人的に開発している拡張機能で、settings.json のバックアップが仕込んであるので分かりづらいかも。

結論だけ言えば、getNycInstance メソッドを呼び出してテスト正常終了時に writeCoverageFile メソッドと report メソッドを呼ぶだけ。

ちなみに nyc は istanbule のコマンドラインインタ-フェ-スだからプログラム的に呼び出すのは想定されていないらしく情報はほとんどない。つまりいつまで出来るかは(ry

参考元

Amazon