Slide 1

Slide 1 text

単体テストソムリエ になろう︕ WACATE実⾏委員 ⼭⼝

Slide 2

Slide 2 text

単体テスト ■ みなさん知ってますか︖

Slide 3

Slide 3 text

単体テスト ■ 困ってるなぁ・・・ってことありますか︖ – 直感的に「これは単体テストで⾒つかっていいんじゃ︖」と思うことがある – むしろ開発者によってやってることが違う気がする

Slide 4

Slide 4 text

単体テストってわかりにくい ■ プロジェクトで指しているテストが全然違う ■ むしろ個⼈で違う 画⾯だ︕ クラスだわ︕ ⾃動だわ︕ 画⾯で⾃動と か妄想⼄︕

Slide 5

Slide 5 text

単体テスト ■ JSTQBより – コンポーネントテスト(ユニットテストとも呼ばれる)︓コンポーネント を単独でテストすることに 焦点を当てる。コンポーネントテストは、テス トハーネス、またはユニットテストフレームワークのよ うな特定のサポー トを必要とすることが多い。コンポーネントテストは、通常、開発者が開 発環境で⾏う。

Slide 6

Slide 6 text

単体テスト ■ JSTQBより – コンポーネントテスト(ユニットテストとも呼ばれる)︓コンポー ネントを単独でテストすることに 焦点を当てる。コンポーネントテストは、 テストハーネス、またはユニットテストフレームワークのよ うな特定のサ ポートを必要とすることが多い。コンポーネントテストは、通常、開発者 が開発環境で⾏う。 実際の現場ではプログラムごと、画⾯ごと、振る舞い単位(コンポー ネントの集合体)で⾏われることも多く、これは単体テストと多くの 現場で呼ばれているものの説明ではない (おそらくコンポーネントテスト=単体テストになってほしいという思いの表明)

Slide 7

Slide 7 text

単体テスト ■ SWEBOK – ユニットテスティング︓別々にテストできるソフトウェア構成要 素を切り離し、それぞれの働き(functioning)を検証する。前後関係 (context)に依存して、これらは独⽴したサブプログラミングであったり、 密接に結合された単位から作られた、より巨⼤なコンポーネントだったり する。 ■ SQuBok – 単体テスト︓モジュールやクラスなどテストが実施可能な部分をテス トする。 (アーキテクチャや単体テストツールを駆使してプログラムの最⼩単位(コンポーネント)ごとに テストするのをデファクトスタンダードにしたいけど実態は) テストできる最⼩単位を切り離して検証するテスト

Slide 8

Slide 8 text

システムテストなら。。 ■ テスト設計 – ⽂献にテストタイプとかの説明がもっと詳しく書いてある ■ 多くの場合、エンドツーエンドのタスクに対する機能テストや品質特性に対す る⾮ 機能テストといったシステムやプロダクト全体の振る舞いや能⼒の全般 に焦点を当てる。⼀部の⾮機能 品質特性については、本番相当のテスト環境 において、すべて揃ったシステムでテストすることが望ま しい(例えば、使 ⽤性テスト)。サブシステムのシミュレーションを使⽤することも可能である。 シス テムテストは、システムの仕様に関連するものであり、独⽴したテスト チームによって実施されること がある(JSTQBより)。 – テスト技法に⾔及する⽂献の多くがシステムテストに類するテストを事例 としており、イメージしやすい。 ■ ⼈事管理システム(はじめて学ぶテスト技法) ■ Webサイトの⾒直し(マインドマップから始まるテストウェアテスト)

Slide 9

Slide 9 text

単体テストだと。。 ■ 古典は「じゃあどうやってテストするのよ︕」って本が多い – ホワイトボックステストっていいますが・・・ – スタブ・ドライバ使うんです︕って書いてあるけどそれ、どうやって作るの︖ – 書いてあっても製品コードが古すぎて参考にならない。 ■ 最近の本はいきなり「コードで書くもの︕⼿動何それおいしいんですか︖」 「ツール使え︕」って前提の本が多い – ⾃動テストをデファクトスタンダードにしたいという思想が強い。 – ⼿段に偏っていることが多い。 – 古典との連続性がなく、概念を把握しにくい。 – 最近「単体テストもブラックボックステストでかくもの(キリッ)」までものが 出てきてもはや何⾔ってるかわからない。

Slide 10

Slide 10 text

単体テストは知っとくべき ■ ⾃分のテストの前にどんなテストが⾏われていたかは把握しておく必要がある – ⾃分のテストを計画・分析・設計するときに必要 ■ 「これまで何がテストされてきたか」 ■ 「どういうバグが残っていることが想定されるか」 – バグやテスト結果の分析に必要 ■ 「なぜこのバグが残っているのか」 ■ 「これからどうすればいいのか」

