ナレッジ

モンキーテストとは。ランダムテスト・アドホックテストとの違い、実行方法など解説

モンキーテストとは。ランダムテスト・アドホックテストとの違い、実行方法など解説

ソフトウェアテストの用語には「XXXテスト」と語尾にテストと名の付く用語が無数にあります。その多くはテストタイプであったり、テストのアプローチであったりすることがほとんどです。

本稿ではそんなXXXテストの中でも独特の響きを持つ「モンキーテスト」についていくつかの文献に基づいて解説し、また、その具体的な実行方法をご紹介します。 

「モンキーテスト」とは。その定義。

世間でよく聞くソフトウェアテストの用語に「モンキーテスト」があります。ISTQB/JSTQB用語集の最新版(※1)からはエントリーがなくなってしまいましたが、調査できた限りでは、「ソフトウェアテスト標準用語集(日本語版)Version2.3.J02」 に「モンキーテスト」の説明として以下の解説があります。

モンキーテスト(monkey testing): 製品の使用法については全く考慮せず、広範囲の入力からランダムに選択し、ボタンをランダムに押すことでテストを行う方法。

用語集でも「全く」と強い表現がされている通り、「モンキーテスト」は製品の使用法、仕様、環境条件などを一切考慮しない、むしろ考慮してはならず、与えられたインターフェースに対し、ただひたすら、無心に操作を行うタイプのテストです。テスト対象設計者や実装者の想定範囲にとどまらない操作をすることから、仕様ベース、構造ベースのいずれとも異なる利用パス、データ投入、画面遷移を実行するため、それによるクラッシュや不整合の発生が期待できます。

また、実際にはツールを利用して、長時間テストを実行し続ける、ロードテストの側面を持つ場合があります。一方、テスト対象の構造を一切考慮しないため、例えばウェブアプリケーションなどでは、製品と関係のないリンク先に遷移してしまったり、スマートフォンアプリでは、別のアプリを起動してしまったり、テスト実行上の制御が難しい側面があります。

また、英語版Wikipedia(※2)には「Monkey testing」というエントリーがあり、ソフトウェアテストにおけるテクニックの一つとして挙げられています。

In software testing, monkey testing is a technique where the user tests the application or system by providing random inputs and checking the behavior, or seeing whether the application or system will crash. Monkey testing is usually implemented as random, automated unit tests.

意訳すると、「モンキーテストとは、ユーザーがアプリケーションやシステムにランダムな入力を与え、その挙動をチェックしたり、アプリケーションやシステムがクラッシュするかどうかを見たりしてテストする手法である。モンキーテストは、通常、ランダムで自動化されたユニットテストとして実装される」 となりますが、ISTQBの定義とは「自動化されたユニットテスト」として実装されるのが多いことを前提としている部分が異なります。

モンキーテスト

「モンキーテスト」は「ランダムテスト」や「アドホックテスト」とは違う?

「ランダムテスト」はブラックボックステストの技法の一つで、入力のインターフェースに対し、おおむね仕様で定められた範囲のデータをランダムに生成・入力し、その出力や製品の状態に異常が無いことを確認する技法です。テストの目的によっては仕様で定められている範囲外のデータを生成することもあるかもしれません。

「アドホックテスト」は「モンキーテスト」や「ランダムテスト」と非常に似ているように思える概念ですが、「テスト分析やテスト設計無しで」「非形式に」行われることが定義とされており「ランダム性」は問われていません。テスト実行者のドメイン知識や類似製品、前バージョンの製品などの知識に基づいて、製品の振る舞いを確認します。これまでのバグ情報や不具合モードなどの知識に基づいて、製品の欠陥を検出することを目的に行われる場合は「エラー推測」という別のテスト技法に近くなります。

「モンキーテスト」はテストタイプ?

ソフトウェアテストの用語は、テスト技法、テストタイプ、テストレベル、テストプロセス、テストアプローチなど、さまざまな分類による用語で整理されます。

「モンキーテスト」は強いて言うなら「テスト技法」に近い属性を持つと考えられます。運用に焦点を置くと、「テストタイプ」に近い印象を持つ方もいることでしょう。

「モンキーテスト」の実行方法

前述の通り「モンキーテスト」は、結果として制御されることが無いランダム性が生じます。

研究(※3)によると人間はランダムな選択があまり得意ではなく、その人のバックグラウンド等によってどうしても傾きが出てしまう傾向にあるようです。

また、比較的単調な作業であることからも、人間による実施は不向きな傾向があります。このような問題に対応するため、さまざまな開発環境やツールが用意されています。

UI / Application Exerciser Monkey (Android)

Androidアプリケーション開発時に利用できます。Android開発では、ストレステストツールの一種として分類されています。また、単一のパッケージへのテストの制限などを通じて、モンキーテストが他のアプリケーションや意図しない画面を操作するのを制御することもできます。

UI/Application Exerciser Monkey | Android Studio | Android Developers

Xcmonkey (iOS)

iOS開発におけるモンキーテストでは、UIAutoMonkey や SwiftMonkey などが利用されてきましたが、2024年初頭現在、どちらもアーカイブ、非推奨となっています。その代替として2023年1月に登場したのが Xcmonkey です。2024年現在も活発にアップデートされています。

GitHub - testableapple/xcmonkey: Challenge your apps on iOS with monkey testing 📱🐒

Gremlins.js (Web Application)

Node.jsを利用して、モンキーテストを通じてブラウザからウェブアプリケーションの頑健性をテストします。ウェブアプリケーションのモンキーテストツールは意外と数が少なく、Selenium や WebDriverIO を通じて自作されているケースもあるようです。

GitHub - marmelab/gremlins.js: Monkey testing library for web apps and Node.js

「モンキーテスト」のメリット、デメリット

いくつかのツールでも、機能テストというよりストレステストとして採用されている通り、ツールによって長時間実際の操作を伴いながら製品を動かし続けることは、メモリリークによるクラッシュや速度低下の検出を、低コスト、事前条件無しで行えることと併せて大きなメリットとなります。

一方デメリットも多く、まずランダムであることが主眼に置かれるが故に「製品の保証」、少なくとも機能の網羅的な保証という意味では全く効果が得られません。また、仮に何らかの不具合を引き起こせたとしても、テストの手順やデータがランダムであるため、複雑な再現ステップが必要となる不具合の場合、再現が困難になる場合があります。

このため、操作やデータの内容をロギングするようなツールを併用することで、再現性を確保するなど、テスト実行において工夫が必要となります。

「モンキーテスト」は通常のテスト開発プロセス上で想定される仕様やデータを一切考慮しないため、思いもしなかった欠陥を検出できる可能性があります。そのため、通常のテストプロセスを一通り終えた後、補完的に適用することが望ましいと考えられます。

また、環境によってはツールで自動化して実行が可能であるため、探索的テスト(製品、ドメイン知識に精通したテストエンジニアが動作する製品を学習しながらテスト設計を洗練させつつテストを実行するテストのアプローチ)やエラー推測といった、人間による高度なテストのアクティビティと並行して動作させておくといった適用方法もあるかもしれません。

「モンキーテスト」の特性や適用できるシーン、ツールなどを踏まえて、効果的にテスト計画に織り込んでいただけましたら幸いです。

■参考■
(※1)ソフトウェアテストで使う標準用語集 - ISTQB Glossary
(※2)Monkey testing - Wikipedia(2024/1/4 閲覧)
(※3)How random are you? | Danny James Williams

SNSシェア

この記事は面白かったですか?

今後の改善の参考にさせていただきます!

Ranking

ランキング

もっと見る