徒然なるままに

学習メモがメインです

ふりかえりカンファレンスの一人ふりかえり

ふりかえりカンファレンスに参加しました! カンファレンスの内容を一人でふりかえって、特に学びになった点やセッションを見て自身がやりたいことを書いていきます。

「場づくり」から始めるふりかえり

特に学びになった点

自身がやりたいこと

  • 使えそうな問いをあらかじめ考えておく
    • 使えそうな問いを探す
  • 参加者の目線を想像する

はじめて『ふりかえり』やってみた!しかも毎回異なる手法で!

特に学びになった点

  • いろいろな手法を試すことで他のメンバー知れる機会が増える。

自身がやりたいこと

  • 様々なふりかえりを行ってみる
    • どのふりかえり手法がチームに合うのかを知るために、ふりかえり手法のふりかえりをしたい

チームの文化を創る~ふりかえりによる相応しい価値観の共創・浸透

特に学びになった点

  • チームでたち向かう→チームの連携や強調等による相乗効果の発揮が必要→発揮するための一つの条件がチームの価値観
  • 問い詰めるのではなく、わからないことを理解したいと言うスタンス
    • 心からお礼をしないと伝わらない
  • 価値観を適切に書き換えることで成長につながる
  • ふりかえりを適切に繰り返し実践することで、ふさわしい価値観に基づく運営が浸透すればそれがチームの文化になる
    • チームの文化がチームのパフォーマンスを左右する

自身がやりたいこと

  • ふりかえりではいつでも感謝の気持ちを忘れないようにする
    • 自分の場合はそのときだけ感謝しても表面上だけになりそうなため
  • ふりかえりで業務に直接関係しないものもいれてみる
  • KPTカウンターのように数値化
  • オフラインになったらお菓子配り
  • 個人では、価値観を書き換えていくために、体験を臆せずにとりあえずやってみること、そしてふりかえること

JavaScriptって美味しいの?の私を、プログラミングの深淵をうかがい知るところまで連れて行ってくれた、ふりかえりの力

特に学びになった点

自身がやりたいこと

  • 作業記録をとって効果をふりかえってみる
  • 簡単に取れる方法を探す
    • まずはNotion使ってみる

新しく知ったふりかえり手法

  • MadSadGlad
  • YOW
  • よこなーる
  • 象、死んだ魚、嘔吐
  • 帆船

感想

非常に良いカンファレンスでした!色んな視点でのふりかえりを知ることで、参考になりましたし刺激も受けました。
そしてワイワイできて楽しみやすい場づくりされているのがすごかったです。来年も楽しみです!

ソフトウェアにおける品質/テストについて思っていること(2022/3ver)

ソフトウェアにおける品質/テストについて、自分が思っていることを取り留めもなく書いています。2022/3時点での考えとしてのスナップショットとして記事にしています。 抽象的な部分もあるので、また見直したときに具体化していこうとしています。

前回の記事はこちらです。 tagoaskubeya.hateblo.jp

品質とは

筆者が考えている現時点での品質の定義=ユーザーに対して提供する価値を正しく届けられているかどうかの度合い

品質が良い=顧客に届けるべき価値が正しく伝わっている。  
→Failureの発生件数が少ない、使いやすい、ユーザーの求めるモノ/コトに合致していて期待と現実にギャップが無い状態。
品質が悪い=顧客に届けるべき価値が正しく伝わっていない。  
→Failureの発生件数が多い、使いづらい、ユーザーの求めるモノ/コトに合致しておらず期待と現実にギャップが有る状態。

この定義は今までの筆者自身の経験から考えているものなので、定義が正しいと思えるほどの自信は全くない。品質についてはまだまだ学習中。

設計と開発と品質とテストの関係

開発者がテストをすると「自分が作ったものに間違いなんてない」といった確証バイアスがかかりがち(筆者自身の経験)なので、テストの専門家は必要と考えている。

テストは不具合(Error, Fault, Defect, Failure)があるかを検査する。検査することで品質の良し悪しを測ることユーザーに対して提供する価値が正しく提供できるかどうかを確認でき、品質を上げるための支援ができる

  • 動的テストにおいてシステムが品質を担保できるか検査する。問題のあるコードを修正することで品質が向上する。
  • 静的テストにおいては仕様書が品質を担保できるか検査する。問題のある文章や画像等を修正することで品質が向上する。

