テスト容易性のためのデザインパターン:Humble Objectパターンとは

テスト容易性の確保にかかわる責務設計、リファクタリングのためのデザインパターンに、Humble Objectパターン(Humbleオブジェクトパターン、質素なオブジェクトパターン)があります。Humble Objectパターンは、ユニットテストのデザインパターン集であるx…

リファクタリングすべきか・してよいかの判断基準

リファクタリングは、設計やコードを綺麗に保つという普遍的に求められる活動の一要素です。常識的な習慣として推進すべき活動です。 ただ、有効性の理解を得られないままリファクタリングを行って物議を醸す場面も存在します(例えばここのはてなブックマー…

レビューのレバレッジ性・ピンポイント性を確保する開発プロセス設計

一定以上の規模のプロジェクトでは、開発プロセス設計において、テックリードなど有識者による横断的なテクニカルレビューをどうするかが課題になります。 そこでは、次の課題への対応が求められます。 レビューのレバレッジ性の確保。少数のレビューアの影…

開発の高スピードと高品質を支えるテストアプローチについて講演

先日、開発生産性 Conference 2024のSpecial Sessionにて、「高品質と高スピードを両立させるテストアプローチ」と題して講演をさせていただきました。https://speakerdeck.com/goyoki/test-approach-that-improves-quality-and-agility-together speakerdec…

モデリングは目的と観点による方向づけが不可欠

モデリングの対象が同一でも、何をどうモデリングするかには無数の選択肢があります。 そこであるべきモデルを方向づけするのが、次の目的と制約です。 目的:モデリングで達成を助けたいもの 制約:モデリングの自由度を制限するもの 目的について まず目的…

ソフトウェアプロダクトライン開発でのテストアプローチ

ソフトウェアプロダクトライン開発とは ソフトウェアプロダクトライン開発(SPLE:Software Product Line Engineering。ソフトウェア製品系列開発)は、複数の類似した製品群(プロダクトライン)の開発についての開発手法・テクニックです。プロダクトライ…

テスト設計コンテストU-30クラス審査委員長業の振り返り

社外のコミュニティ活動として、2017年からテスト設計コンテストU-30クラスの創設とその審査員長を続けていたのですが、立候補あり今年度から大段さんに引き継ぐことになりました。良いタイミングなので、今回振り返りながら、自分の審査委員活動の総括をで…

リグレッションテストの方針立て

リグレッションテストの方針の重要性 ソフトウェアに変更を加えた際に、意図せず変更とは関係のない所で故障が発生したり潜在的なバグが顕在化したりしたものは、リグレッション(和製英語でデグレードとも)と呼称されます。 リグレッションテストは、この…

シフトレフトテストを支えるテスト設計についてSoftware Designに寄稿

最近、Software Design 2月号にて、シフトレフトテストの解説記事を執筆する機会をいただきました。Software Design 2024年2月号シフトテストレフトは、シフトレフトの一種で、「テスト対象を動かして動的にテストするタイミングをなるべく早く設けよう」と…

品質保証部門の陳腐化。そして陳腐化した品質保証は品質を悪化させる

※品質保証のエンジニアである筆者が自省・戒めのために書いた記事になります 品質管理(Quality Control)、品質マネジメントは国内では製造業を中心に発展し、プロダクトの競争力向上に貢献してきました。 JTCと呼ばれる旧来からのメーカーでは、その実績・…

PCの執筆・作業環境の整備で買ってよかったもの2023年版

今年、書籍執筆の機会をいただいているのですが、執筆期間が短く、プライベート時間にかなりの間文字を書き続けています。(体が無理できなくなったのも合わさって)そこで気になったのが、自分の自宅のPC環境の使いづらさでした。 その流れで今年後半はPC環…

プロパティベーステストの概要とPythonでの実装例

「実践プロパティベーステスト」の発売をきっかけに、国内でプロパティベーステストの話題がホットになっています。 今回はこのプロパティベーステストの概要とテクニックについて、Pythonをサンプルに解説します。 プロパティベーステストとは プロパティベ…

組み合わせテストの組み合わせを減らすアプローチ

組み合わせテストは、「組み合わせ爆発」という言葉がある通り、テストケースの規模が大きくなりがちです。それに付随して、開発のスピードやコスト、必要リソースに悪影響を及ぼすこともあります。 そのため、組み合わせテストの組み合わせ削減は、テストケ…

現代的なユニットテストでのコードカバレッジ(テストカバレッジ)の扱い方

ユニットテストのコードカバレッジ(テストカバレッジ。ステートメントカバレッジやC0、C1など)は、不適切な運用が根強く見られます。多いのが、コードカバレッジの確保だけをテストの十分性目標にして、まずいテストを書いてしまうパターンです。 今回はこ…

抽象レベルの高いテスト設計(テストアーキテクチャ設計など)の構成要素にテストケースセットを選んではいけない

大規模な開発では、抽象レベルの高いテスト設計(いわゆるテストアーキテクチャ設計が代表例)を通して、大規模なテストを中小規模のテスト要素に分割するアプローチがとられます。 例えば次ようなものです: システムオブシステムズのレベルで、各企業組織…

CI/CD方針、テスト・QA方針と連動する三分類ブランチ管理方針で、開発での高品質と高スピードの両立を支える

最近の開発では、CI/CD、自動テスト、継続的テストが当たり前となっていますが、その影響で、それらのCI/CD方針、テスト方針と、Git等のバージョン管理のブランチ方針をどう連携させるかが、定番の課題になっていると感じています。 今回は、このブランチ方…

品質保証(QA)とは。定義の三大流派と定義揺れの弊害

近年のソフトウェア業界では、テスト関連活動を担うエンジニアを「QAエンジニア」と呼ぶようになっています。ただQA(品質保証)という言葉は、旧来から二つの定義が共存しているほか、業界内の通例で更に別の意味付けが行われた結果、定義が曖昧になり誤解…

テスト設計の一通りの流れについてのチュートリアルに登壇

先日、テスト設計コンテストU-30クラスに関連するイベントとして、テスト設計のチュートリアル講師の機会を頂きました。https://speakerdeck.com/goyoki/test-design-tutorial今回のチュートリアルでは、初学者向けに、勉強会やセミナーで解説されるテスト分…

モダンなテストレベル設計(ユニットテスト~システムテスト等をどう設計するか)の原則

プロジェクト全体のテストを組み立てる際に重要な課題になるのが、テストレベル設計です。テストレベル設計は、ユニットテスト、結合テスト、システムテストといったテストレベルを、どのような責務・段取りで行うか分析・設計する活動です。 このテストレベ…

カオスエンジニアリングのプラクティス:スクイーズテスト(Squeeze Test)とは

カオスエンジニアリングや継続的ベリフィケーションの解説で目にすることのあるテストプラクティスに、スクイーズテスト(Squeeze Test、圧迫テスト)があります。ただこのスクイーズテストはカオスエンジニアリングの一例として名こそ取り上げられているも…

自動テストを支えるテスト設計について講演

先日、JaSST'23 Tokaiというテストのイベントで「自動テストを活躍させるための基礎作りとテスト設計の工夫」と題して講演する機会を頂きました。https://speakerdeck.com/goyoki/improvements-and-test-design-for-effective-test-automation今回はシンポジ…

SQuaRE、ISO/IEC 25010の製品品質モデルの改訂動向

SQuaRE、ISO/IEC 25010についてですが、標準規格の担当WGの方が、2022年の3月のタイミングで審議中の改訂情報に触れていました。https://speakerdeck.com/washizaki/squareguan-lian-falsebiao-zhun-hua-falsequan-ti-dong-xiang-25010-25019gai-yao-ip-shan…

探索的テストの力を引き出す段取り、そしてTEXの改善

これまで色々な立場で、色々なテスト案件を経験してきましたが、その中で一番生産性が高いテストアプローチが、精鋭テストエンジニア達による探索的テストでした。 適切なタイミングで、必要な環境と必要な人材が揃った探索的テスト部隊がテストを始めると、…

テスト自動化の事後(影響、評価、ネクストステップ)について講演

先日、QuesというソフトウェアQAをテーマにした勉強会に「テスト自動化の成果をどう評価し、どう次につなげるか」と題して登壇させていただきました。docs.google.com「テスト自動化をした後」をテーマにしてほしいとの要望を頂いていたため、今回は以下の3…

GoogleTestとSanitizerを組み合わせて動的解析

「Calendar for ソフトウェアテストの小ネタ | Advent Calendar 2022 - Qiita」の記事です。C++のメジャーなテスティングフレームワークGoogleTestは、gccやclangに組み込まれたSanitizerと連動することで、不正なメモリ操作や不適切なスレッド間データ共有…

Cap'n Protoのシリアライズによるツール間のデータやりとり実装例

最近 Cap'n Proto の導入例を割と見るようになっています。Cap'n ProtoはRPCのフレームワークおよびフォーマット仕様のシステムで、gRPCに対抗して作られたものです。今回はCap'n Protoのスキーマ言語の定義と、その処理の簡単な例として、Serializationの最…

テストオラクルに依存しないテスト実装テクニック:ラウンドトリップテスト(Roundtrip Test)

ファジングテスト、コンコリックテストなど、テスト入力を自動生成・大量使用するテストで問題になるのが、テストオラクル(テストの期待値を提供するもの)をどう実装するかです。このテストオラクル問題への対策の代表例については、次のようなアプローチ…

ミューテーションテストの概要と類似手法との違い

ミューテーションテストとは、テストの有効性を評価するための手法です。テスト対象を変更し(バグを埋め込み)、それによってテスト結果が変化するかを調べることで、テストがバグを見つけられるかを評価します。 ユニットテストなどホワイトボックステスト…

Go Fuzzingによるファジングテスト/ランダムテスト

Goは標準のテストフレームワークでファジングをサポートしています。今回はそのファジング機能について、テスト条件の網羅をどうするかを中心に使い方をメモします。 基本的なテストコードの書き方 Fuzzingを使ったテストコードの簡単な例を以下に示します。…

C++ コンセプト(concepts)の型制約のテスト

C++20から導入されたコンセプト(concepts)は、テンプレート型のパラメータの制約を実現する、型制約の言語機能です。 コンセプトを使うと、従来のSFINAEなどのテクニックと比べて、簡潔に型の制約を記述できるようになるほか、制約違反時のエラーメッセー…