🛤️

TestRailにnewmanの実行結果を登録するライブラリの精神的続編を作ってみました

2024/08/25に公開

こんにちは。ダイの大冒険ガチ勢のbun913と申します。

みなさんは、TestRailというテストケースなどの管理ツールは知っていますか?

こちらのツールは単にチケットのようにテストケースを管理するだけでなく、PostmanやPlaywrightなどのツールとAPI連携することで、「このテストケースに対するテスト結果はこれ」という結果を登録することができます。

私もnewman(Postman をCLIやプログラムから実行できるツール)を活用しようとしたところ、以下の既存のライブラリがパブリックアーカイブになっていることに気づきました。

https://github.com/billylam/newman-reporter-testrail

そこで、このライブラリをベースに「無理なく改良を続けられるようにしたい」という思いから新たにライブラリを作成してみました。

できること

後でも説明しますが、以下のようにGitHubリポジトリを作成し、npmパッケージとして公開しました。

https://github.com/bun913/newman-reporter-testrail-neo

https://www.npmjs.com/package/newman-reporter-testrail-neo

機能面は元のライブラリから変更していません。そのため、以下のようにnewmanのテスト結果をTestRailに登録することができます。

  • まずPostmanから実施したいCollectionをエクスポートしておきます
  • その際、以下のように Postman のテストケースタイトルに TestRail のテストケースIDを記載しておきます

postman_sample

  • このコレクションをPostmanでエクスポートしたものが以下のようになります
{
  "info": {
    "_postman_id": "hoge",
    "name": "SystemTest",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
    "_exporter_id": "10000"
  },
  "item": [
    {
      "name": "Get",
      "event": [
        {
          "listen": "test",
          "script": {
            "exec": [
              "pm.test(\"C1 Successful Get request\", function () {",
              "    pm.expect(pm.response.code).to.be.eq(200);",
              "});"
            ],
            "type": "text/javascript"
          }
        }
      ],
      "request": {
        "method": "GET",
        "header": [],
        "url": {
          "raw": "https://github.com/bun913/newman-reporter-testrail-neo",
          "protocol": "https",
          "host": ["github", "com"],
          "path": ["bun913", "newman-reporter-testrail-neo"]
        }
      },
      "response": []
    }
  ]
}
  • 次に以下のようにnewmanを実行します
# 環境変数を設定
# 詳細はREADMEを参照ください
# https://github.com/bun913/newman-reporter-testrail-neo/blob/main/README.md
export TESTRAIL_DOMAIN=example.com
export TESTRAIL_USERNAME=hoge@example.com
export TESTRAIL_PROJECTID=1
export TESTRAIL_APIKEY=fugafuga

# あらかじめPostmanからエクスポートしたJSONファイルによりテストを実行し、TestRailに結果を登録
newman run ./test/systemTest/system_test.json --reporters testrail-neo
  • こうすることで、TestRailにテスト結果が登録されています

testrail_sample

実施したこと

  • 既存のライブラリからソースコードはほとんど変更していません
  • ただし、今後無理なく開発を継続できるように以下の工夫をしています
    • テストをしにくい実装を少しだけ修正(依存性を注入できるようにするなど)
    • 動かなくなっていたテストを修正
    • 小さいクラスなどのユニットテストを追加して、素早く開発にフィードバック可能に
    • Pull Request 時の自動テスト・静的解析、自動リリースの設定を追加しました
    • npm audit で既に検出されていた脆弱性をアップデート
    • TestRailの環境が用意できればすぐにシステムテストを実施できるように説明を追記(自動化は未実施)

背景・工夫したポイント

背景

最近私の所属するチームにおいて、テストケースと自動テストの追跡性について考えており、その際 TestRail にテストケースと実行結果を蓄積していくことを検討しています。

その際、API Test として Postman を利用していることもあり、newman でのテスト結果を TestRail に登録する方法を探していました。

結果として今回作成したライブラリのオリジナルにあたるものを見つけたのですが、パブリックアーカイブされていました。

