テストアーキテクティングをテーマに登壇

先週、JaSST東海というイベントで「テストを導くためのテストアーキテクチャの組み立て方」と題して登壇させていただきました。

テストを導くためのテストアーキテクチャの組み立て方/cetam - Speaker Deck

内容は、システムテスト/結合テスト/ユニットテスト、あるいは自動テスト/手動テストなど、開発ライフサイクルの全てのテスト活動の戦略立て・方針立てを行うアプローチについてです。

元々、その全体のテストの戦略立てや設計を手掛ける機会が度々あり、アプローチや考え方を明文化できればと考えていました。丁度そのテーマでセッション担当を依頼いただき、登壇に至りました。お声がけいただいた委員の方には深く感謝しています。

内容は、自分が経験してきたことをベースに組み立てました。大きなプロジェクトにてテスト全体を対象とした戦略立てや設計を手掛けると、様々な人たちとすり合わせをして、様々な担当者・有識者と連携・協力しながら、継続的に作り込んでいく必要があります。そうした苦労点に基づいて、連携と継続的洗練をメインテーマにしています。
現在テストアーキテクチャ設計については、テスト観点分析とテストコンテナ設計を中心としたアプローチが日本で主流となっています。それとはフォーカスする部分が少しずれた内容となっていますが、その主流を補強するものとして役に立てればと考えています。

なおDevOps、継続的デリバリ、アジャイルが代表例ですが、様々なテスト活動を連動させたデプロイメントパイプライン、開発プロセスを洗練させ、より高度なアジリティや価値創造を実現する開発アプローチは、需要がどんどん高まっています。今や、それを上手く実現することは、現代的な開発の付帯条件であると考えています。
その実現手段として、アーキテクティングという、設計技術を活用して要求を実行手段に変換するアプローチを活用するのは、有望な選択肢だと考えています。

聴講いただいた方・資料を見ていただいた方の何かしらの助けになれば幸いです。

責務構造ツリー

責務構造ツリー

責務構造ツリーは、活動の責務を分割するためのモデリングツールです。
QAアーキテクティングやテストアーキテクティングで、各QA活動、テスト活動の責務を分析し、詳細化するために使用します。

責務構造ツリーの概要

