TestLink

2009/12/11

TestLinkを受入テストで運用する方法

以前のhokorobiさんの記事にあったTestLinkの使い方の意味がようやく分かったのでメモ。
僕が勘違いしていた部分もあったので、再考してみる。

【元ネタ】
TestLink を使ってみた - hokorobiの日記

テスト手法の概念をTestLinkで説明する: プログラマの思索

第5回 脱Excel! TestLinkでアジャイルにテストをする - hokorobiの日記


TestLinkの運用方法は、開発チームがシステムテストで使う場合と発注者が納品モジュールを受入テストで使う場合で、観点が異なるようだ。

【1】開発チームがシステムテストで使う状況では、テスト計画をイテレーションと同一視して、Agileに開発するのがいいと思う。
理由は、スコープを狭めて徹底的にテストでバグを潰し、リリースできる範囲を少しずつ広げる手法の方が、システムの品質を確保しやすいからだ。
バグが残っているのに、新規機能をどんどん開発しても、開発チームはどんどん混乱するだけ。

この状況では、複数個のテスト計画をイテレーション単位を作り、テスト計画とビルド(テスト実施結果)は1対1の運用になる。
つまり、数百に絞ったテストケースをテスト計画にアサインし、ビルドは、テスト完了直後にビルドモジュールの最終バージョンでリネームする運用方法。
すると、バグ1個の発見と検証の作業履歴は、同一ビルドで運用する。

僕が運用している方法は、このやり方であり、まずは全てのテストケースを最低限1回はテストするのを最優先する。
そうでなければ、数千のテストケースを数ヶ月以内に終わらせることはできないし、バグが出るほどバグ修正と検証の連携作業が混乱してしまい、最悪の場合は、全テストケースすらテストできないだろう。

【2】しかし、発注者の観点では、SIが納品したモジュールを発注者が作った受入テストケースでテスト管理したい。
この状況では、テスト計画は受入テスト1個だけで、ビルドは納品モジュール単位に管理したいはず。
つまり、テスト計画とビルドは1対Nの関係になる。

状況としては、SIから届く納品モジュールでテストできるバグの履歴をビルドで別管理しておきたい。
理由は、どの納品モジュールで確実にバグが修正されたか、区別したいからだ。
すると、バグ1個の発見と検証の作業履歴は、異なるビルドで管理して運用するため、ビルドは納品モジュールのビルド番号でリネームしてテストを開始するだろう。

第5回 脱Excel! TestLinkでアジャイルにテストをする - hokorobiの日記で紹介されたhokorobiさんのテスト手法はこのやり方に相当する。

TestLinkのVer1.8のテスト実行画面では「以前のすべてのビルドにおける結果」というフィルターがあるので、過去のビルドで失敗したテストケースをフィルタリングして、そのテストケースだけテストに専念すればいい。
つまり、最新版の納品モジュールでは、過去直近の納品モジュールでバグが出たテストケースを最優先にテストすればいい。

しかし、hokorobiさんの指摘通り、上記のやり方では、我々が想定しているテストケースが「以前のすべてのビルドにおける結果」でフィルタリングできないバグ(?)っぽい現象がある。

本来ならば、TestLinkには、過去直近のビルドの情報を最新版のビルドへ複製する機能があるべきだ。
その機能があれば、最新版のビルドで、テスターは「成功」以外のテストケースを順次テストしていけばよい。

TestLinkはまだまだ使いづらいけれど、テスト管理を改善してくれるポテンシャルがある。

| | コメント (0) | トラックバック (0)

2009/12/06

特徴(Feature)、粗筋(Story)、脚本(Scenario)とチケットの関係

ユースケースとストーリーカードの関係、特徴(Feature)、粗筋(Story)、脚本(Scenario)とチケットの関係についてメモ。

【1】「システム要求、システム要件をどのように書くか?」はどのSW開発手法でもバラバラ。
オブジェクト指向分析(OOA)なら、ユースケース記述書のフォーマットに従って、システム要件や要求、フローを書いて、そこからモデリングしていく。

ユースケース記述書の書き方で一番優れていると思うのは、コーバーン著の「ユースケース実践ガイド―効果的なユースケースの書き方」。
ユースケースの書き方、観点のノウハウが詰まっている。
特に、ユースケースの観点を、アイコン(雲・凧・海水面・魚・貝)で表示して区別するのを推奨しているのは要注意。

ユースケース記述書のサンプルは下記を参考。

ユースケースについて