テスト活動だけでは欠陥を修正することは出来ないため、直接的に品質向上することは出来ない。テストを実施しても、開発側でコードを修正しない限り品質は上がらない。
そのため、品質の向上のための作業は開発チームにやってもらう必要がある。

また、設計とテストは不可分なのではないかと考えている。(ここでいうテストはCheckingとしてのテスト)
設計は何がどう動くか期待する結果を考える作業、テストは期待する結果がほんとに来るか正しいか確認する作業、と考えている。テストを考えれば設計できるし、逆もまたしかりで設計を考えればテストできる、というように強い関連性があるのではないか。テストを学べば設計にも役に立つかもしれない。

品質にこだわる理由

品質が悪いものをリリースした場合、運用/保守フェーズの担当者に負担が掛かる。

・自分が作っていないのに、リリースしたものについて顧客から指摘され、そのたびに神経を使う
・不具合改修、データリカバリ、顧客説明といった本質的でない作業が発生する
・なぜテストしてないのか?なぜその状態のものをリリースしたのか?と疑心暗鬼になる

別の点としては、提供した価値が正しく届いていないことに対してモヤモヤする。Failureが多いならば、例えばシステムでは本来「効率性」といった価値を提供しているはずのに、顧客はFailureが気になってしまい、提供している価値が見えづらくなってしまう。 ほかのメンバーが「品質が悪い、テストしっかりしてないだ」と言っていた。そもそも品質って何?テストはどうやればよい?を考え始めた。

品質にこだわることで得られる効果

期待できる効果としては以下を想定している。

  • 届けるべき価値を妨げる要因である不具合(Error, Fault, Defect, Failure)を可視化できることで、どこに問題があるかを把握できる
  • テスト工数が最適化できる
  • 開発者が開発に専念できる
  • 顧客からの欠陥(Failure)指摘件数を減らすことで、顧客からの信頼を減らさない
  • 保守工数を増加させない

品質向上活動を通じて楽しいこと/うれしいこと

  1. 自動化しているとき。もともと何かを作り上げることや組み立てることが好き。そして、自動化に取り組んでいているときは、自動化することで面倒な作業の時間を減らせることを想像しているので、楽になる未来を考えて明るい気分になっている。
  2. 期待している動作と実際の動作が一致しているとき。テストを実施しているときに、一つテスト項目が消化しているときは達成感を得られるため。
  3. テスト設計/実装しているとき。複雑なものを解剖してやってるぜ感を得られる。

手動テストと自動テスト

自動化できる部分は積極的に自動化していきたい。大前提として、テスト手法やテスト設計といったテスト活動の知識が必要。
そして、何でも自動化すれば良いわけではない。自動化の工数と自動化して得られる恩恵を考慮して自動化を検討する必要がある。例えば、リリースが少ないのであれば、毎度テストを行う必要がないので自動化による効果は薄い。クリティカルな部分は自動化の余地はあるかもしれない。リリースが多いならば、毎度リグレッションテストを手動でやることはコストがかかるため、自動化することによる恩恵は多いはず。

これから先の姿

開発者と協力しながら、品質向上を主としてチームをより良い方向へ進化させることができる存在になる。 理由としては、開発者の作業によって品質が向上できるため、そしてより良いものを作るためにはメンバー間が必要不可欠なため

手段

  • チームの各メンバーの力を底上げする
    • ふりかえり
      • カイゼンのサイクルを作り出す
      • 人/チームに影響を出すために行う
    • スクラムマスターの知識(スクラムマスターの知識を持っていないのでこの辺はふわふわしている)
      • チーム/グループに対して支援する役割
      • 開発者が開発に集中するための支援を行う
  • 自動化できる部分は自動化する
    • 自動化計画、設計、実装
    • CI/CDパイプライン
  • 要件定義~開発のフェーズから品質を作りこむ(シフトレフトの実現)
    • テスト容易性の検討
    • レビューの実施
  • 効果的なテストを実施する
    • 計画、設計、実装
  • 設計/コードの品質をレビューする
    • プロダクションコードを理解することで品質を確認
    • 最低限、軽微な修正はできる状態を目指す