責務構造ツリーは、責務分割構造をツリーでモデリングするものです。記法にはGSN(Goul Structuring Notation。https://scsc.uk/gsn)を使用します。
GSNの記法ルールの逸脱するものではないため、これは独自のモデリング手法ではなく、GSNの活用例の一種になります。

ただし、GSNの慣習との若干の相違点として、以下の特徴を持ちます。

  • Goalは責務に特化して記述します
  • Solutionは基本省略します

責務構造ツリーは「GSNでテストタイプを分析する - 千里霧中」で記述している、GSNによるテストアーキテクチャの分析で使用していたツールを持ってきたものです。元々の由来として、HAYST法のD-Caseによるテスト戦略立て(http://jasst.jp/symposium/jasst18tohoku/pdf/S1.pdf)から着想を得て具体化しました。

責務構造ツリーは、由来のD-Caseでも代替可能ですし、マインドマップなど他の一般的なツリーモデルでも代替可能です。

責務構造ツリーの例


QAアーキテクティング、テストアーキテクティングでの責務構造ツリーの用途

責務構造ツリーは、抽象度が最上位の戦略立てやアーキテクティングに適用します。例えばテストアーキテクティングの場合では、テストレベルや、抽象度の高いテストタイプの分析・関心事の分離に使用します。
ツリーモデルで表現できない、各責務の連携については、別途プロセスモデルやシナリオ記述などで補完して記述します。

なお、より抽象度の低い、詳細なテストタイプ、テスト観点、テスト条件などの分析では、ツリーモデルで表現できない要素や記述量の課題から、責務構造ツリーではなく、クラス図や無効グラフ、その他表などによる記述の方が適している場合が多いです。

責務構造ツリーの記法・書き方

GSNの記法を使用します。
責務構造ツリーで多用する記法を以下にまとめます。

書き方は単純で、上位の責務→「どう責務分割したか」を記述したStrategy→下位の責務を基本構造に、ツリー構造を構築します。

QAアーキテクチャの事前検証

「QAアーキテクチャが本当に妥当なのか」は、大抵の場合、サービスやプロダクトリリース後の事後評価で判明します。例えば、以下のような指標の評価が、本当にQAアーキテクチャが妥当かの確認に有効になります。

  • ビジネスの成否。例えば、ビジネスのKPIの達成度、SLAの遵守度など
  • 市場への欠陥の流出の程度
  • 市場でのサービス・プロダクトの品質レベル。例えば、MTTF、実際のパフォーマンス計測結果、ユーザアンケート結果
  • QA活動の生産性の結果評価。例えば、実際にかかったコストやリソースが妥当だったかの評価

ただリリース後の事後評価では、QAアーキテクチャの問題を見つけても手遅れの場合が多いです。適切なQAアーキテクチャの実現のためには、開発途中の事前の検証で問題を見つけて問題是正する必要があります。

今回はそのQAアーキテクチャの事前検証手段について扱います。

QAアーキテクチャの検証手段の導出

QAアーキテクチャの検証手段は、QAアーキテクチャの目標に対応して選定されます。例えば「重大な欠陥の流出を防止したい」といった類の目標があれば、欠陥流出リスクについてのシナリオウォークスルーが検証手段として有効になります。
以降にQAアーキテクチャの検証手段を列挙しますが、これらも一律に有効というわけではなく、QAアーキテクチャの目標に応じて取捨選択していく必要があります。

QAアーキテクチャの検証のアプローチ

QAアーキテクチャの検証は、強いて言うならばモデルの検証のアプローチが多くなります。というのも、QAアーキテクチャは複雑で規模の大きいことから、特定のアーキテクチャ観点で観た、QAアーキテクチャのモデルに切り取らないと、レビューや検証が大変になるためです。
このアプローチはより具体的に書くと、目的に応じてQAアーキテクチャ観点を選び、そのアーキテクチャ観点に基づいてQAアーキテクチャモデリングし、そのモデルを検証する、という流れになります(ここでのQAアーキテクチャモデリングまでは、検証活動の一部として実施するのではなく、QAアーキテクチャ設計として行う場合があります)。

QAアーキテクチャの検証手段の例

シナリオウォークスルー

概要

具体的なシナリオにQAアーキテクチャが対応できるかをレビューしていきます。
QAアーキテクチャに限らず、アーキテクチャの検証手段として一般的な手法です。
使用するQAアーキテクチャモデルは、プロセスモデルあるいはパイプラインモデルが都合が良いです。

手順
  1. プロセスモデルやパイプラインモデルでQAアーキテクチャモデリングする
  2. 具体的な品質課題のシナリオを、上記モデルで対応できるかシミュレーションし、QAアーキテクチャを評価する
補足:使用するシナリオの導出について

QAアーキテクチャのシナリオウォークスルーで使用するシナリオは、QAの目標を具体化して導出します。例えば次のように実施します:

  • 品質モデルを使って品質保証の目標設定をしている場合ならば、品質特性の代表的な具体例をシナリオに使用します。例えば「機能Aの資源効率性仕様Xを、どう品質保証するか」「機能Bの移植性の不具合Yを、どのように検出するか」といった品質特性を具体化したシナリオを導出し、そのシナリオをQAアーキテクチャでどう対応するかレビューしていきます。
  • 品質リスクを使って目標設定をしている場合ならば、リスクレベルの高いリスクについて、リスクシナリオを導出し、それを使ってレビューします。

QA活動による品質リスクコントロール評価

概要

「QA活動によるリスクコントロール」に特化した品質リスク分析・評価です。
品質リスクに対し、QAアーキテクチャでどのように対応するか、そしてQAアーキテクチャでの対応後の品質リスクレベルが妥当か、確認していきます。リスク分析の過程では、リスクストーミングなど他の様々なプラクティスを組み合わせて使用します。
使用するQAアーキテクチャモデルは、リスク管理表です。またリスクの識別やリスクコントロールの評価のために、責務構造モデルやパイプラインモデルなどを使用します。

手順
  1. 品質リスクを識別し、評価します
  2. リスクレベルに応じて、品質リスクをQAアーキテクチャレベルでどのように対応するか分析します。
  3. QAアーキテクチャによるリスクコントロール結果が妥当か検証します。

QA活動によるプロジェクトリスクコントロール評価

概要

「QA活動によるリスクコントロール」に特化したプロジェクトリスク分析・評価です。
開発遅延によるテスト工数の削減、不具合の想定以上の多発、不適切なQA作業といった、プロジェクトマネジメント上のリスクにQAアーキテクチャが対応できるか、確認していきます。こちらも品質リスク分析と同様に、リスク分析の過程で様々なプラクティスを組み合わせて使用します。
最適なQAアーキテクチャの理想像は、開発の状況に応じて適応的に変化します。この適応的な変化は、他のアーキテクチャと比べて、QAアーキテクチャが特に強く持つ特徴です。プロジェクトリスク評価によるQAアーキテクチャ検証は、その適応的な変化への対応を検証する代表的な手段であるため重要になります。

手順

品質リスク分析の手順を、プロジェクトリスクに置き換えて実施します。

QAベースマッピング

概要

QAベース(品質保証活動のインプットリソース全般)が、どのQA活動に対応するかマッピングして、QAベースに漏れなく対応できているか確認する手法です。
膨大なドキュメントを扱うプロジェクトにおいて、Vモデルといったプロセスアプローチ・工程完結アプローチで品質保証を行う場合に有効な手法になります。
使用するQAアーキテクチャモデルは、プロセスモデルあるいはパイプラインモデルです。

手順
  1. QAベースを識別します。QAベースをツリーモデルで洗い出すと言ったQAベースモデリングが有効です。QAベースの粒度はドキュメント単位で行いますが、ドキュメントが大きい場合は、さらに内容を細分化して識別します。
  2. 洗い出したQAベースを、どのQA活動で実現保証するかマッピングし、QAベースにもれなく対処できているか確認します。

QAアーキテクチャ比較評価

概要

複数のQAアーキテクチャを比較し、Pros/Cons分析などを実施して、対象のQAアーキテクチャの問題点を検証する方法です。
比較対象には、検討したが採用しなかったアーキテクチャや、類似プロジェクトのアーキテクチャ、リファレンスとなる望ましいアーキテクチャなどを用います。
比較することで明らかになる改善点は少なくありません。また、QAアーキテクチャに限らずアーキテクチャ設計では、トレードオフの関係から選択する設計判断を多数求められますが、トレードオフでの選択が適切かの評価には、比較評価が有効です。
使用するQAアーキテクチャモデルは、比較したいモデル全般となります。トレードオフの設計判断を比較評価する場合は、意思決定マトリクスなどが有効になります。

手順

対象のQAアーキテクチャと、比較対象のQAアーキテクチャを選出し、評価したいモデルごとに、Pros/Cons分析などで良否を評価します。
そこから、QAアーキテクチャの改善点を識別します。

プロトタイピング・反復開発によるQAアーキテクチャの評価

概要

プロトタイピング開発や、反復開発で先行してQAアーキテクチャを実際に運用し、その結果を見て、QAアーキテクチャを検証します。
この手法を用いると、特定のフィーチャといった小さなスコープ限定ですが、QAアーキテクチャを実際に動かして、問題がなかったか結果評価できます。
また(偽陰性の誤りの評価などに大変有効ですが、現実的には人間の心情的に実施が難しい)エラーシーディングによる評価も一応可能になります。
QAアーキテクチャの評価指標の選出には、GQM法などのプラクティスを組み合わせて使用します。

手順
  1. GQM法などでQAアーキテクチャの評価指標(欠陥流出率など)を識別します。
  2. QAアーキテクチャ設計、QA活動を実施し、その結果を前述の指標で評価します。それによってQAアーキテクチャが適切だったか評価を行います。

QAアーキテクチャブリーフィング

概要

QAアーキテクチャに限定されない、アーキテクチャの一般的な評価方法であるアーキテクチャブリーフィングです。
QAアーキテクチャのステークホルダに、QAアーキテクチャについてブリーフィングを行い、疑問点や懸念点、評価を募ります。
なおそこで意見を引き出す方法として、QCC(Question-Comment-Concern)や前述のシナリオウォークスルーといった他のプラクティスと組み合わせることがあります。
繰り返しになりますが最適なQAアーキテクチャの姿は開発の状況に応じて変わるため、ブリーフィングは複数回実施するのが有効です。
使用するアーキテクチャモデルは、説明しやすいプロセスモデルが代表的です。

手順

ステークホルダにQAアーキテクチャについてブリーフィングを行います。
ステークホルダからQAアーキテクチャについて質問、コメント、懸念点などを出してもらい、そこからQAアーキテクチャの問題点を識別します。

プロセス適合性評価

概要

QAポリシー、法規制、QAに関するプロセス監査項目など、QA活動に関する基準・評価項目に基づいてQAアーキテクチャを監査し、QAアーキテクチャがそれらを達成しているか確認します。
評価項目の作成では、GQM法など他のプラクティスを組み合わせます。

手順

QAアーキテクチャの評価項目を作成し、QAアーキテクチャがそれを達成しているかレビューします。

QAペネトレーション評価

概要

「どのようにQAを失敗させるか」という、いわばプロジェクト妨害者の視点で、QAアーキテクチャを破るシナリオを検討し、それに従ってシナリオウォークスルーを行うアーキテクチャ検証方法です。
高信頼性製品の開発など、品質要求が高いプロジェクトで有効な手法になります。
なおQCDが有限である以上、QAアーキテクチャを破るシナリオの識別はやってみると際限がありません。そのため、リスクベースで優先付けしてシナリオを具体化していきます。具体的には、品質リスク(e.g.検出の難しい不具合)、プロジェクトリスク(e.g.QA活動を困難にするプロジェクト状況)を分析し、リスクの高いものについて、ペネトレーションの観点でシナリオを考えて検証に使用します。

手順

  1. 品質リスク、プロジェクトリスクを分析します。
  2. リスクレベルの高いリスクの具体例のうち、QA活動を失敗させるようなシナリオを識別します。
  3. 上記シナリオにQAアーキテクチャが対応できるかシナリオウォークスルーを実施します。

デザインパターンの陳腐化

最近、というより昔からの定番ネタですが、GoFデザインパターンは時代遅れで陳腐化したという話題をSNSで度々見ます。今回はそのパターンの陳腐化について書きます。

GoFデザインパターンの陳腐化

GoFデザインパターンの複数は今も価値があるものの、複数は陳腐化しており、特に一部(≒Singleton)は有害なものになっているという指摘には異論ありません。
GoFが実装例の対象としていたC++に限っても、言語仕様の改善でいくつかのパターンの必要性が低くなりました。また継承の弊害が知られたり、ジェネリクスやムーブセマンティクスの普及が進んだりと、GoF本執筆当時と今では状況が変わっています。

これは言うなれば、時代が変容し、GoFデザインパターンのコンテキストやフォースが、開発の状況と乖離するようになったと言えます。

パターンおよびパターンベースアプローチの陳腐化

一方、「デザインパターンGoFデザインパターン」という誤解に基づいて、デザインパターンそのものが陳腐化したという意見を見ます。あえて言うまでもないことかもしれませんが、これは誤りです。
人間が本能的にパターン認識を使いこなしていることから、使い手が人間である以上、パターンベースのアプローチは普遍的に有効だといえます。それと同じく、パターンベースアプローチの一部であるデザインパターンも普遍的に有効といえます。

重要なのは、問題のコンテキストとフォースに合致したデザインパターンを選択することです。デザインパターンが不適切と感じるならば、それは問題にとってコンテキストやフォースがずれたパターンを適用しようとしているか、使っているパターンリポジトリが対応していない問題を扱っているかの、どちらかになるのがほとんどです。

未来予測の限界によるパターンの陳腐化

GoFのパターンのような実装依存のパターン(GoFのパターンは設計パターンですが、実質的に実装に依存するパターンとなっています)は、開発言語やプログラミングを支える環境に依存しています。そして開発言語や開発環境の変化は目まぐるしいため、コードレベルのパターンが陳腐化するのは基本的に避けられないと言えます。
例えば、GoFIteratorパターンは、集合体の要素を取り出すのに、添字を使ったfor文を使うのが一般的な時代では有効でした。ただ添字やイテレータが隠蔽されたforeach文が普及した今となっては、主要なデザインパターンとして挙げる重要性が失われています。

このように、変化の激しいソフトウェア開発では、未来予測の限界から、将来にわたって通用するパターンを確立するのに限界があります。特に実装に依存するパターンは、定義されたときから陳腐化のリスクが高まると考えて良いかもしれません。

なお、将来の状況変化を見越したコンテキストやフォースの記述(例えばforeach文が普及しているなら適用外など)も同様に限界があり、パターンが自分自身で陳腐化したと判断する基準を提示するのも難しいです。
そのため、デザインパターンを使用したい場合は、使い手に、複数のパターンカタログ/パターン・ランゲージを比較して、そのコンテキストとフォースが対象の問題と適合しているか検討することが求められます。GoFデザインパターンは1995年の開発現場を背景にして見出されたパターン・カタログです。それを使うかは、2021年現在の目の前のコンテキスト・フォースに適合しているか、よく考える必要があります。

ボトムアップのパターン識別アプローチと陳腐化

GoFのパターンような実装依存デザインパターンは、GoF本でパターンを見出したアプローチとして書かれている通り、ボトムアップで識別されることが多いです。うまくいっているコードからデザインパターン(解決策)を見出し、それからその解決策のコンテキストとフォースを明らかにして、パターン記述として完成させるというアプローチです。

このボトムアップのアプローチで見いだされたパターンは、解決策から、解決対象の問題・コンテキスト・フォースを想起したり関連付けたりすることは容易にできます。
ただ、その逆方法、問題・コンテキスト・フォースから、解決策を関連付けするのが、陳腐化により難しくなることが多いです。例えば、問題に対する解決策が増えて、もともとのパターンの解決策がベストの解決策でなくなることがあるためです。

Singletonパターンを例にとると、解決策から「インタンスが唯一であることを保証したい」という問題・課題を読み取ることはできると思います。ただ今となっては、「インタンスが唯一であることを保証したい」という課題に対して、解決策に対してSingletonパターンが必ず挙がるとは言えません。

このように、ボトムアップで作られたパターンや、解決策に要点を置いているパターンは、陳腐化の圧力が強いと言ってよいと思います。

なおトップダウンで見出されたパターン(問題に対し、それに適切な解決策を付与してパターン記述を完成させる)は、ある程度普遍性を確保しやすい問題やコンテキストに依拠してパターン記述を完成させることから、比較的、ボトムアップ・アプローチより陳腐化圧力が少ないと考えられます。

例えばトップダウンで見出されることが多いパターンとして、マネジメントのアンチパターンがあります。これは、失敗、損害といった問題に着目し、その原因・解決策を見出してパターン記述を完成させることが多いです。このアンチパターンの場合、普遍的な問題から始まり、演繹的に解決策を見出していることから、問題→解決策の参照も比較的保ちやすいと考えられます。

QAアーキテクチャの概要

QAアーキテクチャの定義

 まずソフトウェア開発における「アーキテクチャ」は、対象の基本的な概念・構造・特性を、構成、設計判断、設計原則で表現したものを指します。
 例えばシステムのアーキテクチャの場合ですと、ISO/IEC/IEEE 42010ではアーキテクチャという言葉を次のように定義しています。

Architecture:
fundamental concepts or properties of a system in its environment embodied in its elements, relationships, and in the principles of its design and evolution.
(対象の環境におけるシステムの基本的な概念や特性を、システムの要素、関係、設計原則・発展原則として具体化したもの)

 次に本テーマの「QAアーキテクチャ」についてです。
 QAアーキテクチャは、電通大の西康晴さんが先導的に整備している考え方で、「品質をどこでどう確実に作り込んで確実に保証するか」「どんなQA観点を作り込んで保証できているのか」の基本構造・基本方針を設計したものです。

QAアーキテクチャの設計による説明責任の高いテスト・品質保証
Re-collection of embedded software qa in the last decade

 この一連の解説においては、前述の一般的なアーキテクチャの定義も加味し、QA(品質の保証)に特化して、QAアーキテクチャを次のように定義したいと思います。

QAアーキテクチャとは、「品質をどう保証するか」の基本的な概念・特性であり、それを品質保証の原則、基本方針、手段の構成で具体化したものである。

 またこの解説では、上記のQAアーキテクチャを実現し、改善・保守し、検証する活動全体を指す言葉として、QAアーキテクティングという言葉を使用します。

今なぜQAアーキテクティングが重要になるのか

現在の開発スタイルとして、次の2つの重要性が高まっています。

  • 様々なQA活動を高度に連携させ、開発全体で優れたアジリティや価値創造を実現する開発スタイルが求められている
    • 【継続的デリバリ、DevOps】様々なQA活動を包含するデプロイメントパイプラインを洗練させ、開発とビジネスの距離を縮める
    • アジャイル】様々なQA活動を組み合わせ、継続的かつ高速なリリース&フィードバックを実現する
  • 創発的・反復的なQAアプローチが求められている
    • アジャイルイテレーションごとにQA活動を積み重ねつつ、全体の品質保証としての整合性を確保し、プロダクトの品質を継続的に担保する

上記に対応するため、様々なQA活動の総体をアーキテクチャとして扱い、アーキテクティングでその構造やメカニズムを工夫するアプローチが有効となります。

QAアーキテクチャの役割

 QAアーキテクティングの目的は、プロダクトの成功のために必要なQAを実現することです。そのためQAアーキテクチャは以下の役割を担います。

  • 予測。以降のQA活動に大きな影響を与える判断を示し、準備や計画を支える
  • 先導。QAの方針を示し、状況が流動的に変化するソフトウェア開発ライフサイクルのあらゆる局面で、QA活動がどこに進むべきかを先導する。
  • 橋渡し。ビジネス、マネジメント、開発、QAなど様々なステークホルダ・関係者からのQAへの要求・制約の調停を行い、妥当なQAの実現を支える。
  • 協調。複雑・大規模なリスクや問題に対応するために、各QA手段をどう強調させるかを示す。また複雑・大規模な問題を対応可能にするために、具体化・分割する。
  • 全体整合の確保。QAの適切な全体像を構築し、その実現・維持を支える。

コミュニケーションツールとしてのQAアーキテクティング

QA活動は、様々なステークホルダから要求や制約を受け取り、様々な担当者で推進します。そのためQAアーキテクティングは、QA技術を活用した問題解決ツールの側面のほかに、コミュニケーションツールの側面も強く持ちます。具体的には、QAアーキテクティングは次の役割を果たすことが重要になります。

  • 様々なステークホルダからの要求や制約を調停し、ステークホルダが納得するQA活動を実現する
  • 様々なQA活動関係者からの納得を確保し、QA担当者の協力を促しその力を結集する

QAアーキテクチャの表現

 アーキテクチャは様々な特性を備えていることから、一般的に、複数のアーキテクチャ観点で観た、複数の側面でアーキテクチャを表現します。このアーキテクチャ観点は、ステークホルダの関心事や、開発上重要な側面に基づいて選択されます。アーキテクチャ観点の数は少なすぎるとアーキテクチャを十分に表現できず、多すぎると各側面の整合性の確保・維持が大変になるため、重要性に基づいた適切な数の観点を使用します。

 これはQAアーキテクチャも同様です。QAアーキテクチャはその役割上、構造的特性、プロセス的特性など重視すべき特性を持っていることから、それに対応したいくつかのアーキテクチャ観点で表現するのが有効です。

 QAアーキテクチャの表現で有効なアーキテクチャ観点を次に示します:

QAタイプの責務分割の観点

 QAタイプの責務分割を構造モデルで設計・整理する観点です。
 例えば、ツリーモデルでQAタイプを整理するものが該当します。このツリーモデルによる構造観点は次の理由から有益です。

  • QAアーキテクティングでは、複雑・巨大な品質保証を、扱えるサイズに分割するために「関心事の分離」が重要になります。ツリーモデルはこの関心事の分離をわかりやすく表現します。
  • QAアーキテクティングでは、十分なQAの実現のために、多数の様々なQA手段を集めて連携させる必要があります。ツリーモデルは、多数のQA手段の洗い出しや整理を支援します。

QAタイプの構造の観点

 QAタイプの構造をプロセスやデプロイメントパイプラインで設計・表現する観点です。
 QAでは、様々なQA手段を、重ね合わせ、役割分担、横断的連携のパターンで組み合わせて、全体のQAを実現します。プロセスやパイプラインモデルは、それら組み合わせや連携の関係をわかりやすく表現します。
 またQA活動は状況に応じて動的に変化することから、「通常デプロイ時」「Hotfixデプロイ時」などの条件をシナリオとして具体化して、シナリオごとにプロセスやパイプラインがどう変化するか補足表現する必要もあります。 

その他、QAアーキテクチャ要求に基づいた分析観点

 QAアーキテクチャには様々なタイプの要求・制約がインプットされます。QAアーキテクチャの構成要素と構造のほかに、それら要求・制約に基づいた観点で設計・表現を行うことが重要になります。
 特に、QAアーキテクチャの要求のうち、特に影響が重大なアーキテクチャドライバに基づいて、QAアーキテクチャの骨格を構成するのは、アーキテクティング手法として重要なアプローチになります。
 代表的なQAアーキテクチャの要求と、それに対応するQAアーキテクチャ観点を示します。

【要求:課題やリスクをリリース可能なレベルまでコントロールする】→QAタイプによる課題・リスクコントロールの観点で設計

 「課題やリスクをリリース可能なレベルまでコントロールする」というのは表現の程度はありますが、QA活動の一般的な要求になります。
 その要求があった場合、課題、プロジェクトリスク、品質リスクのコントロールに対し、各種QA活動がどう連携するかを設計・表現する観点が有効です。QAでは、目標や課題対応のために様々なQA手段を組み合わせます。その連携を記述する単位として、課題やプロジェクトリスク・品質リスクのコントロールを用いるということです。

【要求:様々なQAベースの実現性を保証する】→各QAベースとQA活動の対応付けの観点で設計

 大規模な開発の場合、多数の成果物タイプを扱うことから、それぞれのドキュメントや成果物がきちんと実現性保証されているかに注意を向ける必要があります。
 そうした要求があった場合、QAベース(QA活動のインプットになる成果物)を、どのQA活動で実現性保証するか関連付け・マッピングする観点が有効になります。

【要求:開発ライフサイクルの中で段階的に成長するQA活動を行う】→スケジュールやタイムラインの観点で設計

 PoC→開発→量産開発など、開発ライフサイクルが明確に区別された開発フェーズで分類される場合、それに応じて段階的にQAアーキテクチャを成長させていく必要があります。
 そうした要求があった場合、スケジュールやタイムライン上で、QAアーキテクチャをどう具体化し、成長させていくか設計する観点が有効になります。

 CEQAAMでは、QAアーキテクチャを、(いくつかの独自の記法を導入したモデル記法で)上記の観点ごとに表現した姿と、各観点の要素の詳細を説明するQAアーキテクチャ管理表を使って表現します。

QAアーキテクチャ群の構造

 QAアーキテクチャは、小さなサブQAアーキテクチャで構成することができます。例えば、QAアーキテクチャを、テストアーキテクチャや監査アーキテクチャ、レビューアーキテクチャに細分化して、それぞれでアーキテクティングを行う場合があります。

開発の特徴に応じたQAアーキテクチャの表現

 QAを複数人で分担する状況や、複数のQA手段を連携させる状況ならば、顕在的か/潜在的か、意図的に構築するか/無意識に生まれるか、の違いはでるものの、QAアーキテクチャは生まれます。
 ただそのQAアーキテクチャをどこまで明示的に表現するか、QAアーキテクティングをどこまで方法論的・形式的に実施するかは、プロジェクトの規模や複雑さ、スタイルに依存します。

 例えば、数百人程度の大規模プロジェクトであったり、難易度の高い品質保証が求められるプロジェクトならば、明示的にQAアーキテクチャを構築・維持する必要性がでてきます。

 一方、少人数のプロジェクトや、リリースごとの品質保証が1、2週間のスプリントで収まるような軽快な開発ならば、QAアーキテクチャが成立したとしても、QAエンジニア判断任せで、QAアーキテクチャを特に明示化しない場面もありえます。

QAアーキテクチャのライフサイクル

 QAアーキテクチャは、開発ライフサイクル全体に渡って構築・維持・保守されます。
 QAアーキテクチャのライフサイクルのフェーズを次に示します。

 QAへの要求は開発が進展しないと出てこないことものもあり、また開発の状況に応じて変化することもあるため、上記フェーズがウォーターフォールに実行されることは稀です。多くの場合で、五月雨式に、反復的に上記フェーズが実行されます。

QAアーキテクティングと連動する活動

 QAアーキテクティングはマネジメント、ビジネス、開発、品質保証を調停することから、それらの様々な関連活動と相互依存関係をとっています。そのため、QAアーキテクティングの活動によって、それら関連活動の推進を促すこともあれば、ときにQAアーキテクタが作業代行する場合もありえます。
 QAアーキテクティングと連動する関連活動の代表例を次に示します。

■QAアーキテクティングと連動するマネジメントの活動

組織設計

 組織構造とQAアーキテクチャは連動しています。そのため組織設計とQAアーキテクティングは相互依存関係にあります。
 具体的には、QAアーキテクティングは、組織設計に対してあるべき組織構造を示します。また組織設計は、QAアーキテクティングに対して、結果としての組織構造を示し、QAアーキテクティングに制約を指定します。
 組織設計はQAアーキテクティングというよりマネジメントのタスクです。ただ上記の関係性から、QAアーキテクティングの活動を通じて、組織設計の推進を促したり、場合によっては代行したりすることが求められます。

開発プロセス設計

 開発プロセス設計もQAアーキテクティングと相互依存関係にあります。
 QAアーキテクティングは、開発プロセス設計に対し、QAプロセスや望ましい開発プロセスを示します。開発プロセス設計は、QAアーキテクティングに対して、結果としての開発プロセスを示し、QAへのインプットやQAのプロセスを指定します。
 そのため、QAアーキテクティングの活動を通じて、開発プロセス設計を促したり、その一部を代行したりする場合があります。

■QAアーキテクティングと連動する開発の活動

QA容易性や試験性(テスタビリティ)の確保

 QAアーキテクチャは、試験性を含むプロダクトのQA容易性に依存します。
 具体的には、QAアーキテクティングは開発に対し、必要なQA容易性・試験性を求めます。開発は、QAアーキテクティングに対し、結果として実現したQA容易性を制約として指定します。
 そのため、QAアーキテクティングの活動では、プロダクトの仕様定義や設計の活動に含まれる、QAに必要なQA容易性の仕様化を手掛けたり、促したりする場合があります。

QAアーキテクチャの設計方針

 QAアーキテクティングの基本方針として、QA活動を先導しながら、QAアーキテクチャの完成像に向けて累積的に・適用的に組み立てていくことになります。例えばアジャイル開発ならば、イテレーションごとに刹那的にQA成果物を使い捨てるのではなく、包括的な品質保証を組み立てつつ、イテレーションごとのQA活動も実施するように、QAアーキテクチャでQA活動を先導していきます。

 具体的なQAアーキテクティングの設計方針を次に示します。

開発全体で構築する

 開発全体の様々なQA手段を総動員してQAアーキテクチャを構築します。
 例えばある欠陥の流出を予防したい場合は、設計・実装で欠陥予防策を実現し、レビューで静的に欠陥を見つけ、テストで動的な欠陥を見つける、というように、様々なアプローチを組み合わせ、全体のQAを実現します。

発展的に構築する

 QAアーキテクチャは反復的、段階的に育て、完成させます。
 QA要求は流動的であり、開発の進展に従って徐々に明らかになっていくことから、QAアーキテクチャはBDUF(Big Design Up Front)で構築できません。最終的に実現すべきQAアーキテクチャが実現されるように、EDUF(Enough Design Up Front:EDUF⁠)で、反復的・段階的に拡張洗練させていきます。

ビジネス・マネジメント・開発・QAをすり合わせ構築する

 QAアーキテクチャはビジネス・マネジメント・開発・QAの橋渡しであり、それぞれの要求・制約を調停し、プロジェクトの成功の点で妥当な品質保証を実現させる役割を持っています。
 そのため、ビジネス・マネジメント・開発・QAと相互に連携しながら、適応的にQAアーキテクティングを推進します。

関心事の分離を推進する

 一般的にQAは大規模・複雑であり、様々なロールが分担して実現します。レビュー手法、テスト手法などを適用し、具体的なQA手段を実装するためには、QAの責務の分割が必要です。その実現のため、QAアーキテクティングは、QAの活動について、関心事の分離を行い、それぞれの具体的なQA活動を行えるようにすることが求められます。

集合知で構築する

 QAアーキテクチャは、様々なステークホルダの調停を行う点、幅広いQA手段を扱う点から、集合知的なアプローチが活用されます。
 そのためにも、QAアーキテクティングの活動にはコミュニケーションに関するプラクティスが多く含まれますし、QAアーキテクチャ自体がコミュニケーションを支える基盤になります。
 また、QA活動への要求や制約をどのように調停したのか、QA要求をQAアーキテクチャにどのようにインスタンス化したのか、といった重要な設計判断をどのような集合知で行ったか記録するのも重要な活動となります。

QAアーキテクチャの評価

以下の記事に分割しました:

QAアーキテクチャの事前検証 - 千里霧中

QAアーキテクティング手法:CEQAAM

【この記事は整備中です。逐次加筆・更新している段階です】

 このエントリでは、QAアーキテクティングの一手法:CEQAAM(シーカーム。Cooperative and Evolutionary QA Architecting Method)を解説するものです。

 CEQAAMは、QAアーキテクティングの原則、アプローチ、グッド・プラクティスを1つの手法としてまとめたものになります。
 CEQAAMは特別に独自性のある手法というわけではなく、また多数のやり方があるQAアーキテクティング手法のうちの一つです。そのためCEQAAMの立ち位置は、固有の手法あるいは最良の手法というより、QAアーキテクティングのスターターキットの一例というべきものです。

コンテンツ

 定義/役割/表現/ライフサイクル/設計原則

  • QAアーキテクティングの進め方

 要求の分析、設計、洗練、検証

  • QAアーキテクティングのツール・プラクティス
  • QAアーキテクティングのサンプル

アジャイルテスティング問答

先日、「人類よ!これがアジャイルテスティングだ!QAテックリードが語るアジャイルQAの実践とは何か? - connpass」というイベントに登壇させていただきました。
インタビュー形式だったので講演資料などは特に残ってないのですが、内容の記録のため公開に差し障りのない問答についてまとめたいと思います。念の為、一般的な定義というより、あくまで自分なりの考えになります。

Q. アジャイル開発におけるQAエンジニアの役割と責任は?

QAエンジニアの定義に幅があるので難しい問いですが、今回はプロダクトの品質を保証する役割の人を、QAエンジニアという前提で話します。

まずアジャイルウォーターフォールなどプロセスを問わない役割として、QAエンジニアは、様々な品質を保証する手段を直接担当したり、支援したりして、総体として品質を保証する仕組みを構築する役割だと考えています。
直接担当の役割としてはQAテスト、ドキュメントレビューなど、支援担当としては開発者テスト支援、プロセス運用支援、スプリントレビュー支援などが該当します。

次にアジャイル特有のQAエンジニアに求められる役割として、次の3点が大きくあると思います。

  • 1つめは、ユーザ観点での妥当な継続的フィードバックの実現です。
    動くプロダクトを作ってフィードバックを得て、より妥当なプロダクトを実現するサイクルを継続的な回せるのがアジャイルの強みです。それを支えていく役割です。
    具体的には、ユーザテストなどユーザからのフィードバックの機会を確保する、POと連携する、QAエンジニア自身がビジネスやプロダクトに詳しくなるといったアプローチで、ユーザ観点で妥当なフィードバックを継続的にチームに返せるようにするのが重要になります。
  • 2つめは、迅速なフィードバックの実現です。
    アジャイルの短期のイテレーションや高頻度な変更に対応するため、品質保証のスピードをアジャイルに合わせる必要があります。その迅速化を実現する役割です。
    その手段としては、自動化を始めとした品質保証の高速化技術を実践する、探索的アプローチで人間の能力主体でアジリティを確保する、といったものがあります。
  • 3つめは、Whole Team(チーム全体、Oneチーム化)として品質を保証する仕組みの実現です。
    ウォーターフォール的に、最終関門として最後に詳細なテストを最後にやるアプローチでは、変更に弱く、アジリティが低すぎて、アジャイルを阻害します。
    その解決として、開発者テスト、QAテスト、自動テスト、レビューなど、様々な品質保証の手段を連携させて、Whole Teamで品質保証していく仕組みづくりが、重要な役割だと考えます。

Q. アジャイルテスティングとは何か?

一般的には、大きく2つの定義があります。

  • 1つ目はジャネットグレゴリーの実践アジャイルテストなどが提唱する、テストそのものがアジャイルの原則に則っているアプローチ。
  • 2つ目は、ISTQBなどが提唱する、アジャイル開発をうまく支えるためのテストのアプローチが、アジャイルテストであると言う定義。TDDや継続的テスティングなどがこれに該当します。

今回は後者の定義で話を進めます。

基本的な方向性は、前述のQAエンジニアの役割を、テストで推進する形になります。様々ある中での一部ですが、具体的には次のような特徴を備えます

  • ユーザ観点の継続的なフィードバックをテストで実現します。
    ユーザテストを導入する、イテレーション内でシステムテストまで一通り行って、テストレベル横断のフィードバックを実現する、ビジネスやユーザに精通してそれらの観点に基づいたテストを実施する、といった特徴があります。
  • 変化を受け入れます。例えば柔軟に変更に対応するため、テストは自動化しますし、テストの保守性やテスタビリティの向上で、変更コストを削減していくアプローチが取られます。

注意として、アジャイルテストはプロセスや方法論と言うより、テストエンジニアのマインドセットやチーム文化、本質的な原則論です。
何かしらの手順通りにやればOKというものではなく、例えば開発者やPOとうまくコミュニケーションをとって、的確なテストを見出そう、みたいな姿勢の話になります。

Q. アジャイルテスティングをどうはじめればよいのか?

繰り返しですが、アジャイルテストはマインドセットやチーム文化、原則論の話になります。そのためその導入は人作り、チーム作りが主なアプローチになります。

その前提の話ですが、最初の方向性として次があると思います。

  • 妥当なフィードバックの実現を目指す。ユーザやPOと連携したり、テストチーム自身もプロダクトやビジネスについて精通したりして、ユーザ観点で妥当なテストを行えるようにチームを鍛えるのが最初の方向性だと思います。
  • アジャイルに合わせたアジリティの実現を目指す。最初は、手動テストから自動テストへの注力の転換、スクリプトテストから探索的テストへのアプローチの転換が取り組みやすいと思います。そこでは自動テストでリグレッションテストを実施しつつ、探索的テストで追加変更分をテストするスタイルを目指します。

上記の本質的な実現には、プロセスや手順の強化ではなくて、チームと人の強化に注力する必要があります。

Q. アジャイルテスト実現のためにテストのアジリティを高めるために何が必要か?

一言でいうと、人と開発技術とテスト設計の3つを鍛えていく必要があると思います。

人の強化

スピード重視のテストでは、探索的テストのアプローチが重要になります。一般的にも、アジャイルテストは探索的アプローチを取り入れたユーザストーリテストが定番の手段になります。
もちろんスクリプトテストが不可欠であるのは変わりないですが、伝統的なスクリプトテストは遅く、変化への妨げになります。スクリプトテスト、探索的テスト両方を組み合わせつつ、後者の比重を高めていきます。
この探索的なアプローチで有効なテストを行えるようにするためには、テストエンジニアを育てて、その能力を発揮させる必要があります。すなわちテストのアジリティを上げたいなら、テストエンジニアを精鋭化する必要があります。

開発技術の強化

アジリティのあるテストには様々な開発スキルが必要です。具体的には次が求められます:

  • テスト自動化。テストの高速化に有効ですし、リグレッションテストとしてアジャイルの変更への対応を実現する基礎になります。テスト自動化の実現には様々な開発スキルが求められます。
  • テスタビリティの向上。テスタビリティ技術の向上で、少ない手間でより有効なテストができるようになります。これには開発対象の設計・実装についての開発スキルが必要です。
  • テストの保守性の向上。長く継続的にテストのアジリティを確保するために重要です。例えばテストコードも適度にリファクタリングして、適度に保守性を組み込むといった話になります。これもテストコードの設計や実装といった開発スキルが求められる分野です。

テスト設計力の強化

アジリティあるテストを実現するためには、少ない手間で、十分なテストを実施する必要があります。
そこでは本質的な仕様やリスクを読み取って、ピンポイントでそれに対応する的確なテストを用意する必要があります。そのためには、チームのテスト分析やテスト設計のスキルを高めておく必要があります。

Q. テスタビリティの必要性とは?

テスタビリティの確保は、手動テスト、自動テスト、あるいはユニットストからEnd to Endテストまで問わず、アジャイルテストでとても重要です。

テスタビリティの確保は、アジャイルテストの要のテスト自動化のやりやすさにつながります。例えばテスト自動化を不能にする要因の影響範囲を小さくして、テスト自動化を実現できる範囲を広げたりするといったアプローチが可能になります。
またテスタビリティ確保は、変化に強いテストを実現するためにも必要です。例えばテストの変更性を高めて、アジャイルで継続的に変更する状況下で、テストが頻繁に壊れる問題(Fragile Test)を軽減する、といったことが可能になります。

テスタビリティの詳細や、具体的な実現アプローチについては以下を参照ください。

テスタビリティ(試験性)を確保するための設計方針 - 千里霧中

アジャイルテストで大規模テストに対応するにはどうするのか?

次の3方向の対応が有効だと考えます。

  • 1点目は、当たり前だと思いますが、チームの基礎的なテスト力を高めて、テストのスピードや妥当性を上げていくことが重要です。
  • 2点目は、テストアーキテクチャの組み立ての工夫が重要になります。プロジェクトを通して、大規模なテストアーキテクチャを育てていき、それに沿ってイテレーションごとのアジャイルテストを導いていくアプローチが重要です。日々の継続的なテストを、乱雑に積み上げるのではなく、全体整合が取りやすいように蓄積するアプローチです。
  • 3点目は、フロントローディングです。大規模テストの負荷・リスク対応・不具合検出を、日々のイテレーション内のテストで継続的に前倒し対応して、大規模なシステムテストの負荷を分散するアプローチが重要になります。