前回ミスで計算結果が間違うようになってしまった。計算ツールでこういうことがあると致命的なので、ユニットテストを導入する。 (この話に持っていくためにあえてミスしたように見えるが、純粋なミスだったりする)
TypeScript npm testで検索して上に出てきたこの辺を参考にしつつ TypescriptとJestで単体テストをやってみる #Node.js - Qiita
jsetのインストール
テストフレームワークはjestというのがよくつかわれるらしい。
まずインストール
$ npm install --save-dev jest @types/jest ts-jest
--save-devというのは開発者用で、利用者には必要ないモジュールをインストールするときにつけるらしい。
次にpackage.jsonのscriptsのtestを"jest"にする。これでnpm run testまたはnpm tでテストが実行できるようになるようだ。
jestの環境構築 · st-func/st-func-ts@b57bb80 · GitHub
テストコードの作成
テストコードを置く位置はいろいろな流派があるらしい。
大きいプロジェクトではないので、わかりやすさ、見やすさ重視で、ソースコードと同じディレクトリに[ファイル名.test.ts]とするパターン3にすることにする。
build-h-function.test.tsというファイルを作り前記事でて計算した結果をもとに、下記のように書く。
import { SecBuildHFunction } from "./build-h-function"; test("ビルドHのA", () => { expect(SecBuildHFunction.build_h_area(1200, 400, 19, 25)).toBe(41850.0); }); test("ビルドHのIy", () => { expect( SecBuildHFunction.build_h_second_moment_of_area_y(1200, 400, 19, 25) ).toBe(9312218750.0); }); test("ビルドHのIz", () => { expect( SecBuildHFunction.build_h_second_moment_of_area_z(1200, 400, 19, 25) ).toBe(267323987.5); });
これで、下記を実行。
$ npm t
無事テストが動いた。3つテストをやったので
Test Suites: 1 failed, 1 total Tests: 1 failed, 2 passed, 3 total Snapshots: 0 total Time: 1.628 s, estimated 2 s Ran all test suites.
と表示された。 1つfailedになっているのが、前回コードを書き間違えた部分で、下のように出力される。
ビルドHのIy expect(received).toBe(expected) // Object.is equality Expected: 9312218750 Received: 57603735355.75 8 | expect( 9 | SecBuildHFunction.build_h_second_moment_of_area_y(1200, 400, 19, 25) > 10 | ).toBe(9312218750.0); | ^ 11 | }); 12 | 13 | test("ビルドHのIz", () => { at Object.<anonymous> (src/sec/build-h-function.test.ts:10:5)
ソースコードを修正して再度実行したら下記のようになり、無事テストが通った。
PASS src/sec/build-h-function.test.ts √ ビルドHのA (2 ms) √ ビルドHのIy (1 ms) √ ビルドHのIz (1 ms) Test Suites: 1 passed, 1 total Tests: 3 passed, 3 total Snapshots: 0 total Time: 1.551 s, estimated 2 s Ran all test suites.
修正が完了したため、st-func-ts内でnpm run buildを実施。
アドインのほうで、build+startを実行。
すると無事に正しい数式が表示された!
やはりテストは重要なんだな。
SecBuildHFunctionのテストを作成 · st-func/st-func-ts@e4f78dc · GitHub