まだ理解できていないこと

  • 品質マネジメント(QM)、品質保証(QA)、品質コントロール(QC)、テスト活動の関係性
  • テスト自動化の手段と目的
  • テスト計画やテスト分析でやるべきこと

「テスト駆動開発」を読んだ感想

テスト駆動開発」を最近読んだので、その学んだことと感想を書いています。 shop.ohmsha.co.jp

なぜ読んだか

学んだこと

TDDのサイクル

  1. テストを書く
  2. 動くコードを書く
  3. リファクタリングする

TDDのメリット

  • TDDでテストを考えることで、きれいなコード、より良い設計の手助けになる
  • 欠陥が少なくなる
    • コードを信頼できる
    • リリースの際に欠陥がでない
      • 追加機能だけに焦点を当てれる
      • ミスをしでかす確率が減っていることを実感でき、ストレスも減る
    • 欠陥を見つけて修正する時間が少なくなる
    • 開発を促進し、チームを支援する

テストについて

  • テストは質を上げるのではなく、質を上げるのはプログラミング
    • 質を上げるためにテストを書く
    • テストでは質がわかるだけ
  • TDDを厳密に行うとC0カバレッジは100%になる
  • TDDのテスト=Checking
    • Testingではな意味
  • テストの目的はコードに自信を持つこと→きれいなコードという意味だと認識している

その他

  • 小さく進むこと
    • 先にテストコードを書くことで、テストコードが仕様を守ってくれる安心感
    • コードを修正してから、最後に「動け~」と念じながらテストをやらなくていい
  • テスト間では独立している必要があり、依存関係は絶対に作ってはいけない
    • 後続は正しいのに、前でエラーになると後続もエラー扱いとなってしまい、調査に時間がかかる
    • 1つの失敗は一つの問題であってほしい
    • テストが独立していると、凝集度が高く低結合の設計にたどり着けれる
  • テストメソッドは実行前の状態を完全に復元するように心がけなくてはならない

感想

テスト駆動開発と言うので、テストを先に書いて開発するんだろうな~と認識していました。もしかしたらテストに関する技法とかなりえるのかも?と思っていましたが、テスト駆動開発設計手法である印象を受けました。
また、「テストでは質がわかるだけ」という点はすごく共感しました。これはTDDにおけるテスト以外も当てはまると思います。テストの役割/目的の一つはプロダクションコードの質を上げるための手段ということを改めて実感しました。特に、TDDにおいてはプロダクションコードを修正することでプロダクションコードの品質を上げる必要があるので、プロダクションコードの修正が無いならばTDDでは無さそうです。
テストコードを書ける時は積極的に書くことで、より良いプロダクションコードにしていきます!

2021年のふりかえり

2021年ふりかえり

やったこと

読んだ本

資格

ボランティア

  • まだ途中。形になったらブログ化するかもしれない。

LT

ブログ

その他の学習

生活習慣

  • 朝活をするようになった。
    • 6:30のラジオ体操で起床。そこから軽くランニング。その後何かの作業するようになった。
    • 体を動かすことで早い時間に目が覚められる。
  • 毎年1%筋肉が落ちる話を聞いて、筋トレをほぼ毎日行うようになった。
    • 以前より肩こりは減ってきた気がする。

雑感

今年やったことを見直すことで、自身の考え方にどのように影響があったかふりかえった。
こうして列挙してみると、前年と比べて今年は精力的にいろいろ出来たのかなと。
色々実践していくなかで思ったことは、新しい知識を取り入れることは面白いと思えた。それは、既存の考え、価値観が更新される感覚自分の中での既存知識と新しい知識を掛け合わせることで新たな考え方、価値観を習得できることはすごく楽しくて面白い。

また、本も以前よりは読むようになった。というより以前は楽しく感じられず、ほとんど読まなかった。楽しく感じられるのは上に書いた通りだが、それ以外に本を読むときに「なぜ読むか」を意識するようになったからか、本の内容を理解できるようになった。
自分がどこに感心があるかを予め確認しておくことで、意識が集中できる。自分自身が完璧主義なので、本の内容をすべて身につけようとして結局理解できないことが多かった。本の内容全てを完全に理解することは難しいと割り切ることで自分が興味ある部分を中心に理解が進んでいった。

他の思ったこととしては、本当読んだ本はすべて感想とか書いてブログ化したいけど、自分用のメモに纏めたで終わっていることもしばしば... 来年はもう少し本を読んでブログ化できるように、そしてもっと活動的になりたいところ。