Slide 11

Slide 11 text

単体テストソムリエになろう︕

Slide 12

Slide 12 text

⾃⼰紹介 ■ ⼭⼝ 寛⼦ ■ SN︓@scarletplover ■ ⾦融系の会社で⾦融系じゃないSIer ■ どちらかというと猫派(本当は狐派) ■ 最近キックボクシング始めました。

Slide 13

Slide 13 text

このセッションでやりたいこと ■ 概念としての単体テストを捉えられるようになること ■ 単体テストの勉強の仕⽅がわかる ■ 最新の単体テスト技術はほっとんど出てきませんごめんなさい。

Slide 14

Slide 14 text

このセッションの内容 ■ 単体テストとは – 単体テストとは – 単体テストで重要な要素 ■ 単体テストソムリエになろう(ワーク) ■ 最後に

Slide 15

Slide 15 text

単体テストとは

Slide 16

Slide 16 text

いきなりワーク ■ 基本、このセッションのワークはペアで⾏います。 ■ 班で2⼈×3グループに分かれてください︕ ⾮公開

Slide 17

Slide 17 text

単体テスト ■ テストは1968年のNATOソフトウェア⼯学会議で「ソフトウェア危機」って⾔葉が出てきてか ら本格的に語られるようになったっぽい。 ■ しかし、1960年代は⼯程は「テスト」のみで、テストレベルみたいなものは存在しなかっ たっぽい。 ■ 1979年のマイヤーズの「ソフトウェア・テストの技法」くらいで「仕様に対するテスト」と いう考え⽅が出てきて、「モジュールテスト」って⾔葉が誕⽣したっぽい。 ■ 現在はV字モデルをもとに単体テストが語られる場合が多い 要求 基本設計 詳細設計 実装 ④ 受け⼊れテスト ③ システムテスト ② 統合テスト ① コンポーネントテスト リグレッションテスト コードレビュー ソースコード

Slide 18

Slide 18 text

単体テストとは テストできる最⼩単位を切り離して検証するテスト 「最⼩の」「細かい」など、とても抽象的であるうえに、プロダクトのアー キテクチャに左右される。 アーキテクチャの末端をテストすることとなり、技術の変遷の影響を受けや すく、体系的に本質を学ぶのが難しい。 プログラミングにおいて、プログラマが決めていることは意外と多い。 プロジェクト・個⼈ごとに違うテストになりやすい。

Slide 19

Slide 19 text

単体テストでの⼤事な要素 ■ テストなので、「テスト対象=どの単位でテストするか」「ど こに着⽬してテストを作成するか︖」が⼤事 ■ 単体テストはプログラムの中のことを確認しなくてはならないので、何 かとツールが必要。よって「どう実施するか」も重要になる。実施 ⽅法によってテスト対象や着⽬点が制約を受けることもしばしばある。 ■ 現場によっては「単体テスト」に「統合テスト」を含んでいる場合もあ る。また静的テストで実装内容を確認しているかどうかによって単体テ ストのケースが変わることがある。よって「前後のテスト⼯程」を 勘案する必要がある。 ■ プロジェクトのプログラミング⼯程は1⼈じゃないため、上記の事項に おいて「どこまで共有・ルール化しているか」でプロジェクトと しての単体テストの質が変わる。

Slide 20

Slide 20 text

単体テストの⼤事な要素 どの単位でテストするか どこに着⽬してテストを作成するか︖ どう実施するか 前後のテスト⼯程は何か チームで共有しているか

Slide 21

Slide 21 text

単体テストの⼤事な要素 どの単位でテストするか どこに着⽬してテストを作成するか︖ どう実施するか 前後のテスト⼯程は何か チームで共有しているか

Slide 22

Slide 22 text

どの単位でテストするか ■ 基本的には「モジュール」だが・・・ – クラス・関数・コンポーネント・・・ – コンパイルされたプログラムの場合もある。 ■ 時代によって凝集性が上がり結合度が下がっている。 「モジュール」の中⾝がどんなものかは把握しておく必要がある。 – 1960年以前︓芸術品としてのプログラム・・・プログラマ頼み – 1960年代〜︓構造化プログラミング・・・制御構造 ブロック化 – 1990年代〜︓オブジェクト指向・・・カプセル化 再利⽤ ? メイン ⼊⼒項⽬のチェッ ク 料⾦計算 印刷 メインルーチン ⼊⼒チェック 料⾦計算 印刷 メイン ⼊⼒項⽬のチェッ ク 料⾦計算 印刷 メインルーチン ⼊⼒チェック 料⾦計算 印刷 インプット ビジネス ロジック アウトプット オブザーバー 属性 操作 ビュー クラス 属性 操作 コントローラー クラス 属性 操作 モデル クラス 属性 操作 モデル クラス 属性 操作

