ST_FUNC開発日記

建築構造設計Excelアドイン開発の記録

ユニットテストの実施

前回ミスで計算結果が間違うようになってしまった。計算ツールでこういうことがあると致命的なので、ユニットテストを導入する。 (この話に持っていくためにあえてミスしたように見えるが、純粋なミスだったりする)

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

テストコードの作成

テストコードを置く位置はいろいろな流派があるらしい。

zenn.dev

大きいプロジェクトではないので、わかりやすさ、見やすさ重視で、ソースコードと同じディレクトリに[ファイル名.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