ソフトウェアテスト技法練習帳での学び

はじめに

ソフトウェアテスト技法練習帳の問題を一通り解き終えたので、学んだことを簡単にまとめます。

gihyo.jp

学んだこと

同値分割/境界値分析

  • 数値で条件分岐する際のテストにおける同値分割の必要性
    • 数値で、例えば1以上10以下の場合は..みたいな条件をテストする際、境界値分析やったら同値分割はしないことが多い。しかしながらコーディングで条件文で<===にしていたといった可能性を考慮すると、同値分割で代表値でテストすることが効果的。
  • 上限値が仕様書として明示されていない場合
    • 仕様を確認すること
    • 設計、コーディングする際は数値の上限を考慮すること
      • 特段決める必要がない場合は、数値型の最大値が結果的に上限値になるはず...

デシジョンテーブル

  • デシジョンテーブルでをY/NXで記述する方法は「制限指定」と呼ばれ、JISX0125で定義されている。「制限指定」だけでなく、「拡張指定」としてY/NXではなく日本語で書いても良い。行が少なくなるメリットが有る。
  • 条件記述部はデシジョンツリーで分かれる順番

状態遷移

その他

  • 実際の仕様をそのままテスト技法つかおうとするとうまく行かない事が多いので、段階的にテスト技法を適用していくことが必要。

感想

問題数もボリュームが有ったので経験になりました。
テスト技法だけを学んでも、具体的な使い方を理解していなかった部分があるので、今回実践的な問題を通してテスト技法の使い方を学べてよかったです。

  

JSTQBFL6章のまとめ

はじめに

1章2章3章5章に引き続き6章を読んでみました。シラバスの内容について「これ大事だな」と思うもの独断と偏見で記述し、「特に大事だな」と思うものboldにしています。

JSTQBFL5章テストマネジメントでの学び - 徒然なるままに

JSTQB FLのシラバス第3章:静的テストでの学び - 徒然なるままに

JSTQBFL1章のまとめ - 徒然なるままに

JSTQBFL2章のまとめ - 徒然なるままに

シラバス内容

テストツール

テストツールの目的

  • 反復作業を自動化することによって、テスト活動の効率を改善する
  • テストプロセス全体を通して、手動で行うテスト活動を支援することによって、テスト活動の効率を改善する。
  • テストの一貫性や欠陥の再現性を高めることで、テスト活動の品質を改善する。
  • 大規模な性能テストといった手動では実行できない活動を自動化する
  • 大量のデータの比較を自動化、または動作のシミュレーションをすることによりテストの信頼度を向上させる。

テストツールの分類

  • テストとテストウェアのマネジメントの支援ツール
    • ソフトウェア開発ライフサイクル全体であらゆるテスト活動に適用できるツール。
    • ツールの例
      • テストマネジメントツールとアプリケーションライフサイクルマネジメントツール(ALM)
      • 要件マネジメントツール(テスト対象へのトレーサビリティなど)
      • 欠陥マネジメントツール
      • 構成管理ツール
      • 継続的インテグレーションツール
  • 静的テストの支援ツール
    • 静的解析ツール
  • テスト設計とテスト実装の支援ツール
    • テストの設計と実装で保守性の高い作業成果物(テストケース、テスト手順、テストデータなど)を作成できるように支援する。
    • ツールの例
      • モデルベースドテストツール
      • テストデータ準備ツール
  • テスト実行と結果記録の支援ツール
    • テスト実行と結果記録の支援ツール
    • カバレッジツール
    • テストハーネス
  • 性能計測と動的解析の支援ツール
    • 性能テストとロードテストは手動では効果的に実行できないため、これらのテスト活動では性能計測ツールと動的解析ツールが必須になる。
    • ツールの例
      • 性能テストツール
      • 動的解析ツール

テストツールの注意点

ツールが結果に影響を及ぼすことを、プローブ効果と呼ぶ。例としては、性能テストツールによって実行される余分な命令のせいで、アプリケーションの応答時間が実際とは異なってしまうかもしれないし、達成したコードカバレッジの量がカバレッジツールを使用したせいで変わってしまうかもしれないケースがこれに当たる。

テスト自動化の利点とリスク