Slide 23

Slide 23 text

単位の種類 ■ モジュールにも⾊々ある – 画⾯ – DBに接続する – ビジネスロジック – 処理の順番を管理する ■ モジュールによって単体テストの意 味やしやすさが違う – ビジネスロジックはロジック 単位でテストできる – 画⾯はどっかで⼈間の⽬視が 必要 – DBは実際にDBに繋がないとテ ストできない部分がある。 ビジネスロジックな どは単独でテストし やすい コントローラーやDB 周り、UI周り は単体でテストしに くい

Slide 24

Slide 24 text

単位が「複数」なことも ■ 単⼀のモジュール・クラス・プログラムじゃないこともある。 お⾦ロジック ドル通貨ロ ジック 振る舞い単位 (テスト駆動開発より⾦額計算) フラン通貨ロ ジック

Slide 25

Slide 25 text

単体テストの要素 どの単位でテストするか どこに着⽬してテストを作成するか︖ どう実施するか 前後のテスト⼯程は何か チームで共有しているか

Slide 26

Slide 26 text

どこに着⽬してテストするか ■ 単体テストで確認する仕様 – ビジネスロジック – UIの⾒た⽬ ■ 単体テストで確認するアーキテクチャ – 他の単位とのインターフェース(クラス間など) – 他の単位とのコミュニケーション(クラス呼び出しなど) – 状態の変化(セッション、画⾯の状態など) ■ 開発者が決める実装内容 – メソッド・変数の名前 – 処理の細かいロジック – 処理順序

Slide 27

Slide 27 text

どこに着⽬してテストするか ■ 単体テストで確認する仕様 – ビジネスロジック – UIの⾒た⽬ ■ 単体テストで確認するアーキテクチャ – 他の単位とのインターフェース(クラス間など) – 他の単位とのコミュニケーション(クラス呼び出しなど) – 状態の変化(セッション、画⾯の状態など) ■ 開発者が決める実装内容 – メソッド・変数の名前 – 処理の細かいロジック – 処理順序 ここにフォーカスしたテス トケースを作成するのが 原則

Slide 28

Slide 28 text

どこに着⽬してテストするか ■ 単体テストで確認する仕様 – ビジネスロジック – UIの⾒た⽬ ■ 単体テストで確認するアーキテクチャ – 他の単位とのインターフェース(クラス間など) – 他の単位とのコミュニケーション(クラス呼び出しなど) – 状態の変化(セッション、画⾯の状態など) ■ 開発者が決める実装内容 – メソッド・変数の名前 – 処理の細かいロジック – 処理順序 基本はアーキテクチャとし てのインターフェースやコ ミュニケーション、状態変 化に落ちる テストケースはアーキテク チャのインターフェースに 依拠するはず

Slide 29

Slide 29 text

どこに着⽬してテストするか ■ 単体テストで確認する仕様 – ビジネスロジック – UIの⾒た⽬ ■ 単体テストで確認するアーキテクチャ – 他の単位とのインターフェース(クラス間など) – 他の単位とのコミュニケーション(クラス呼び出しなど) – 状態の変化(セッション、画⾯の状態など) ■ 開発者が決める実装内容 – メソッド・変数の名前 – 処理の細かいロジック – 処理順序 ここはいわば実装部分。 変更が多いため、ここを起 点にテストをすると保守性 が低くなる

Slide 30

Slide 30 text

どこに着⽬してテストするか ■ 単体テストで確認する仕様 – ビジネスロジック – UIの⾒た⽬ ■ 単体テストで確認するアーキテクチャ – 他の単位とのインターフェース(クラス間など) – 他の単位とのコミュニケーション(クラス呼び出しなど) – 状態の変化(セッション、画⾯の状態など) ■ 開発者が決める実装内容 – メソッド・変数の名前 – 処理の細かいロジック – 処理順序 ここにフォーカスしたテス トケースを作成するのが 原則

Slide 31

Slide 31 text

