Toshiyuki Kawanishi Blog


2009
4 . 15

「開発者テストの道具」と「テストのレベル」の言葉の使い分け

"X Tests are not X Tests" とは、"Working Effectively with Legacy Code" の著者である Micheal Feathers  が最近叫んだ言葉です。



この意味は、あなたが「XXXテスト」と呼んでいるテストは、他の人の言う「XXXテスト」とは限らないということでしょう。テストに関する言葉が混乱していて大変だという趣旨の投稿です。この混乱の理由のひとつとして、コミュニティーごとに、テストに関する方言があるということが挙げられています。また、この記事では、Stephen Waltherの "TDD Tests are not Unit Tests" というブログの記事についても言及されています。この記事には詳しくは触れませんが、要は「TDDでのテストは、いわゆる『ユニットテスト』ではない」ということが主張されています。



さて、今回は、この言葉の混乱という問題について「『開発者テストの道具』と『テストのレベル』の言葉の使い分け」というアプローチで考えてみたいと思います。

最近は、同じ「テスト」という言葉を使っていても、TDDで書くテストなど開発を推し進めるための開発者テスト(Developers Testing, Development Test)と、品質のためのテスト(QA Testingなどと呼ばれることも多くなってきています)は違うということが広く認識されるようになってきました。この開発者テストで使われている言葉には、もともと「テストレベル」を表す言葉として使われていたものがあります。

ここで、テストレベルとは、テストの階層のことです。ISTQB(JSTQB)の定義によると、テストのレベルはV字の下からコンポーネントテスト、統合テスト、システムテスト、受け入れテストとなっています。なお、コンポーネントテストの別名としてユニットテスト、モジュールテスト、プログラムテストという言葉もある旨が説明されています。



例えば、ユニットテスト(単体テスト)という言葉。これは、もともとテストレベルの一番下の階層、つまりISTQBでいうコンポネントテストを指す言葉に由来しているのだと思います。しかし、TDDで書くテスト、xUnitを使って書くテストは、コンポーネントテストのレベルのテストとは限りません。特にリファクタリングを取り入れている場合は、コンポーネントテストのレベルに当たるようなテストを、統合テストに当たるようなテストに書き換えていくということも多くあるでしょう。こうなってくると、そもそも開発者テストをテストレベルによって分類するということ自体が無意味になってきてくるような気がしてきます。

このことは、Martin Fowler の以下の言葉に端的に表れているのではないかと思います。

Unit testing in XP is often unlike classical unit testing, because in XP you''re usually not testing each unit in isolation.

eXtreme Programming (XP) でのユニットテストは、従来のユニットテストとは違う。なぜならば、XPでは各部品ごとに分けてテストするとは限らないからだ。



こうして、開発者テストの道具としてのユニットテストという言葉と、テストレベルの最下層としてのユニットテスト(コンポーネントテスト)という言葉の使い分けが必要になってくるわけです。


受け入れテストという言葉もそうでしょう。受け入れテストは、ISTQBでは最上位に位置するテストレベルとして紹介されていますが、この言葉も違う意味で使われることが多いです。

例えば、ユーザストーリについて扱っている "User Stories Applied" という書籍では、「受け入れテストはストーリの実装が何を満たせばよいかを示すテスト」というような意味で受け入れテストという言葉を使っています。FITやCucumberも、このような意味での受け入れテストのための道具なのだと思います。もちろんプロセスによっては、テストベースがストーリであったりユースケースであったりするかもしれませんが。





なお、受け入れテストという言葉はさらに色々な側面で使われていて、テスト開始前に開始条件を満たしているかどうかを検査するためのテストを受け入れテストと呼ぶ場合もあります。つまり前工程からソフトウェアを受け入れる時におこなうテストを受け入れテストと呼ぶこともあるということですね。「基本から学ぶソフトゥエアテスト」では、「最終受け入れテスト」という言葉を用いて、各工程の開始条件としてのテストとユーザの受け入れテストを使い分けています。





このように、同じ「XXXテスト」という言葉でも、開発者テストの文脈で語られる場合と、テストレベルなど従来の使い方で語られる場合では、意味が異なってくる言葉があります。これらは、ルーツが同じだったりして、お互い無関係というわけではありませんので、厳密に使い分けなくても良い場合もあります。しかし、細かい話をするときは、どちらの意味で使っているのかを意識しないと話が通じない場合も良くあるでしょう。

一昔前は、QAの世界でのテストの方が一般的でしたが、近年は開発者テストもかなり体系化されて、テストという言葉に初めて触れるのが開発者テストの文脈の中でというケースも増えてきているのではないでしょうか。というわけで、この辺りの方言の違いの認識がもっと広まって、おかしな誤解が減ってくれれば嬉しいなと考えています。


2009/07/27 shrkw テスト
2009/06/18 atsushifx そふとうぇあ開発の世界ではxxテストという言葉をあらかじめ定義して使わないといけないということ ソフトウェア開発 用語 テスト 品質管理
2009/06/18 IwamotoTakashi testing
2009/05/16 advblog テスト
2009/05/05 travelershouse これ、TDDの教材作るときに悩んだなぁ。 test
2009/04/24 takamR1 ずっと引っかかってたのがすっきりした。TDDでは、ただ単体テストツールと呼ばれるものを使ってるだけで、テストのレベルは関係ないんだ。 TDD テスト
2009/04/20 tmge017 TEST reading
2009/04/17 Yamashiro0217 TDD test
2009/04/16 masakielastic2 testing
2009/04/16 avoidnotes development
2009/04/15 s-kic 開発
2009/04/15 yamanetoshi TDD
2009/04/15 Nagise テストに限らず用語の混乱はあちこちに見られる。日本だとメーカー系のグループではそれぞれ独自に用語を定義していたりしてプロジェクトを飛び回るフリーのエンジニアの頭を混乱させるのだ
2009/04/15 kiyosick testing TDD
2009/04/15 t-wada 様々な視点(開発者テストの視点、品質保証の側面)からのテストの命名や分類の混乱とその整理。両者の溝と架け橋。「テスト」という言葉にまつわる混乱と誤解を解いて、議論を先に進めるために。 testing TDD terminology