単にツールを取得しても、成功は保証されない。組織に対して新たに導入した各ツールの本来の効果を継続的に上げるには、相応の工数が必要になる。

  • 潜在的な利点の例
    • 反復する手動作業の削減と時間の節約
    • 一貫性や再実行性の向上
      • 整合性のあるテストデータ、同じ頻度と順序でのテスト実行、要件からの一貫したテストケースの抽出など。
    • 評価の客観性向上
    • テストに関する情報へのアクセスの容易性向上。
      • テスト進捗、欠陥率や性能計測結果の集計、およびグラフの作成など。
  • 潜在的なリスクの例
    • テストツールの効果を過大な期待
    • テストツールを初めて導入する場合に要する時間、コスト、工数を過小評価する。
    • 大きな効果を継続的に上げるために必要な時間や工数を過小な評価
    • ツールが生成するテスト作業成果物をメンテナンスするために必要な工数の過小評価
    • ツールへの過剰な依存
      • テスト設計またはテスト実行と置き換えられると考える、手動テストの方が適したケースで自動テストを利用できると考えるなど。

ツールの効果的な使い方

ツールを選択する際の基本原則

  • 自分たちの組織の成熟度、長所と短所を評価する。
  • ツールを活用するためにテストプロセスを改善する機会を識別する。
  • テスト対象で使用する技術を理解して、その技術と互換性のあるツールを選択する。
  • 明確な要件と客観的な基準を背景にツールを評価する。
  • ツールに直接携わる担当者のテスト(およびテスト自動化)スキルを考慮して、トレーニングの必要性を評価する。
  • 必要に応じて具体的なビジネスケースに基づいて、費用対効果を見積る。

ツールを組織に導入するためのパイロットプロジェクトの目的

  • ツールに関する知識を深め、強みと弱みを理解する。
  • 現状のプロセスや実践しているやり方にツールをどのように適用するかを評価する。そして何を変更する必要があるかを特定する。
  • ツールやテスト作業成果物の標準的な使用方法、管理方法、格納方法、メンテナンス方法を決める。
  • 期待する効果が妥当なコストで実現可能かどうかを見極める。
  • ツールによって収集およびレポートをさせたいメトリクスを理解し、メトリクスを確実に記録し レポートするようにツールを設定する。

感想

  • テストツール=自動テストのためのテスト実行ツールと思いがちですね。実際には他にもツールがありますが、テストツールの種類が多くてイマイチ覚えられていません...
  • ツールの選定/については、別にテストツールに限った話ではなく、テストに関係しない他のツールを選定/導入するときと同様の話ですね。

JSTQBFL2章のまとめ

はじめに

1章3章5章に引き続き2章を読んでみました。シラバスの内容について「これ大事だな」と思うもの独断と偏見で記述し、「特に大事だな」と思うものboldにしています。

JSTQBFL5章テストマネジメントでの学び - 徒然なるままに

JSTQB FLのシラバス第3章:静的テストでの学び - 徒然なるままに

JSTQBFL1章のまとめ - 徒然なるままに

シラバス内容

ソフトウェア開発ライフサイクルモデル

ソフトウェア開発とソフトウェアテスト

どのようなソフトウェア開発ライフサイクルモデルにも、よいテストを行うときの特徴がいくつかある。

  • 各開発活動に対応してテスト活動がある。
  • 各テストレベルには、そのレベル特有の目的がある。
  • 各テストレベルのテスト分析や設計は、対応する開発活動の間に開始する。
  • テスト担当者は要件と設計を定義および洗練する討議に参加し、作業成果物(要件、設計、ユーザーストーリーなど)のドラフトができたらすぐにそのレビューに関与する。

早期テストのテスト原則に従い、どのようなソフトウェア開発ライフサイクルモデルであるかに関係なく、テスト活動はライフサイクルの早い段階に開始すべきである。

