マインドから始める探索的テスト

この記事はNTTコムウェア [Advent Calendar 2023](https://qiita.com/advent-calendar/2023/nttcomware) 16日目の記事です。

こんにちは、NTTコムウェアの 吉村 優 と申します。
普段は社内の開発プロジェクト向けに品質向上に関する技術支援を行っています。
ここ２年半ほどは、特に探索的テストを活用した支援に取り組んでいます。
探索的テストは考え方や解釈が難しくQAやテストエンジニア界隈でも常に議論されているテーマの一つです。
これから探索的テストに取り組もうとしている人や最近始めた人向けに、私がこれまで取り組んできた中で考えたことや自分の理解について紹介します。


## はじめに
長らくソフトウェアテストの世界では、網羅性重視でテストケースを作成する記述式テストが主役となっていました。
しかし、最近になって新たな視点を取り入れたアプローチ方法が台頭してきており、特に探索的テストはその代表的なものの一つとして脚光を浴びています。

さまざまな書籍やウェブサイトなどから探索的テストの実践方法についての情報は手に入りますが、
いざやってみると

- 「調べた通りにやってみたけど、うまくできたような、できてないような…」
- 「アドホックテストと何が違ったのだろうか…」
- 「今までウチでやっていたのも探索的テストだったのでは…」

といったもやもやしたものに直面することがあると思います。
実際、私も最初の頃は「こんな感じでいいのかな…」と思いながらテストしていました。

これは、探索的テストが単なるテスト技法の実践プロセスというだけではなく、特有の思考方法が存在し、それがうまく取り込めていないことが要因の一つなのではないかと考えています。
そこで、探索的テストを実践する際に必要なテスターのマインドやモチベーションに焦点を当てて、私なりの考えを書いていきます。
（探索的テストの具体的な実施方法についてはここでは細かくは扱いません。）


## 探索的テストとは
探索的テスト(Exploratory Testing)という名前は1980年代にCem Kanerによって、知的なテストのアプローチ方法として他の技法と区別するために命名されました。(参考：[A Tutorial in Exploratory Testing](https://web.archive.org/web/20130612043734/http://www.kaner.com/pdfs/QAIExploring.pdf))
命名自体はかなり前の出来事ですが、ここ数年でさまざまなイベントの発表などでも当たり前のように名前を聞くようになってきました。

用語として画一的な定義はされていないようですが、例えば、[ISTQBテスト技術者資格制度 Foundation Level シラバス 日本語版 Version 2023V4.0.J01 ](https://jstqb.jp/dl/JSTQB-SyllabusFoundation_VersionV40.J01.pdf)では以下のように説明されています。
> 探索的テストは、テスト担当者がテスト対象について学習しながら、テストケースを同時に設計、実行、評価する。探索的テストは、テスト対象についてより深く知り、注力したテストでより深く探索し、まだテストしていない領域のテストを作成するために使う。

各所でいろいろな言い回しで説明されていますが、内容を整理すると以下のような特徴を持つ技法だと言えます。

- 経験ベースのテスト技法の１つ
- テスト対象システムに対する学習、テスト設計、実行、評価を並行して実施する
- 事前にテストケース（テスト項目）は作成しない
- テスター自身の経験や知見を活用する
- テストを行って得た結果を次のテストに活用する
- だんだんとテストの内容を洗練していく
- 多くの場合はテストチャーターと呼ばれる指針を用いて戦略的にすすめる

## アドホックテストとの違い
探索的テストに関わっていると、必ずと言ってよいほど出くわすのが「結局、アドホックテストと何が違うん？」問題です。
探索的テストとアドホックテストは、テストケースを作成する記述式テストとは別のアプローチを行うテスト技法です。
どちらもテストケースを作成しないと言う点では共通しています。
それぞれの技法の違いについて掘り下げていきます。

**アドホックテスト**

「アドホック(ad hoc)」という言葉は、ラテン語で「その場限りの」、「特定の目的のための」、「即興の」といった意味を持ちます。
この意味の通りで、アドホックテストは "たった今この瞬間に必要な特定の目的に対して行うテスト"という側面があります。
それを踏まえると以下のような技法だと言えます。

- その瞬間の状況を切り取った時に必要となっているテストを実行する
- １つ１つのテストが独立している
- テスターからテスト対象へ一方的にテストが実行される
- 局所的な問題の発見が主な焦点となる

**探索的テスト**

「探索」という言葉を辞書で引くと「未知の事柄などをさぐり調べること」、「探したずねること」といった意味が書かれています。
手がかりをもとに目的に向かっていくような時系列的なつながりがある感じがすると思います。
そこが探索的テストを探索的テストたらしめる大事な要素です。

- 範囲や方針、目的を定める
- 状況に応じて新しいテストケースを考え出す
- 得られた結果を活用して次のテストを組み立てる
- 結果と自身の思考との間で対話的にテストを進めて問題の根幹を調べる

<br>
ざっくりですが絵にしてみるとこのようなイメージです。
<br>

![fig1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622373/b267377a-b61e-aabb-9279-9ecf88f27518.png)
<br>

:::note warn
ゲリラテストやランダムテストなども含めてアドホックテストと呼んだり、探索的テストとアドホックテストが同じものとして扱われることなどもあります。この記事ではテストケースを作成しないテスト技法のうち、ランダム性の高いテストを総称してアドホックテストとし、計画や戦略を立てて対話的に進める方法を探索的テストとして扱います。
:::

## 求められるマインドセット
アドホックテストと探索的テストの違いについて書きました。
言葉の意味から考えると少しわかりやすくなったのではないでしょうか。
が、次に出くわすのが「ってことは、俺が今までやってたアドホックテストは実質、探索的テストだったわ。」です。
アドホックテストをやっているときに、本当になにも考えずにただポチポチやっていることは現実的にはあまりないでしょうから、プロセスだけで考えた場合には当然でてくる意見だと思います。

一般的にアドホックテストよりも探索的テストの方が故障の検出効率は高いと言われていますが、呼び名だけ変えても得られる効果は変わりません。（呼び方にこだわりすぎるのもよくないですが。）

私は**これらの2つのテスト技法は二者択一ではなくグラデーションがあるもの**だと捉えています。
どんなに経験豊富な探索的テスターでも、時には手当たり次第にテストしてみていることもあるはずで、実際は以下のような進め方になっているのではないかと考えます。
<br>

![fig2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3622373/4413b1c3-ba2f-8680-09cb-8f03565553de.png)
<br>

さて、その上で探索的テストに寄せたテストをしたい場合はどうすれば良いのか考えていきます。
上述した技法の特徴からみると、テストを１つ行うたびに深く次を考えるという段階を挟むことが重要となってきそうです。
考える具体的な内容についてはプロダクトや状況によりますが、油断をするとどうしても考えること自体を放棄して次のテストを進めたくなります。
どのような心意気でいれば深く考えることができるのかという点について、探索的テストを行う上で重要なマインドセットという観点で、アドホックテストに必要なものと比較して書いていきます。

#### アドホックテスト
- 柔軟性
    - 設計情報等が不足していても今わかる範囲で何らかのテストを実行すること
- 直感の重要性
    - 予測や理論ではなく直感を活用すること
- 即興性
    - テンポよく次々にテストを実行すること

#### 探索的テスト
- 探究心と対象への理解促進
    - テスト対象そのものや関係者に対して問いを投げかけるなど、テスト対象への深い理解を追求すること
- 状況への寛容性
    - 機能や故障検出状況、求められる品質レベルなどの状況が変化しても必要なテストをすぐに組み立てること
- 洞察力
    - わずかな異変も見逃さない注意力や洞察力を持つこと

<br>

このように、アドホックテストではその場その場における反射神経が大切になってきます。
一方、探索的テストはその場の状況を理解し、それを踏まえて次を考える粘り強さが必要です。　
ドメイン知識やテスト技法などのスキルや知識の習得は大前提として、このような考え方を持つことが探索的テストを成功させる鍵となります。

## 情熱を持って探索的テストを行うために
これまで探索的テストの基本的な特徴や必要なマインドセットについて書いてきました。
探索的テストは深い理解を駆使して進める手法であり、効果的に活用するためにはテスター自身が情熱を持ってテストに臨む必要があります。
最後に、探索的テストで必要となるマインドを維持するためのモチベーションの源泉について考えていきます。

- 成果の喜び
    - 探索的テストを行うために考えを巡らせる中で新たな洞察力を得たり、未知の故障を見つけたときの達成感がモチベーションの重要な源泉です。これは自身の創造力やアイデアを活かすことができる探索的テストならではの特徴です。
- 協働的な学び
    - 探索的テストは周囲からの情報も積極的に活用していくため、孤独な作業にはなりません。他のメンバーや開発者との密な対話や相互サポートを行うことで知識や視野が広がり、テストの効果が最大化します。協働の中で生まれる成果やチームワークもモチベーションの源泉です。
- 自身の成長
    - 探索的テストを通じて、自身のスキルや知識の発展も期待ができます。新しいテストケースの考案や異なるアプローチの試みは、テスター/エンジニアとしての成長を促します。自身の強みや弱みも把握して挑戦を続けることでモチベーションが持続します。

このように探索的テストの取り組みの中に自分の考えをしっかり入れ込むことで、自身を動機づけすることができます。
動機づけができれば成果が得られやすくなり、さらにモチベーションの源泉が増大します。
ただ、なによりもまずはテスター自身が「自分は探索的テストをやっているんだ！」ということを強く自覚することが大切です。

## おわりに
今話題の探索的テストについて、思考に焦点をあてて記事を書きました。もちろん所属組織や現場の状況などによって当てはまらない場合もあると思いますが、同じ境遇で悩んている方のお役に立てば幸いです。
全体的にアドホックテストとの比較をしながら書きましたが、アドホック的なやり方がダメとは思いません。テストできる観点や必要な労力も変わってきますから、状況次第で深く考えずにテストするのも必要だと思います。
私自身は日々ずっとテストをしているわけではないので、スキルを高めていくためにもちょこちょこ実践の場を作りたいなーと思ったりします。（決してやりませんが、タブレットで注文するレストランなどにいくと色々な操作を試してみたくなります）

※ 記載されている会社名、製品名、サービス名は、各社の商標または登録商標です。