複雑さをどうテストするか ■ 開発者が決める実装内容のみにフォーカスしたテストをして はいけないが、問題がないかの検証は必要 →単体テストまでに潰しておく必要がある ■ 複雑さをどうテストするか – 基本は全てテストで実⾏されていない経路がないことを 確認する(カバレッジ)。 ■ 命令網羅︓ – すべての命令が少なくとも⼀回は実⾏されるようにテ ストを設計する。 ■ 分岐網羅︓ – 判定条件の結果として、真になる場合と偽になる場合 がそれぞれ少なくとも⼀回は出現するようにテストを 設計する。 ■ 条件網羅︓ – 条件判定における個々の条件について、すべての真偽 が少なくとも1回は出現するようにテストを設計する。

Slide 32

Slide 32 text

複雑さをどうテストするか ■ カバレッジは確保してるけどテストが不⼗分になるパターンに注意 – 組み合わせが⼗分にテストできていない – 境界値分析ができてない if(x == true || y == true){ return true; //x,yのどちらかが真だったら真 //x、y両⽅のパターンのテスト 要 } if(hoge >= 1 && hoge <=10){ return true; //1以上10以下だったら真 //境界値分析が必要 }

Slide 33

Slide 33 text

単体テストの要素 どの単位でテストするか どこに着⽬してテストを作成するか︖ どう実施するか 前後のテスト⼯程は何か チームで共有しているか

Slide 34

Slide 34 text

どう実施するか ■ ⼿動か⾃動か – UI関連はどっかで⽬視が必要になる場⾯ が存在する – ⾃動については「何でテストするか」 でできることがだいぶ変わる ■ 昔は頑張って呼び出し元プログラムを 偽造できるようにシステムを作成しな ければ⾃動テストできなかった。 ■ 今はmockなどの技術が発達し、そこま で頑張って意識しなくても⾃動テスト できるようになった。 ■ より⼩さいところからテストできるよ うになるのが理想。 ■ テスト記録ツール – 単体テストツールには⾃動でついてる が⼿動でもテスト内容を記録し、カバ レッジ率を計ってくれるものが存在。 テストした いクラス 呼ばれるモ ジュール 呼ばれるモ ジュール mockで偽造する

Slide 35

Slide 35 text

単体テストの要素 どの単位でテストするか どこに着⽬してテストを作成するか︖ どう実施するか 前後のテスト⼯程は何か チームで共有しているか

Slide 36

Slide 36 text

前後のテスト⼯程について ■ 単体の統合について – 現場では「モジュールテスト+統合テスト」を単体テストと呼んでいると ころも多い ■ マイヤーズでは「モジュールテスト」の章にモジュールテスト + 統合テ ストが書かれている。 – テストの実施⽅法によってはモジュールテストがやりにくいところもある。 ■ DB周りや画⾯では統合した上でテストをすることが推奨されるクラスも ある – ⼤事なのは「最⼩の単位」の統合をどう考えているのか ボトムアップでの 統合 トップダウンでの 統合

Slide 37

Slide 37 text

前後のテスト⼯程について ■ 静的テストについて – 開発者が決める仕様については、開発者のコードレビューを実施している ことが望ましい – コードの書き⽅によって、テスト内容が変わる。 配列を結合する例 let ⼊⼒配列 = [“あ”,”い”,”う”,”え”,”お”]; let 結果; for(let i = 0; i <5 ;i++){ 結果=結果+⼊⼒配列[i]; //ぐるぐる回して結合 } return 結果; let ⼊⼒配列 = [“あ”,”い”,”う”,”え”,”お”]; let 結果=⼊⼒配列.join(“”);

Slide 38

Slide 38 text

単体テストの重要な要素 どの単位でテストするか どこに着⽬してテストを作成するか︖ どう実施するか 前後のテスト⼯程は何か チームで共有しているか

Slide 39

Slide 39 text

テストの内容を共有しているか ■ 世の中には「テスト内容は開発者に任せている」「⾃動テストができる⼈だけ ⾃動テストをやっている」という現場が存在する。 ■ テストの単位、着眼点、⼿段についてチームでどこまで平仄をとっているかは チーム次第である。 – ⾃動テストを必ずやる。コードカバレッジ100% – テストを⾏う単位ややる内容、粒度は決まっているが⼿段は決まっていな いetc… ■ また決められた単体テストのルールを守っているかをどう確認しているかも チームによって違う。 – コードレビュー – テスト仕様書レビュー – エビデンス確認

Slide 40

Slide 40 text

単体テストの重要な要素 どの単位でテストするか どこに着⽬してテストを作成するか︖ どう実施するか 前後のテスト⼯程は何か チームで共有しているか

Slide 41

Slide 41 text

単体テストの重要な要素 どの単位でテストするか どこに着⽬してテストを作成するか︖ どう実施するか 前後のテスト⼯程は何か チームで共有しているか 単体テストの内容を整理し、問題点や改善点を⾒出せる︕

Slide 42

Slide 42 text

チームレジェンドの単体テストの例 ■ チーム︓ クライアントサーバーシステムで画⾯側のWindowsフォームを作成。 ■ 困りごと︓ 直感的に単体テスト(開発者テスト)で出るバグがシステムテストで出ている。 ■ 単体テスト︓ 単体テストの単位 画⾯ごとのテスト。ビジネスロジックも基本は画⾯ごと。 ⼿段 ⼿動。 着眼点 画⾯の⼊⼒情報と画⾯状態に着⽬してテストケースを作成。 テスト仕様書を作成してテストしている。組み合わせも考慮さ れている。 次のテスト⼯程 システムテスト 共有 上記事項については共有されており、テスト仕様書を業務SEが レビューしている。 コードのカバレッジが図られていないため、テストされてないコード上の分岐があるのでは︖ 画⾯ごとではなく、ロジックごとにテストができるようにするのが理想。 せめてテスト記録ツールを⼊れるなどして、単体テストがしやすい環境にするのが良い。 ー

Slide 43

Slide 43 text

チーム最近の単体テストの例 ■ チーム︓ WEBサービスのフロントエンドをREACTで組んでいる。 ■ 困りごと︓ 直感的に単体テスト(開発者テスト)で出るバグがシステムテストで出ている。 ■ 単体テスト︓ 単体テストの単位 WEBのUI画⾯部品(⼊⼒フォーム部分とか)ごと、ロジック部 分(APIとの接続)は関数ごと。 ⼿段 Reactのテストフレームワークで⾃動テストをやっている。 着眼点 基本はUIのインプット情報ごとにテストケースのコードをTDD で書いている。コードカバレッジ100%。 次のテスト⼯程 次がもうシステムテスト 共有 上記事項については共有されており、コードレビューもしてい る。 統合をどこでやっているか曖昧。 単体テストについて、テストとしての観点が少なく、境界値分析がやられていなのでは︖

Slide 44

Slide 44 text

単体テストソムリエに なろう

Slide 45

Slide 45 text

⾮公開︕

Slide 46

Slide 46 text

最後に

Slide 47

Slide 47 text

単体テストの重要な要素 どの単位でテストするか どこに着⽬してテストを作成するか︖ どう実施するか 前後のテスト⼯程は何か チームで共有しているか

Slide 48

Slide 48 text

単体テストは これからも変わっていきます ■ 単体テストは実施⽅法やソフトウェアアーキテクチャによって、テスト対象や 何をテストするかが変わってしまいます。 ■ それとなく単体テスト、ソフトウェアアーキテクチャについて継続的に学んで おくことが、システムテストをやる上で助けになります︕ 単体テストソムリエになろう︕

Slide 49

Slide 49 text

参考⽂献 ■ ⽇本科学技術連盟. 「ソフトウェア品質知識体系ガイド(第3版)-SQuBOK Guide V3-」. ⽇本科学技術連盟.,2020 ■ 新⾕勝利. (2013). 「ソフトウェアエンジニアリング基礎知識体系ガイド - SWEBOK V3.0 -.」 ⽇本規格協会, 2013 ■ ロバート・C・マーティン. 「クリーンアーキテクチャ ソフトウェア設計の原則とパターン」. 翔泳社, 2018. ■ NPO法⼈ASTER. 「ASTERセミナー標準テキスト」. https://www.aster.or.jp/business/seminar_text.html, (参照 2023-12ー18) ■ グレンフォード・J・マイヤーズ, トム・バジェット, テッド・M・トーマス, コーリー・サンドラー. 「ソフトウェア・テス トの技法」. 近代科学社, 2006. ■ 児⽟公信. 「UMLモデリングの本質」. 翔泳社, 2011. • JSTQB. 「テスト技術者資格制度 Foundation Level シラバス 」. https://jstqb.jp/dl/JSTQB-SyllabusFoundation_VersionV40.J01.pdf, (Version 2023V4.0.J01) ■ ⾠⺒敬三. 「ソフトウェアテストの歴史と近年の動向」. https://www.slideshare.net/Bugler/ss-139696080, (参照 2023-12ー18) ■ Vladimir Khorikov,.「単体テストの考え⽅/使い⽅」(Vladimir Khorikov, 須⽥智之著) ■ 本スライドのアイコンの著作権はLeremyにあります(www.freepik.com)

Slide 50

Slide 50 text

おわり ご清聴ありがとうございました︕