一般的なソフトウェア開発ライフサイクルモデルの特徴

  • シーケンシャル開発モデル
    • 特徴
      • 要求仕様からメンテナンスまでのソフトウェア開発ライフサイクル活動を表現したフレームワーク
      • ソフトウェア開発プロセス順次実行する活動として表す。これは、開発プロセスのあらゆるフェーズが直前のフェーズの完了とともに始まることを意味する。理論的にはフェーズが重なることはないが、実際には、後続のフェーズからフィードバックを早期に行うのが効果的である。
      • フィーチャーが完全に揃ったソフトウェアを提供するが、ステークホルダーやユーザーが利用できるまでには、典型的に数か月から数年を要する。
    • シーケンシャルモデルの例
      • ウォーターフォールモデル
        • 開発活動(要件分析、設計、コーディング、テストなど)は、逐次完了する。このモデルでは、テスト活動はその他の開発活動がすべて完了した後に実行する。
      • V字モデル
        • ウォーターフォールモデルと異なり、開発プロセス全体にテストプロセスを統合しており、早期テストの原則を実装している。早期テストの裏付けとして、各開発フェーズにテストレベルが対応している。テスト実行は、関連付けられているテストレベルごとに順次進めていくが、重複することもある。
  • イテレーティブ開発モデルとインクリメンタル開発モデル
    • インクリメンタル開発
      • システムを分割し、分割単位ごとに要件の確定、設計、構築、テストを行う。増加させていくフィーチャーの分割単位の大きさは手法によってさまざま。
    • イテレーティブ開発モデル
      • グループにしたフィーチャー群を、一連のサイクルの中で一緒に仕様化、設計、構築、テストする。イテレーションでは、動作するソフトウェアが提供される。提供されるソフトウェアは、段階的にフィーチャーを追加して成長させていく。完成したソフトウェアが提供されるか、開発が中止するまでイテレーションを継続する。
    • イテレーティブ開発モデルとインクリメンタル開発モデルの例
      • ラショナル統一プロセス(RUP)
        • イテレーションは他と比べて長期(例えば2~3か月)になる傾向にあり、フィーチャー増分は、関連するフィーチャーで構成するいくつかのグループなど、期間に対応して大きくなる傾向にある。
      • スクラム
        • イテレーションは他と比べて短期(例えば、数時間、数日、数週間)になる傾向にあり、フィーチャーの増分は、わずかな機能強化、いくつかの新しいフィーチャーなど、小さくなる傾向にある。
      • カンバン
        • イテレーションの期間の長さが固定されているかどうかに関係なく実装できるので、完了時に単一の機能強化やフィーチャーをリリースすることも、複数のフィーチャーをまとめて一括してリリースすることもできる。
      • スパイラル
        • 増分を試行しながら追加する。増分は、後続の開発作業で大幅に作り直すことも破棄することもある。
    • これらの手法は、システムの段階的な成長を可能にする。システムが成長するにつれてリグレッションテストの重要性は増大する

テストレベル

コンポーネントテスト

別名:ユニットテストまたはモジュールテスト

  • 目的
    • リスクの軽減
    • コンポーネントの機能的/非機能的振る舞いが設計および仕様通りであることの検証
    • コンポーネント品質に対する信頼の積み上げ
    • コンポーネントに存在する欠陥の検出
    • 欠陥がより高いテストレベルまで見逃されることの防止
  • 特徴
    • 特にコード変更が継続して行われるインクリメンタル開発モデルやイテレーティブ開発モデルでは、コンポーネントテストのリグレッションテストを自動化して、変更が既存のコンポーネントを破壊していないという信頼を積み重ねていくことが重要である。
    • ソフトウェア開発ライフサイクルモデルやシステムの特性により、システムの他の部分と切り離したテストが可能である。この場合、モックオブジェクト、サービス仮想化、ハーネス、スタブ、ドライバーなどを使う。
    • 検出した欠陥は、形式に沿った欠陥マネジメントを行わず、見つけたらすぐに修正するのが一般的である。ただし、開発担当者が欠陥を報告すると、根本原因分析やプロセス改善にとって重要な情報が得られることになる。
  • 典型的な欠陥と故障的な欠陥と故障の例
    • 正しくない機能(例えば、設計仕様の記述とは異なる)
    • データフローの問題
    • 正しくないコードとロジック
  • アプローチと責務