https://github.com/billylam/newman-reporter-testrail

まだ機能としては動くようなのですが、「脆弱性のあるパッケージもそのまま」「バグがあってもどうしようもできない」のは健全な状態とは言えないと考えました。

調べたところ代替のライブラリがあまり見つからず、多くのブログ記事でも元のライブラリが使われたままであったので、「とりあえず仕組みだけでも作ればOSSとして誰かが改善してくれるかもしれない」という思いで、最低限の改善を行ったという経緯です。

動かないテストを修正し、挙動ベースのタイトルに変更

「リファクタリング」とは機能やシステムの挙動を変更せずに、コードの構造や設計を変更することらしいです。

オリジナルのライブラリは非常に素晴らしいのですが、残念ながらテストコードは動かず「挙動を変更せずに」を確かめることができない状態でした。

そのため、たとえば以下のようにテストコードをBDD形式で実装して、一つ一つ挙動を確かめていきました。

✓ test/TestrailReporter.spec.js (12)
   ✓ TestrailReporter (12)
     ✓ onComplete (4)
       ✓ raise error when required options are missing (4)
         ✓ raise error when domain option is missing
         ✓ raise error when username option is missing
         ✓ raise error when apikey option is missing
         ✓ raise error when projectid option is missing
     ✓ jsonifyResults (8)
       ✓ converts newwman test results to TestRail-compatible JSON format (3)
         ✓ converts a test result to one TestRail test run
         ✓ converts two test cases to two TestRail test runs
       ✓ failed test case handling (1)
         ✓ converts a failed test case to a failed TestRail test run
       ✓ skipped test case handling (1)
         ✓ converts a skipped test case to a skipped TestRail test run

CI/CDを追加

安心して開発でき、少しでも面倒を減らすために以下のようなCI/CDを追加しました。それに伴って、ライブラリを少し導入しています。

  • Pull Request 時に自動テスト・静的解析を実施
  • Gitのタグ付け時にnpmパッケージを自動リリース

今後したいこと

今回の目標は「無理なくリファクタリングや機能改修できるように仕組みを作ること」でした。

そのため必要最低限のことしか行っていませんが、以下のようなことを今後していきたいです。

  • リファクタリングしたい・・・
    • 実装はほとんど変えておらず未着手です
  • JavaScript を TypeScript にする
    • 型があるってありがたいんですよね。実感しました。
  • より多くのユニットテストを追加する
    • 各オプション単位でのテストが書けていないので、もっと境界値にあたるような分岐をテストしたいです
    • オリジナルでもそうですが、すべてのオプションの挙動を保証できているわけではありませんので・・・
  • システムテストを自動化したい(TestRail はお金がかかるので・・・)
    • ユニットテストはあるのですが、本当にライブラリとして実行した時に動作するのか?という安心を得るためのテストを追加したいです(今は手動)
    • 技術的には容易なのですが、💰が足りません
    • TestRail には30日間のフリートライアルがあるのですが、少し厳しいです
    • 誰か私に自由にできる環境をくれませんか?(懇願)

まとめ

  • 同僚や困っている人の顔を想像して、パブリックアーカイブになっていたライブラリの続編的なものを作成しました
    • ネーミングセンスはありません
  • 機能は変更していませんが、特に工夫したポイントは以下のとおりです
    • 動かなかったテストを修正
    • 今後改修やリファクタリングしやすいようにテストを追加
    • CI・CDを追加
    • 作業時間数時間で「最低限」のことを素早く行った

https://github.com/bun913/newman-reporter-testrail-neo

https://www.npmjs.com/package/newman-reporter-testrail-neo

私は以前小規模ながらOSS活動をしていたので、「仕組みをつくりさえすればあとは優秀な誰かがなんとかしてくれる」というエコシステムを体験済みです。

今回も最初からそういうわけにはいかないと思いますが、時間のある時に世界中の誰か1人に有益なことをできればと思います。

以上、bun913でした。ありがとうございました。

GitHubで編集を提案
Money Forward Developers

Discussion