🍜

ソフトウェアテストの開発の側面と品質保証の側面

に公開

はじめに

「ソフトウェアテスト」という言葉があります。
テストについて開発者の方と話す際に、テストに対する認識について異なる場合がありました。

そうしたことをきっかけとして、「開発者向けのテスト」ということを考えたりさまざまな人と議論しているうちに、テストには二面性があるということを知りました。

開発手法としてのテストと、品質保証の手法としてのテストです。

本記事ではこれらのテストの二面性について語っていきたいと思います。

開発手法としてのテスト:コードとの対話

TDDやリファクタリングの文脈で扱われるテストは、プログラマー自身が実装と並行して、あるいは実装より先に行なうテストです。
これらは、開発プロセスに組み込まれた開発手法であり、設計手法とさえ言われることもあります。

  • インターフェースや振る舞いを定義する
  • 迅速なフィードバック
  • リファクタリングの安全性の確保

これらは、プログラマー自身が 自分で書いたプログラムと対話する ことに近いと思っています。
プログラマーはテストコードを使って、「この機能をこう使ったら、こういう結果になるはずだ」とプログラムに問いかけます。
プログラムは、その問いかけに対して「成功(Pass)」または「失敗(Fail)」という形で応答します。
これはプログラマーとコードとが行なう二者間の対話だと言えるのではないでしょうか。

テスト駆動開発のなかでは以下のように記載されています。

TDDはプログラミング中の設計判断とフィードバックの間にあるギャップを認識することであり、そのギャップをコントロールする技法でもある。
—『テスト駆動開発』Kent Beck著 (Kindle版)

品質保証としてのテスト:他者への情報提供

一方、品質保証を目的としたテストは、品質にはさまざまな定義がありますが、ここでは「品質とは製品を作る人ではない第三者が感じるもの」という意味合いで捉えています。
品質にもさまざまな定義がありますが、「品質とは作り手以外の他者が感じるもの」という性質は共通していると考えています。

そのように考えると、「品質保証のテスト」は 他者への情報提供 という側面を持ちます。

前の章では、開発手法としてのテストがプログラムとの二者間での対話であると述べました。

一方で、品質保証のテストは、製品とテストを行なう人、そしてそのテストの結果を知りたい人の三者間で行なわれる情報交換と言えます。
これはテストの存在意義を考える際、大きな違いになると思っています。

ソフトウェアテストは、欠陥を発見し、ソフトウェアアーティファクトの品質を評価するための一連の活動である。
JSTQB Foundation Level シラバス Version 2023V4.0.J02

ここでは「評価」という言葉が使われていますが、この評価を誰がするか、という点で開発手法としてのテストと違いがあると考えます。
製品を作る側の視点ではなく、実際に製品を使う人や運用する人の視点から評価するのが、品質保証のためのテストと言えるでしょう。

ここで、「情報提供のためのテスト」という価値観が生まれるのだと考えています。

開発手法としてのテストの語られ方

例えば日本でTDDの普及などの活動を行なっているt-wada氏は以下のように表現しています。

品質保証としてはもの足りない
自動テストは欠陥を減らし品質を高めることを後押ししますが、それによって品質が保証されているとか、欠陥はないという誤った安心感を持ってしまうことにも注意が必要です。

保守しやすく変化に強いソフトウェアを支える柱 自動テストとテスト駆動開発⁠⁠、その全体像~Software Design 2022年3月号「そろそろはじめるテスト駆動開発」,2025/4/13参照

また、Dan North氏も以下のように語っています。
ブロッコリー氏が翻訳した記事の内容を記載します。

TDD、BDD、ATDD、および関連するメソッドは、その名前が示すように、テストに取って代わるものではありません。これらは主に設計および開発手法です。

【翻訳記事】BDDの考案者が執筆した記事「テストについて話し合わなくてはならない」を翻訳しました!,2025/4/13参照

「テスト」という用語を使っており、技術的に近い領域であるにもかかわらず、これらのテストは別々の側面を持っています。
実際の開発現場では、これらの2つのテストについて混同されることがあります。
開発手法としてのテストの結果だけで品質が保証されたと判断したり、逆に品質保証としてのテストが開発手法としてのテストだけで十分だと考えられたりするケースがあります。

すから、開発手法としてのテストと品質保証としてのテストは、それぞれ異なる目的を持つものとして理解することが大切ではないでしょうか。

参考文献

GitHubで編集を提案

Discussion