その先へ

setohの色々殴り書き

Testing pyramidとTesting trophy

ハロー、@seto_hi です。

この記事は株式会社エス・エム・エス Advent Calendar 2023の1日目の記事です。

qiita.com

自分は1年前からフロントエンドエンジニアとして働いており、最近はプロダクト開発と並行して、フロントエンド開発のテスト関連の方針を考えています。

テストのバランスについて考えた

Unit testやIntegration testなどの各種テストのバランスについて、Testing pyramidとTesting trophyという有名な考え方があります。一見するとこの2つの考えは相反しているように感じ、どちらに従うべきか迷いました。
調べていくうちに自分なりに納得のいく結論が出たため、そのことについて書きます。

Testing pyramid

自分がTesting pyramidを知ったのはAndroid開発をしていたときで、テストの基礎というドキュメントで言及されていました。

developer.android.com

元々はMike Cohnが著書 Succeeding with Agileの中で書いたコンセプトのようです。

実行時間が短く保守が簡単なテストを多くし、実行時間が長くて保守が大変なテストを少なくし、テストのバランスをピラミッドのようにしようという考えです。

Testing trophy

フロントエンド界隈では有名な考え方で、恐らく以下のブログ記事が一番見られているのではないかと思います。

kentcdodds.com

生産性を高めるために、複数のユニットを結合したテストを多く書こうという考えです。
(Unit testよりも速度に優れたStaticが追加されていることも特徴的ですが、この記事では触れません)

Testing pyramidとTesting trophyは相反する考えなのか

Androidの「テストの基礎」ではTesting pyramidに沿うためにIntegration testよりもUnit testを多くするように書かれ(UI test 10%, Integration test 20%, Unit test 70%)と書かれています。
一方、Testing trophyではUnit testよりもIntegration Testを多く書くするように書かれています。

このことからTesting pyramidとTesting trophyは相反する考えのように感じましたが、背景にはテストの分類の違いがあるということに気付きました。

そもそもUnit testとIntegration testとは

下記の記事に書かれているようにUnit test とIntegration testという用語は使う人によって定義が異なる曖昧になっており、混乱の原因はそこにありました。

Testing pyramidでは依存オブジェクトのあるsociable testと依存オブジェクトのないsolitary testをUnit testと呼び、Testing trophyではsolitary testのみをUnit testと呼び、sociable testはIntegration testと呼んでいるようです。

何がUnit test/Integration testであるかという前提が異なっていれば、テストのバランスが異なるのも納得ができます。

martinfowler.com

また、SWETチームの下記の記事には「テストスコープで分類するとトロフィーになるものが、テストサイズで分類するとピラミッドになる」というt_wadaさんのコメントが書かれており、リンクされていたスライドと合わせて自分には腑に落ちました。

swet.dena.com

結論

これらの記事を読み、自分の考えはTesting pyramidとTesting trophyはテスト分類の考えは異なるが、テストのバランスについて相反する考えではないという結論になりました。

また、solitary testとsociable testというより細かい分類を意識することでTesting pyramidとTesting trophyの両方を満たすこともでき、より良いテストバランスにすることもできると思っています。

おまけ

文中に貼った記事で何回か言及されていたポストにも触れておきます。

最も重視すべきことはプロダクト開発に有用なテストを書くということで、テストの分類や割合はあくまで補助的な指標であることを忘れてはいけません。

自分もTesting pyramidとTesting trophyなどのテストバランスはひとつの指標として参考にしつつ、開発中のプロダクトに有用なテストについて考えを深めていきたいと思います。

最後に

明日のAdvent Calendarは @k12u が記事を書きます!

また、株式会社エス・エム・エスではソフトウェアエンジニアを募集しています。

自分と一緒にフロントエンドの開発をしたり、スケールするフロントエンドのテストの方針を考えませんか?
採用情報はこちら