結合テスト

  • 目的
    • リスクの軽減
    • インターフェースの機能的/非機能的振る舞いが設計および仕様通りであることの検証
    • インターフェース品質に対する信頼の積み上げ
    • 欠陥の検出(インターフェース自体、コンポーネントに内在、またはシステムに内在)
    • 欠陥がより高いテストレベルまで見逃されることの防止
  • 特徴
  • 2 つの異なるレベル
    • コンポーネント統合テスト
      • 統合するコンポーネント間の相互処理とインターフェースに焦点をあててテストする。コンポーネントテストの後に実施し、自動化するのが一般的である。イテレーティブ開発およびインクリメンタル開発では、CIのプロセスの一環として行うことが一般的である。
    • システム統合テスト
      • システム、パッケージ、マイクロサービス間の相互処理とインターフェースに焦点をあててテストする。外部組織(Webサービスなど)との相互処理、または外部組織により提供されるインターフェースをカバーすることもある。システムテストの後、または実行中のシステムテスト活動と並列に行う。
  • 統合テストの典型的な欠陥と故障の例
    • 正しくないデータ、データ不足、正しくないデータエンコーディング
    • インターフェース呼び出しの正しくない順序またはタイミング
    • インターフェースの不整合
    • コンポーネント間のコミュニケーション故障/システム間通信による故障
    • コンポーネント間のコミュニケーション故障/システム間通信による故障の処理不在、または不適切な処理
    • コンポーネント間/システム間で渡されるデータの意味、単位、境界の正しくない思い込み
  • アプローチと責務
    • コンポーネント統合テストとシステム統合テストは統合だけに集中すべきである。
      • モジュールAとモジュールBの統合をテストする場合、コンポーネントテストでカバー済みの個々のモジュールの機能ではなく、2つのモジュール間のコミュニケーションに焦点をあてる必要がある。
      • システムXとシステムYの統合をテストする場合、システムテストでカバー済みの個々のシステムの機能ではなく、2つのシステム間のコミュニケーションに焦点をあてる必要がある
    • 機能テスト、非機能テスト、構造テストは統合テストで行うことができる。
    • コンポーネント統合テストは開発担当者が実行するのが一般的である。システム統合テストはテスト担当者が実行するのが一般的である。理想的には、システム統合テストを実行するテスト担当者はシステムアーキテクチャーを理解すべきであり、統合計画の作成に関与すべきである。
    • 統合の範囲が大きくなるほど、欠陥を特定のコンポーネントまたはシステムに絞り込むことが難しくなる。これによりリスクが増え、トラブルシューティングの時間が増大する。

システムテスト

  • 目的
    • リスクの軽減
    • システムの機能的/非機能的振る舞いが設計および仕様通りであることの検証
    • システムが完成し、期待通りに動作することの妥当性確認
    • システムの全体的な品質に対する信頼の積み上げ
    • 欠陥の検出
    • 欠陥がより高いテストレベルまたは運用環境まで見逃されることの防止
  • 特徴
    • システムが実行するエンドツーエンドのタスクと、タスクの実行時にシステムが示す非機能的振る舞いといったシステムやプロダクト全体の振る舞いや能力に焦点をあてる。
  • 典型的な欠陥と故障
    • 正しくない、または期待通りではないシステムの機能的または非機能的振る舞い
    • システム内の正しくない制御フロー、データフロー
    • エンドツーエンドの機能的タスクを適切かつ完全に実行できない
    • システムマニュアルおよびユーザーマニュアルに記載されている通りにシステムが動作しない
  • アプローチと責務
    • システムテストは通常、独立したテストチームが仕様を頼りにして行うことが多い。
    • 仕様の欠陥は、システムの期待される振る舞いに関する正しい理解の欠落や誤解につながる。この状況が偽陽性偽陰性の結果を招き、時間の浪費や欠陥検出効率の低下となる。テスト担当者がユーザーストーリーを洗練する活動およびレビューなどの静的テストの活動に早期から関与することで、このような状況が起きることを削減できる。