システムユースケース記述 [C02あんしん電話(高齢者] ユースケース ...

ユースケース番号:
ユースケース名:動詞句で記述する
主アクター:
従アクター:
事前条件:
成功時保証:
トリガー:
主シナリオ(メインフロー):
拡張シナリオ(代替フロー):
備考:

とはいえ、ユースケース記述書を最初からきちんと書ききるのは非常に難しい。

例えば、非機能要件を明示的に書く欄がないため漏れやすい。
又、代替フローの定義から大きな要件漏れが発生しやすい。
あるいは、ユースケース記述をIF文できちんと書こうとして、どんどん複雑化し、要件ではなくフローチャートを描いているに過ぎない場合もよく見受けられる。

【2】XPならストーリーカードに要件を書いて、タスクカードに作業を書く。
重要なことは、ストーリーは顧客が分かる観点で書くこと。
ストーリーカードは顧客が優先順位付けしたり、操作する重要なカードだから。

ストーリーカードのフォーマットは、下記が分かりやすい。

Article 626 at 00/07/17 16:48:01 From: hiranabe Subject: [XP-jp:00626] Virtual XP ストーリカード (1)

顧客ストーリカード
────────────────────────────────
番号 : 1
────────────────────────────────
日付 : 2000/7/17
────────────────────────────────
アクティビティ種別 : ■新規 □ 修正 □ 拡張
────────────────────────────────
優先度 : ユーザ 技術
────────────────────────────────
リスク:
────────────────────────────────
技術見積り:
────────────────────────────────
記述:
メーリングリスト(以下ML)のユーザが,ML のアドレスにメールを
送信すると,ML に所属するメンバ全員に,そのメールが配信され
る.配信されるメールの Subject は,[ML名:23] のような文字が
先頭に付加される(XP-jp のような仕様).ただし,そのメールに返
信した場合,[ML名:xxx]という文字は重複しないような配慮がなさ
れる.ML に属するメンバは,members というファイルに1行1名で
記述されている.メンバ以外から来たメールは,エラーとして差出
人に返す.
────────────────────────────────
備考:
後のストーリにて,メンバの追加,削除をメールにて行う方法が記
述されることを考慮にいれよ.また,特定のML のみをサポートす
るのではなく,設定によって ML 名,ML アドレス等は変更できること.
────────────────────────────────
タスク記録:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
日付 状態 ToDo コメント
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

上記のフォーマットは分かりやすいとはいえ、ユースケース記述書に比べると曖昧な部分が多く、要件漏れが発生しやすくなるかもしれない。

【3】Scrumのプロダクトバックログについて、下記の優れた解説記事がある。

特徴(Feature)、粗筋(Story)、脚本(Scenario) - masayangの日記(ピスト通勤他

[Agile]プロダクトバックログについて海外の例も踏まえ考えたこと | Ryuzee.com

以下、まとめてみる。

特徴(Feature)、粗筋(Story)、脚本(Scenario)を意識して区別することを推奨している。

特徴(Feature)は、顧客から見たシステムの特徴。
粗筋(Story)は、その特徴(Feature)を利用者が具体的に体験する過程を記述したもの。
脚本(Scenario)は、粗筋(Story)をより具体的に記述したもの。

Feature(特徴):カンファレンス運営原価管理

粗筋(Story):カンファレンス目標人数までの到達度を測定する
* (As a)カンファレンス主催者として
* (I want)カンファレンス申込状況の報告書を見たい
* (So that I can)これにより、申込目標人数までの到達度を知ることができる。

脚本(Scenario): 一人の登録が1%進捗と表示される場合
* (Given: 前提) 200人が目標人数の場合
* (When: 操作) 一人が申込登録すると
* (Then: 結果) 1%進捗と表示される

Feature(特徴)はシステムの機能。

粗筋(Story)は、XPならストーリーカード、Scrumならプロダクトバックログに相当し、これを見積もりや計画ゲームに使う。
上記の例の構造は下記と対応付ければ、非常に分かりやすい。
(As a)は主アクター。
(I want)は目的または要求。
(So that I can)はサービス、ユースケース名、又はユースケース概要。

脚本(Scenario)は、受入テストの根拠、つまり受入テストケース。
Given=受入テストケースの事前条件、When=受入テストケースのテスト手順、Then=受入テストケースの期待値のように対応付けることもできる。

上記をユースケース記述書の事前条件・ステップ・事後条件に該当できるように見えるが、そうするとユースケース数が受入テストケース数とほぼ同値になってしまって爆発してしまう。
脚本(Scenario)は受入テストケースとほぼ同値とみなし、ユースケース記述はもう一段抽象化した方が良いように思う。

上記がユースケース記述書やストーリーカードよりも優れていると思う点は、要求(変更理由)と要件(変更内容)を粗筋(Story)と脚本(Scenario)で区別していることだ。
特に、何故システムのこの機能が必要なのか、その目的や要求を表現する項目がある点に着目したい。
結局、目的や要求が曖昧な場合、何を実現すればいいのか、何度要件定義をやっても決まらないから。

【4】特徴(Feature)、粗筋(Story)、脚本(Scenario)をRedmineによるチケット駆動開発では、どのように表現できるか?

Feature(特徴)は、Redmineならチケットの属性である「カテゴリ」に相当するだろう。
カテゴリはシステムの機能であり、カテゴリ単位にチケットを分類しているからだ。

粗筋(Story)は、チケットのトラッカー(種類)を「ストーリーカード」で登録すればいい。
このストーリーカードを作業単位にチケットへ分割すれば、「タスクカード」になる。
ストーリーカードに見積もり工数・実績工数・作業期間も記入すれば、TiDD上で進捗管理できる。

脚本(Scenario)は、TestLinkの「受入テストケース」に相当するだろう。
この時、粗筋(Story)をTestLinkの「受入テストの要件」として登録すれば、要件管理ができるし、テストカバレッジや要件カバレッジをリアルタイムに出力できる。
つまり、ストーリーカード(粗筋(Story))を経由して、RedmineとTestLinkを紐付けることができるはず。

色々試してみたい。

| | コメント (0) | トラックバック (0)

2009/11/30

TiDDを実践して気づいたことpart4~TestLinkによるテスト戦略

チケット駆動開発にTestLinkを導入してテスト管理してみて、テスト戦略みたいなものをぼんやりと感じた。
以下メモ書き。

【元ネタ】
脱Excel! TestLinkでアジャイルにテストをする 4頁目- @IT自分戦略研究所

テスト手法の概念をTestLinkで説明する: プログラマの思索

TestLinkを運用して気付いたことpart8~みなしバグ、ブロッキングバグ、周辺テスト、そしてクリティカルパス: プログラマの思索

TestLinkを運用して気付いたことpart9~後追いテスト: プログラマの思索

TestLinkを運用して気付いたことpart4~TestLinkの概念を再考: プログラマの思索

TestLinkを運用して気付いたことpart5~TestLinkのテストケースの概念: プログラマの思索

TestLink・BTS・SVN・Hudsonの関連構造: プログラマの思索

【1】Redmineによるチケット駆動開発はとてもアジャイルに開発できるけれど、システムテストや受入テストの進捗管理はやりにくかった。
テスト工程の進捗管理は、テストケースの実施数・成功数・失敗数の予定・実績を比較することにあるけれど、Redmineチケットはテストケースと一致しないからだ。
だから、TestLinkを導入して一番良かったのは、テスト結果集計画面で、リアルタイムにテストの進捗を見れるようになった事であり、それから早期に是正対策を取るのが可能になった。

TestLinkがExcelなどの他のテスト管理ツールよりも良い点の一つは、Redmine・Trac・Mantisなどの既存のBTSと連携する機能がある事だ。
この機能によって、テストケースに失敗した場合、BTSチケットにバグの内容を書き込んで、バグ修正とバグ検証をペアプロのように作業できるようになる。

SW開発で最も難しい局面は、結合テスト(Integration Test)・システムテスト(System Test)・受入テスト(User Acceptance Test)などの各テスト工程で頻発するバグをいかに直していくか、にある。
バグ修正&検証フローは実はとても複雑なワークフローであるからだ。

脱Excel! TestLinkでアジャイルにテストをする 4頁目- @IT自分戦略研究所の「図4-4-4 TestLinkのバグ検証とRedmineのバグ修正の連携フロー 」に書いたように、バグは修正して終わりではなく、バグ修正内容を検証して、更に失敗したテストケースが成功した所までの作業を含む。
そして、この作業は、バグを発見し検証するテスター、バグを修正する開発者、リリース作業を行うライブラリアン、そして全てのプロセスを監視するプロジェクトリーダーの4人が関わるので、そのやり取りだけで忙殺されやすい。

従来は、この作業内容をExcelの障害報告書に記載して、紙ベースで管理し、各担当者が判子欄にサインして承認するというフローをやっていた。
だから、バグが1日10件も出るととても煩雑になり、バグ管理だけでプロジェクトリーダーが忙殺される時も多かった。

TestLink+Redmineの良い点は、この作業をチケット駆動開発と言うプロセス上で、バグ修正&検証のワークフローを明示した点にある。
更に、脱Excel! TestLinkでアジャイルにテストをする 4頁目- @IT自分戦略研究所の「図4-4-5 バグ修正に対するRedmineチケットの状態遷移図 」に書いたように、Redmineのデフォルトのワークフローではバグ検証の作業管理がやりにくいので、更にカスタマイズした。

これが本来のバグ修正なのだ、と気付いた瞬間が、TestLinkによるテスト戦略を感じた時の一つ。

【2】TestLinkのテストケースのステータスには「成功」「失敗」「未実施」以外に「ブロック」がある。
「ブロック」は事前条件を満足できないためテスト不能な状態を表す。
このブロックを初めて使いこなせて、テストにはバグ検証の限界があるのだと気付いた時が、TestLinkによるテスト戦略を感じた2番目の瞬間。

実際にテストしてみると、1個のテストケースが失敗すると、1個のバグが出て、後続のテストケースは全てブロックになる。
更に、バグに依存する機能のテストケースは、全て「みなしバグ」になり「失敗」になる。
また、バグの原因を追求すると、類似バグが出てくる為、更にバグが増えてくる。

ブロックやみなしバグの発生源は、ブロッキングバグと言われる。
まさに、テストどころか開発そのものをブロックしてしまう危険バグを指す。
テスト工程では、ブロッキングバグをいかに早く的確に潰すか、が鍵を握る。

実際は、1個のテストケースの失敗の影響はとても大きく、最低10個のテストケースが「失敗」又は「ブロック」になる時が多い。
つまり、「みなしバグ」や「ブロック」のテストケースはテストしても無意味なのだ。
以前は、「みなしバグ」や「ブロック」の発想がなく、とにかくテストしまくるものの、バグが出た為に再テストするテストケースが多発して、うまく制御できなかった。
だから、無駄にテスト工数を浪費して、肝心のバグ修正がおろそかになる場合も多かった。

そんな経験を経て、イテレーション単位にTestLinkのテスト計画を実施しながら、常にテストの失敗率に注目するようになった。
理由は、テストケースの失敗率がある上限を超えると、殆どのテストケースがブロック又はみなしバグで失敗の状態になってしまい、もはやテストしても無意味になる状態があるからだ。
僕の経験では、失敗率が10%を超えるともはやテストしても無意味で、ブロッキングバグを修正するよりも、最初から単体テストをやり直す方が早いように感じてしまう。

【3】TestLinkのテスト結果はビルドという概念で管理される。
ビルドはビルド番号を指すと教えてもらった時、ビルドでイテレーションを管理すればいいのだ、と気付いた瞬間が、TestLinkによるテスト戦略を感じた3番目の瞬間。

ビルドの利点は、同じテストケースを回帰テストで管理しやすくなる事。
また、ビルドのテストケースが全て完了したら、ビルド番号を振り直せば、ビルドモジュールの履歴に書かれたチケットNoからバグチケットを探す事ができる。

アジャイル開発にTestLinkを組み込む場合は、TestLinkのテスト計画をイテレーションと見なして、反復型テストを行えばいい。
すると、テストケースを作ってテスト計画を立てた時点で、テスト期間が短すぎたり、テスターや開発者が少なすぎたり、テストケースがそもそも多すぎる場合、実は納期までにテストが終わらない事実が判明する時がある。
原因は、テストと言うスコープを制御できていないのだ。

2~4週間のイテレーションにテスト計画を押し込めるには、2種類の戦略がある。
一つは、イテレーション内で開発とテストの両方を行い、テスト完了後にリリースするインクリメンタル型開発。
もう一つは、開発のイテレーションが完了後、せいぜい数百の単位でテストケースを分割したイテレーションを順次テストしていく反復型テスト。

普通のシステム開発では数千~数万のテストケースに膨れ上がる為、おそらく反復型テストが基本戦略になるだろう。
イテレーションとテスト計画を同一視することで、テストのスコープを制御しやすくしているのだ。

更に、後追いテストや五月雨式テストというテスト戦略も出てくる。
後追いテストは、テスト完了後からリリース直前までに優先度が低いテストケースや未実施のテストケースを後を応用に実施する事。
五月雨式テストは、仕様追加が頻繁な場合、仕様が決まって開発が終了次第、すぐにテストして、五月雨式に開発&テストしていく事。

後追いテストも五月雨式テストも、十分すぎる品質よりもスケジュールを重視する昨今のビジネスを反映していると言える。
ほどほどの品質をまずは確保した後で、リリースを優先し、品質を作りこむテスト戦略。

プロジェクトリーダーは、インクリメンタル型開発・反復型テスト・後追いテスト・五月雨式テスト等のテスト戦略を意識的に使い分ければ、SW開発で最も難しいテスト工程をコントロールしやすくなるだろう。

| | コメント (0) | トラックバック (0)

2009/11/29

TiDDを実践して気付いたことpart3~繰り返し開発の戦略

Redmineでチケット駆動開発を実践して改めて、アジャイル開発は繰り返し開発であると認識した。
Redmine、Trac、Mantisでチケット駆動開発を経験してみて、繰り返し開発の戦略やコツがあるのがぼんやりと分かってきた。
ロジカルに言い尽くせないけれど、以下メモ書き。

【元ネタ】
変更要求に対する選択肢: プログラマの思索

Subversionコードラインのライフサイクル: プログラマの思索

チケット単位に並行開発する事例: プログラマの思索

裏プロセスは並行プロセス: プログラマの思索

チケット駆動開発のモチーフ: プログラマの思索

チケット駆動開発のFAQ: プログラマの思索

【再考】TiDDのプラクティス集: プログラマの思索

ツールが開発プロセスを改善する: プログラマの思索

TiDDを実践して気づいたことpart2~これがアジャイルだ!と気付いた瞬間: プログラマの思索

【1】チケット駆動開発では、タスクを全てチケットに書き起こし、それらチケットをリリース計画に基づいて各バージョンへアサインし、順次リリースしていく。
つまり、XPの小規模リリースとは、2~4週間という短期間でリリースを繰り返す繰り返し開発である。

繰り返し開発(スパイラルモデル)には、インクリメンタル型と反復型の2種類があるのは既に知られている。
インクリメンタル型は、各繰り返し(イテレーション)でどの機能を実現するかを決め、それを1回の繰り返しでリリースする。
反復型は、各繰り返し(イテレーション)でシステム全体の機能を少しずつ作っていき、何度も繰り返して完成させる。

RUPが反復型開発であるのに対し、XPやScrumのようなアジャイル開発は、基本はインクリメンタル型開発だ。
顧客価値を重視する開発スタイルだから、顧客へ早めにリリースすることを優先する。
つまり、XPの小規模リリースとは、小刻みに機能拡張しながらリリースしていくインクリメンタル型開発スタイルを指している。

インクリメンタル型開発の利点は、機能というスコープが小さいのでスコープを制御しやすい点にある。
リリースが最終ゴールだから、スコープが揺れていてはリリースできないからだ。

逆に反復型開発は、スコープを制御しづらい弱点があるように思う。
例えば、工程ごとの繰り返し開発の途中で、度重なる仕様変更を取り込んでしまい、スコープを制御できずに破綻してしまう時は多くないだろうか?

しかし、反復型開発では、システム全体の機能を何度も繰り返しながら作り上げるため、スコープさえ制御できていれば、品質を向上させるために使える。

【2】Redmineでチケット駆動開発を実践すると、自然にインクリメンタル型開発になったけれど、それだけでは品質には不安があった。
だから、TestLinkを導入して、システムテストや受入テストの工程を別のイテレーションで実施し、色んな観点のテストやバグ修正を行って、品質向上を図った。
すると、このイテレーションは、反復型開発に似ているのに気付いた。

つまり、リリースできる品質まで持ってきたが、更なる検証で品質を向上させたい場合、インクリメンタル型開発から反復型開発にチェンジして、複数回のイテレーションでテストを実施する手法だ。
これによって、TestLinkのテスト計画をRedmineのバージョンに見立てて順次テストしていく反復型開発がやりやすくなった。

【3】反復型開発を使う場面は他にもある。
特に、複数のサブチームによる大規模開発、ソフトウェア開発チームとハードウェアチームが連携する組み込み製品開発などが相当するだろう。

例えば、組み込み製品開発では、SWチームは、HWチームから提供されるハードウェアを元に、HWチームの開発サイクルよりも短いイテレーションで順次開発してみる。
理由は、早めにハードウェアとソフトウェアを結合して動作させながら確認したいからだ。

すると、この場合、HWチームの1イテレーションに対し、SWチームは複数のイテレーションをこなしていることになる。
つまり、イテレーションの入れ子構造で反復型開発を行っている。

反復型開発のもう一つの利点は、イテレーションの入れ子構造によって、開発のスケールアップがやりやすい点もあるだろう。

【4】インクリメンタル型開発が難しい理由は、並行開発になってしまう点にあると思う。

例えば、イテレーションで実装した機能をリリースしたら、そのシステムは顧客の前で動き続けるが、裏では開発チームが次のイテレーションの機能を実装し始める。
そして、次のイテレーションの機能をリリースしたら、前のイテレーションのシステムは廃止して、裏で次の次のイテレーションの開発を始める。
つまり、自然に、本番運用と新規開発の2種類のコードラインを常時保守せざるをえないのだ。

但し、並行開発に対する一つの回答は、メインラインモデルという構成管理手法で既に知られている。
つまり、trunkというメインラインからリリースする時は、ブランチを派生させ、常にtrunkが最新の安定した機能となるようにコードラインを保守する手法。

メインラインモデルの手法は、いくつかのバリエーションがある。
おそらく最もよく使われる手法はタスクブランチだ。
例えば、現在、Ver3.0へ向けて開発中で、その次のリリース予定のバージョンは4.0である時に、突然の仕様追加に対応しなくてはならなくなった場合、Ver3.1のタスクブランチを定めて、Ver3.0→Ver3.1→Ver4.0の順にリリースしていくという開発スタイル。
このタスクブランチの手法によって、品質を維持しながら、納期とスコープ、工数のバランスを取ることができる。

チケット駆動開発では分散バージョン管理を使って、更にトピックブランチという開発スタイルも選択できる。
つまり、チケットごとにトピックブランチをローカルに作って開発し、最後にtrunkへプッシュする開発スタイル。
これはタスクブランチを各チケットへ更に分化した場合に相当する。
GitやMercurialを使っていれば、おそらくスムーズに運用できるだろう。


チケット駆動開発による小規模リリースは、インクリメンタル型でも反復型でもどちらの繰り返し開発も運用可能だ。
繰り返し開発では、インクリメンタル型と反復型を故意に使い分ける戦略が重要ではないだろうか?
また、アジャイル開発が難しい理由は、インクリメンタル型と反復型を使い分けるノウハウがなかなか見当たらず、実践しにくい点にあるのではないだろうか?

| | コメント (0) | トラックバック (0)

2009/11/28

開発に30分、テストに10万年

センセーショナル(?)な記事があったのでメモ。

【元ネタ】
開発するのに30分、テストするのに10万年 - @IT MONOist

わずか30分以内に書けるプログラムでも、全パス網羅のテストは単純計算で10万年かかるという。
更に、仕様漏れ、要件漏れを検出しなくてはならないから、テスト工数はもっとかかる。

SW開発が難しい理由の一つは、実装したプログラムの信頼性を保証する工数が天文学的数字のため、不十分な品質と割り切るしかないこともあるのだろう。

| | コメント (0) | トラックバック (0)

2009/11/13

要件管理が必要な理由

要件管理が必要な理由についてメモ書き。
#後でまとめる。

要件管理の機能で最も重要と思われる成果物は、要件と機能のトレーサビリティマトリクス(TM)だ。
イメージは、下記の記事の図3 トレーサビリティマトリクス(追跡可能性マトリクス)に相当する。

@IT:みんなが悩む要求管理(8)要求管理ツールの賢い使い方

イメージとしては、上位要件を行、下位要件を列にしたマトリクスを作り、上位要件に紐づく下位要件がある場合、そのセルに印を付ける。
このマトリクスがトレーサビリティマトリクス(TM:追跡可能マトリクス)であり、このTMがあれば、要件に変更が生じた場合、下位要件、更にはそれに紐づくテストケースの影響範囲が一目瞭然になる。
上記の図にある「サスペクトリンク」は、そういう機能だ。

実際の開発では、要求仕様と基本仕様、基本仕様と機能仕様のように、隣り合う要件ドキュメント(フェースタイプテーブTblのフェーズ)でトレーサビリティマトリクスを作ればいいだろう。

清水吉男さんが提唱する派生開発プロセスXDDPでは、トレーサビリティマトリクス(TM)が成果物の一つであり、TMで変更要求と機能が交差した箇所で修正が必要な場合、変更設計書が作られる。
ここで、変更設計書は、実際のソースの修正手順まで含んだドキュメント。

XDDPでは、TMによって変更箇所を洗い出し、更に変更手順まで設計プロセスで作成するというプロセスを含んでいるのが秀逸。
つまり、派生開発という仕様変更を要件から開発・テストまできちんと追跡するプロセスがあるのだ。

要件管理では、要件漏れ・テスト漏れがないかという要件カバレッジ、つまりMECEの観点が一番大事だ。
要件カバレッジがあるからこそ、要件からソースコードやテストケースまでのトレーサビリティが実現される。
逆に、バグが発生した場合、バグの影響範囲を要件カバレッジによって即座に見極められるので、ブロッキングバグの修正・検証工数も最終的には計算できる。

つまり、両方向のトレーサビリティツリー機能によって、ブロッキングバグに影響する要件、更にはそれに紐づくテストケースや機能が分かり、最終的には、ブロッキングバグの修正・検証工数も計算でるはず。
この手法はブロッキングバグの影響調査だけでなく、仕様変更による影響調査にも使えるので、精度の高い変更管理が可能になる。

即ち、要件管理を仕様変更に伴う影響調査として使い、設計工程の品質Upやリスク管理に応用したいのだ。

そして、その機能は、手作業ではなく、ツールでサポートすべきであると思う。
何故なら、要件が数百、テストケースが数千もある場合、もはや手作業でカバーできないからだ。
これが、TestLinkの要件管理機能は現在は不十分でも、すごく潜在性を感じる理由でもある。

| | コメント (0) | トラックバック (0)

2009/11/01

マネジメントのスピードが開発のスピードに直結する

倉貫さん(XPJUG代表)の記事を読んで、システム開発に関する洞察が優れている点についてメモ。

【元ネタ】
アジャイル開発のボトルネック - Social Change!

(中略)
つまり、発注側のかけるコスト(工数)の限界が、ソフトウェア開発における速度の限界点なのだ。プロジェクトが成功するかどうかの分水嶺と言える。
これは実はアジャイル開発に限らず、一般的なウォーターフォールのソフトウェア開発でも、まとめて要件定義や検収テストをしているだけで、結局、同じくらいの工数がかかっていたのではないだろうか。もちろん、要件定義の前のビジネスや業務検討のフェーズを含めれば、である。
アジャイル開発では発注側が行う作業へのコミットが細分化されて見えるので、開発と同程度の工数が必要だという傾向が顕著に見えるだけかもしれない。発注側と開発側にかかる工数比があるように思わせたのは、そうしないと儲からないSIerの罪であろう。
『ソフトウエア開発においては、開発側が必要とする工数と、発注側が必要する工数を同等にするべきである』こんな法則があるのではないだろうか。そして、『発注側は、自社がかけれる工数(コスト)以上の、発注をしてはいけない』というルールでもあれば、うまくいくのではないだろうか。
(後略)

上記の指摘は、昨今のシステム開発の現状において非常に的を得ていると考える。

僕は、Redmineによるチケット駆動開発を運用して初めて、アジャイル開発はこういう開発スタイルなんだ!と実感した。
即ち、チケット駆動開発では、ロードマップ画面でバージョンをイテレーションに見立てて、小刻みに機能拡張しながらリリースしていく開発スタイルになる。
つまり、XPの小規模リリースを自然に具体化した開発プロセスになる。

すると、チケット駆動開発を運用する開発チームの内部作業はスムーズに進むようになり、顧客と仕様やスケジュールを調整するプロセスがボトルネックになってしまう現象が頻繁に起こるようになった。
例えば、開発チームではこういう仕様で進めるし、無理ならば代替の仕様が選択肢としてありますよ、と顧客に提示するが、そこで決定に時間がかかってしまう。
実際に作ってリリースして、顧客に見せたら、ちょっと違うよと言われる機能があったり、本来の要件が間違っていた事実も判明するが、どんなスケジュールで直していくか、優先順位を顧客が付けれない。
リリーススケジュールを開発側が提示して、返事待ちという状況が多くなる場合がある。

この状況の原因は、開発の速度よりも仕様やリリーススケジュールを決める速度が遅い点にある。

従来ならば、システム開発そのものに工数もコストもかかっていたが、Railsなどの優れたフレームワーク等のおかげでプログラミングの速度が上がってきた。
そして、RedmineやTestLink、チケット駆動開発で開発チーム内部の作業も効率化し、品質も安定するようになってきた。
すると、開発チームで制御できないプロセスがボトルネックになって、開発の速度に制約がかかる。
特に、レビューと言うプロセスでこの症状が顕著に現れる。

XPにはオンサイト顧客というプラクティスがある。
顧客も開発チームに加わり、ストーリーカードの優先順位付け、受入テストなどを行う。
実際の開発では、顧客が開発チームに入るのは難しいので、要件定義を行うSEがその役割を担っている。
倉貫さんはこの手法を「顧客プロキシ」(オンサイト顧客の代理人)と呼んでいた。

ここで、オンサイト顧客(要件定義を行うSE)の重要な役割の一つに、開発チームが作ったシステム仕様をレビューして、品質チェック後、承認するという作業がある。
このレビュープロセス(デザインレビュー)はすぐに完了できるわけではないし、レビュー後にその仕様で実装していくから、レビュープロセスのキューにどんどんタスクが溜まって、開発速度が落ちる現象が頻繁に起きるようになった。
かと言って、レビュープロセスを簡略化したり、無視していいわけではない。
そして、SEの代わりに顧客を連れてきても、状況はおそらく変わらない。

今の僕の経験では、デザインレビューが開発のボトルネックになっている。
つまり、デザインレビューの速度が上がらなければ、開発の速度が現状以上に上がらない。

要求を洗い出す作業と、要件を仕様化する作業は別の能力だと思う。
要求開発やBaBOKのレベルでは、業務の全体最適化(つまりエンタープライズアーキテクチャ)の観点から、システムのあるべき姿を導き出す。
しかし、我々ITエンジニアは、要件をいかにシステムとして実装して稼動させるか、という作業に注力を注ぐ。
それらの作業は大きく異なる。

その作業をつなぐ部分にボトルネックがあるのかもしれない。

| | コメント (2) | トラックバック (0)

2009/10/28

TestLinkCnvMacroメモ

TestLinkCnvMacroの使い方が書かれていたBlogをメモ。

TESTLINKマクロのススメ - 台湾サラリーマン日記

TESTLINK エクセル変換マクロでデシジョンテーブルを取り込む。 - 台湾サラリーマン日記

TestLinkを中国語で使っている例としても興味深い。

| | コメント (0) | トラックバック (0)

2009/10/25

テスト手法の概念をTestLinkで説明する

脱Excel! TestLinkでアジャイルにテストをする - @IT自分戦略研究所で書ききれなかったテスト手法の概念についてメモ。

【元ネタ】
脱Excel! TestLinkでアジャイルにテストをする - @IT自分戦略研究所

TestLinkを運用して気付いたことpart8~みなしバグ、ブロッキングバグ、周辺テスト、そしてクリティカルパス: プログラマの思索

TestLinkを運用して気付いたことpart9~後追いテスト: プログラマの思索


下記の資料にまとめてみた。
ちなみに下記のテスト用語(方言?)はTEF関西のNakaさんから教わった。

【1】ブロック、ブロッキングバグ、みなしバグ、みなしOK、周辺テストの概念

上記1枚目で、Ver2.0のカート削除1のテストケースでテストに「失敗」したとしよう。
その場合、カート削除2のテストは、カート削除1のバグに依存して必ず失敗するから、開発者をびびらせる意味も込めて「失敗」にする。
つまり、カート削除2のテストケースは、みなしバグになる。

更に、カート機能でバグが発生していて注文機能のテストを進められない状況の場合、注文機能のテストケースは全てテスト保留にする。
つまり、注文機能のテストケースはブロックになり、カート機能のバグが解消され次第、テストを再開できる。

又、カート削除1のテストケースからRedmineへバグチケットが発行される。
このバグは、みなしバグやブロックしたテストケースなど数多くのテストケースに影響範囲があるから、ブロッキングバグになる。
つまり、ブロッキングバグはテスト進捗を妨げる重大なバグである。

ブロッキングバグの修正が完了し再検証する場合、テスターには、ブロッキングバグの検証だけでなく周辺の関連機能も回帰テストするように管理者は指示しておく。
理由は、ブロッキングバグの修正で、デグレが起きていないか、他機能への考慮漏れが発生していないか、確認して欲しいからだ。
上記の例では、カート投入機能は既に成功しているが、もう一度最初から、カートへ商品を投入してカートから商品を削除するようにテストする。
これを周辺テストと呼ぶ。

Ver2.0のテストを実施していて、今回の機能改修でソースを修正しなかった機能のテストは、既に運用済みで品質が担保されている場合もありうる。
例えば、Ver2.0で念のために実施する必要があるものの、テスト工数や納期の関係で優先順位が低くテストしなくてもいい場合がある。

これらのテストケースをあらかじめ成功にするが、テストを実施して成功にする状態と区別するために、みなしOKというステータスにする。
但し、みなしOKのテストケースでもしバグが発生したら、結局全てのテストケースを再テストする必要がある。

上記をまとめると、テスト実行後のステータスは、未実施・成功・失敗・ブロック・みなしOKの5種類がある。
更に、テスト結果の検証に時間がかかる場合、検証中というステータスも欲しくなるだろう。
例えば、クレジットカードのシステムでリボ払いの計算結果を検証する時、テスト結果を取得するだけで、検証は後日行う場合があるだろう。
この場合では、テスト担当者とテスト検証者は異なる時が多いだろう。
つまり、ステータスは、未実施・成功・失敗・ブロック・みなしOK・検証中の6種類は最低必要ではなかろうか?

TestLinkでは、ステータスが未実施・成功・失敗・ブロックしかなく、GUI上からステータスを増やせない弱点はある。
しかし、Ver1.8以降では、設定ファイルcustom_config.inc.phpに下記の記述があるので、ステータスを増やせるかもしれない。

// $tlCfg->results['status_code'] = array (
// "failed" => 'f',
// "blocked" => 'b',
// "passed" => 'p',
// "not_run" => 'n',
// "not_available" => 'x',
// "unknown" => 'u',
// "all" => 'a'
// );

【2】後追いテスト、五月雨テストの概念

上記2枚目で、Ver1.0のリリースが目前に迫っている時だとしよう。
携帯のような組込み機器、業務システム、パッケージ製品のリリース直前では、1週間前~1ヶ月前からコードがFreezeされて、開発チームは、インストーラを作成したり、本番環境を構築する等のリリース作業に入る。
リリース確定後、出荷前までの期間で、テスト担当者が、みなしOKにしたテストケースをテストしたり、回帰テストを行うテスト手法を後追いテストと呼ぶ。

後追いテストの目的の一つは、空き時間を使って更なる品質チェックを行うことだ。
普通は、この時期では、製品に重大な支障が発生するようなバグは全て潰されているはずだが、表示がちょっとおかしかったり、UIをもう少し改善できるなど、些細な修正点はテストすればするほど出てくるはずだ。
そのようなプロダクトリスクの低いバグを洗い出し、次のVer1.1へマージしてリリースできるようにする。
但し、後追いテストで重大なバグが見つかった場合は、Ver1.0のリリースを延期することもあるだろう。

Webシステム開発では、リリースした本番ブランチ上のシステムに対して、リリース後に後追いテストで優先順位の低いテストを行う時もあるだろう。

一方、開発して単体テストが完了した機能から順次テストしていくテスト手法を五月雨テストと呼ぶ。
例えば、携帯のテストならば、SNSメール登録が先に開発できて、普通の携帯メール機能は開発中の場合、SNSメール登録を先にテストしてバグ出ししていく。
そのテスト結果を開発チームにフィードバックして、普通の携帯メール機能にも取り込んでいく。

アジャイル開発は基本は五月雨テストだと言える。
つまり、開発できた機能から順次テストしていく開発スタイル。
脱Excel! TestLinkでアジャイルにテストをする - @IT自分戦略研究所で紹介した僕のテスト手法は、五月雨テストと同じだ。

僕がTestLinkを運用した時、テスト計画のテストケースが少ない場合、テスト計画をイテレーションに含めた。
逆に、テスト計画のテストケースが多い場合、開発のイテレーションから分離して、テスト計画を更に分割して、複数のイテレーションで順次テストしていった。
例えば、結合テストPh1・Ph2、システムテストPh1・Ph2・Ph3のようにテスト計画を順次実施していくテスト戦略になる。

僕のやり方とは別に、第5回 脱Excel! TestLinkでアジャイルにテストをする - hokorobiの日記にあるhokorobiさんのテスト手法のように、1個のテスト計画で複数のビルドで管理する方法もある。
これは、Excelのテスト仕様書の管理と同じように、1個のテスト仕様書へ結果を追記していくのと同じやり方だ。

僕もこのやり方を試した時はあったが、アジャイル開発に組み込みにくかった。
理由は、イテレーションと言う概念を当てはめにくいから。
テストで一番嫌なのは、テストすればするほどバグが出て、バグ修正&検証がエンドレスになってしまうこと。
イテレーションがあるからこそ、リリースが定期的にあり、プロセスを改善するタイミングが生まれやすい。

また、ビルドの途中でテストを中断して、次のビルドに移るから、テスト実行結果のステータスが曖昧になりがち。
そもそもブロックを使う必要もない。
ブロックや見なしバグなどが必要な理由は再テスト工数を計算したいからだ。
100件のテストを行う場合、10件失敗すれば、テスト工数は110件も膨れ上がる。
プロジェクト管理の基本はクリティカルパスの管理だから、再テスト工数を見積もるのは非常に重要なのだ。

又、テスターが少なすぎたり、テスト期間が短すぎたり、テストケース数が多すぎると、テスト計画を立てた時点でもはや全てテストできなくなる確率は大きい。
特に、デシジョンテーブルや直交表でテストデータのパターンを作りこむシステムテストでは、テスト網羅の観点からテストケース数が爆発しやすく、その危険は高い。
だから、イテレーションにテスト計画を組み込むことで、テスト工程のマネジメントを管理しやすくするのだ。

【3】とある勉強会で、最近のシステム開発の傾向は品質よりも納期を重視しているようだ、という話があった。

ビジネス的背景としては、3ヵ月後の景気すら誰も分からない状況で、数年もかけてシステム開発するのはリスクが非常に高い。
また、MixiアプリやGoogleのサービスのように、先にリリースした者がマーケットを支配する状況が多くなっているからだ。
だから、最低限の品質は担保した上で、小刻みにリリースしていく開発スタイルが多くなっているように思う。

更に、技術的背景としても、後追いテスト、五月雨テストのようなテスト手法がやりやすくなっている。
例えば、携帯電話やiPodのような組込み機器でも、リリース後にSWアップデート機能でアプリケーションだけでなくROMそのものも更新できるようになった。
Webシステムなら、サーバーにデプロイさえすればいいから、リリースしやすい。

つまり、後追いテスト、五月雨テストのようなテスト手法は昨今のSWテストにマッチしやすい特徴があると思う。


TestLinkはまだまだ機能改善の余地があるけれど、上手に使いこなせれば、テストプロセスの品質向上で大きな威力を発揮できると思う。

| | コメント (0) | トラックバック (0)

2009/10/23

【公開】脱Excel! TestLinkでアジャイルにテストをする - @IT自分戦略研究所

下記の記事を公開した。

脱Excel! TestLinkでアジャイルにテストをする - @IT自分戦略研究所

上記の記事で、TestLinkで経験したこと、考えたこと、理解できたことは全て書いた。
記事のポイントは3つある。

一つ目は、TestLinkをアジャイル開発に組み込むための運用サイクルを工夫したこと。
基本は、TestLinkのテスト計画をイテレーションの一部、あるいは、開発とは別のイテレーションに見立てて、小刻みにテストしながらリリースしていく運用にする。
これによって、テストするほどバグが出て、延々とゴールのないシステムテストから解放される。

二つ目は、TestLinkに合わせたテストケースにすること。
結合テストやシステムテストで実際に使うテストケースを例にあげたので、理解してもらえると思う。
他人の話を聞くと、膨大な既存のテストケースをTestLinkにインポートする方法に苦労しているようなので、参考にして欲しい。

三つ目は、TestLinkとBTS(Redmine)と連携して、バグ修正とバグ検証をワークフロー管理すること。
この手法によって、バグ修正(PG)とバグ検証(テスター)がペアプロのように作業できるので、品質向上に役立つ。
更に、テストに失敗して影響範囲が大きい場合、テストケースをブロックする。
このブロックというステータスについても、詳しく説明した。
ブロッキングバグ、みなしバグという概念によって、再テスト工数が計算でき、最終的にはテストのクリティカルパスを導くことができる。
テストケースのステータスは「成功」「失敗」以外にも色々あることを知って欲しいと思う。

感想があれば是非フィードバックして欲しいです。

| | コメント (0) | トラックバック (0)

より以前の記事一覧