受け入れテスト

  • 目的
    • システムテストと同様、一般的にシステムやプロダクト全体の振る舞いや能力に焦点をあてる。
      • 全体的な品質に対する信頼の積み上げ
      • 機能的/非機能的振る舞いが仕様通りであることの検証
  • 特徴
    • 受け入れテストからの情報に基づいて、システムが導入に向けて準備できているかどうか、および顧客(エンドユーザー)が使用できるかを評価できる。受け入れテストで欠陥が見つかることはあるが、欠陥を見つけることは目的ではない。とても多くの欠陥が受け入れテスト時に検出されるような事態は、重要なプロジェクトリスクと見なすことができる。
  • 受け入れテストの一般的な形態
    • ユーザー受け入れテスト
      • 意図されているユーザーが本番環境または模擬運用環境にて、想定しているシステムの使用方法と合致していることを確認する。
      • 主目的は、システムの使用において、システムがユーザーニーズに合致し、要件を満たし、最小限の困難さ、コスト、リスクでビジネスプロセスを実行できるという信頼を積み重ねることである。
    • 運用受け入れテスト
      • 運用担当者またはシステムアドミニストレーターが、運用環境で(例外的な状況/困難な状況であっても)ユーザー向けにシステムを適切な稼動状態に維持できるという信頼を積み重ねることである。
      • (模擬)本番環境で行うのが一般的である。
    • 契約による受け入れテスト
      • カスタムメイドのソフトウェアを開発する場合に、契約書に記述した受け入れ基準に従って行う。受け入れ基準は、契約時に当事者間で合意している。
      • ユーザーまたは独立したテスト担当者が行うことが多い。
      • 契約に準拠しているという信頼を積み重ねることである。
    • 規制による受け入れテスト
      • 政府、法律、安全の基準などに合致しているかを確認する。
      • ユーザーまたは独立したテスト担当者が行うことが多いが、規制機関が結果を証明または監査する場合もある。
      • 規制に準拠しているという信頼を積み重ねることである。
    • アルファテストおよびベータテスト
      • 市販ソフトウェア(COTS)の開発担当者がソフトウェアプロダクトを市場へリリースする前に、顧客/システムの運用者からフィードバックを受けるために行う。
      • システムが使われる環境(特に、開発チームでは再現できない状況や環境)での欠陥を検出することも目的の1つである。
      • アルファテストは、開発組織内にて開発チームの代わりに潜在的または既存の顧客、システムの運用者もしくは独立したテストチームが行う。
      • ベータテストは、潜在的または既存の顧客、システムの運用者が彼ら自身の作業場所で行う。ベータテストはアルファテストの後に行うことも、アルファテストなしに行うこともある。
  • さまざまな形態の受け入れテストで典型的な欠陥と故障の例
    • システムのワークフローがビジネス要件またはユーザー要件を満たさない。
    • ビジネスルールが正しく実装されていない。
    • システムが契約要件または規制要件を満たさない。
    • セキュリティの脆弱性、高負荷時の不適切な性能効率、サポート対象プラットフォームでの不適切な操作などの非機能特性の故障。
  • アプローチと責務
    • 受け入れテストは、顧客、ビジネスユーザー、プロダクトオーナー、システムの運用担当者の責任で行われる。他のステークホルダーも関与することがある。

テストタイプ

ソフトウェアの特性をテストするための活動を束ねたもの。

機能テスト

  • システムが実行する機能を評価する。機能とはシステムが「何を」すべきかである。すべてのテストレベルで行うべき。
  • 機能カバレッジを用いてテストが十分かを計測できる。機能カバレッジは、テストした機能の範囲を示し、カバーした要素の種類の割合で表す。

非機能テスト

  • システムやソフトウェアの使用性、性能効率性、セキュリティといった特性を評価する。システムが「どのように上手く」振る舞うかをテストする。
  • 一般的に誤解されているが、非機能テストはすべてのテストレベルで行うことができる。そして可能な限り早期に行うべきである。
  • 非機能カバレッジを用いてテストが十分かを計測できる。非機能カバレッジは、テストした非機能要素の種類の範囲を示し、カバーした要素の種類の割合で表す。

ホワイトボックステスト

  • システムの内部構造や実装に基づいてテストを導出する。
  • コンポーネントテストレベルでは、コードカバレッジで計測できる。コンポーネント内のテスト済みのコードの割合に基づき計測できる。
  • コンポーネント統合テストレベルでは、テストで実行済みのインターフェースの割合で計測できる。

変更関連のテスト

システムに対する変更をした場合に行うテスト。

  • 確認テスト
    • 欠陥が確実に修正されたことの確認。
  • リグレッションテスト
    • 変更後に意図しない副作用を検出する。 確認テストとリグレッションテストは、すべてのテストレベルで行う。

感想

ある程度はすでに知っている内容でした。ただ、テストレベルの違いが曖昧だったので、そこを改めて知ることができ良かったです。