Slide 1

Slide 1 text

ソフトウェアテスト 2022新卒研修講義 2022/04/19 岡村啓二郎

Slide 2

Slide 2 text

講義・ハンズオン ・講義 10分  ‐ ソフトウェアテストと  ‐ 実務で使われているソフトウェアテスト 紹介 ・ハンズオン 80分  - 単体テスト  - DI  - テストダブル

Slide 3

Slide 3 text

講義 目標 ・ソフトウェアテストが何かを知る ・実務で使われているソフトウェアテスト 種類を知る

Slide 4

Slide 4 text

ソフトウェアテストと 何か

Slide 5

Slide 5 text

ソフトウェアテストと 公式 定義(IEEE) ある特定 条件化でシステムまた コンポーネント を操作するプロセスであり、 そ 結果を観察また 記録して、 システムまた コンポーネント ある側面を評価すること 引用: 日経BP社, 日経BPマーケティング, じめて学ぶソフトウェア テスト技法 p11

Slide 6

Slide 6 text

言い換えてみると... 様々なテストケースを作成し、 それに沿ってシステムを実行し、 ソフトウェア 品質を確かめる作業

Slide 7

Slide 7 text

ソフトウェア 品質 https://kyog02.hatenablog.com/entry/2019/11/17/012531

Slide 8

Slide 8 text

ど 品質を評価したいかによって ソフトウェアテスト 種類も変わってくる

Slide 9

Slide 9 text

ソフトウェアテスト 種類 ・単体テスト(ユニットテスト) ・結合テスト ・ステージ環境で リリース前テスト

Slide 10

Slide 10 text

単体テスト(ユニットテスト) ・クラスやメソッドなど、単一 プログラム テスト ・PHPUnit/unittest(python)/JUnit

Slide 11

Slide 11 text

単体テスト(ユニットテスト) 例 テスト対象 テストコード テスト実行

Slide 12

Slide 12 text

結合テスト ・複数 プログラム、モジュールを組み合わせたテスト ・実装中および完了後に行う

Slide 13

Slide 13 text

結合テスト ブラウザ DB アプリケーション API classA object const method method method method classB method classC ✅ ✅ ✅ log

Slide 14

Slide 14 text

ステージ環境で リリース前テスト ・機能要件を満たせているかどうかを確認する ・ユーザ 操作と同じことを行う

Slide 15

Slide 15 text

ステージ環境 本番DB 本番とほとんど同じ構成で構築された環境 DBやネットワークやサーバなどアプリケーション以外 構成が本番と同じ 本番環境 ステージ環境 本番サーバ 本番NW お客様 運営 ✅ ✅

Slide 16

Slide 16 text

まとめ ・ソフトウェアテスト ソフトウェア 品質を確かめる工程 ・ソフトウェア 品質 たくさんある ・社内で 主に3種 ソフトウェアテストが用いられている

Slide 17

Slide 17 text

ハンズオン

Slide 18

Slide 18 text

準備 ・F5 VPN Clientを終了(起動しているひとだけ) ・git clone https://github.com/keijiro-okamura/unittest-handson-2022 ・git checkout init_handson ・make init ・open http://localhost/horoscopes/ ・make test

Slide 19

Slide 19 text

単体テストを書くとどんな良いことが? ・良いこと 結合テスト時 デバッグが楽になる テストコードが仕様になる コード 品質があがる(テスト容易性) ・一方でこんな意見も ... テストコードを書く工数が発生する

Slide 20

Slide 20 text

目的 ・単体テストを書いてみる ・依存性注入(DI)をやってみる ・テストダブルを使ってみる

Slide 21

Slide 21 text

ハンズオン 流れ 学習 ・スライドで 用語 説明 ・実装例 解説 📝 体験 ・ライブコーディング ・お手本見ながら実践

Slide 22

Slide 22 text

テストケースを作ってみよう

Slide 23

Slide 23 text

テストケース作成に役立つ技法 ・ブラックボックステスト ・ホワイトボックステスト

Slide 24

Slide 24 text

ブラックボックステスト テスト対象 入力 出力  テスト対象 実装 中身 見えないも とし、要件や仕様から  それぞれ 入力値に対して、期待する出力値を決定し  実際に入力を行い、実際 出力値と期待する出力値 比較を行う 仕様例: 金額を入力として受け取り、 税込み金額を出力する 入力100, 期待する出力110

Slide 25

Slide 25 text

ホワイトボックステスト テスト対象 入力 出力 A B C D テスト対象 実際 内部構造を分析し、 テスト対象 ソフトウェア 特定 パスを実行するような入力を決定し、 実際に入力を行い、実際 出力値と期待する出力値 比較を行う 例: 下記 図で 、A->B, A->C->Dを経由する2パターン テストケースが考えられる if

Slide 26

Slide 26 text

📝 テストケース作成

Slide 27

Slide 27 text

ブラックボックステスト 誕生日を入力すると、誕生日/星座名が返却される

Slide 28

Slide 28 text

📝ブラックボックステスト src/tests/Feature/HoroscopesGetRequestTest.php

Slide 29

Slide 29 text

ホワイトボックステスト

Slide 30

Slide 30 text

📝ホワイトボックステスト src/tests/Feature/HoroscopesGetRequestTest.php

Slide 31

Slide 31 text

⚡ 仕様変更 ⚡

Slide 32

Slide 32 text

星座取得APIが完成した で そっちを使うようにしてください

Slide 33

Slide 33 text

📝仕様変更 src/app/Http/Controllers/HoroscopesController.php

Slide 34

Slide 34 text

📝 テストダブルを利用するために 実装を見直そう

Slide 35

Slide 35 text

📝 依存性注入(DI)

Slide 36

Slide 36 text

📝 DI前 src/app/Http/Controllers/HoroscopesController.php HoroscopesApiに依存している

Slide 37

Slide 37 text

📝 DI後(DIされる側) src/app/Http/Controllers/HoroscopesController.php HoroscopesInterfaceに依存 index 呼び出し側から好きなモジュールを注入できるようになった 🎉

Slide 38

Slide 38 text

📝 DI後(DIする側) src/app/Providers/AppServiceProvider.php サービスコンテナに登録しておくことで index()実行時に実装クラスが注入される ユニットテストから 、こ ようにして サービスコンテナ 上書き src/tests/Feature/HoroscopesGetRequestTest.php 💡 Laravel 機能

Slide 39

Slide 39 text

📝 DI

Slide 40

Slide 40 text

テストダブル

Slide 41

Slide 41 text

参考 https://goyoki.hatenablog.com/entry/20120301/1330608789 こちら ブログ記事から画像と説明を引用させていただいてます。

Slide 42

Slide 42 text

テストダブル テストダブルと 、テスト実行時に、 テスト対象が依存しているコンポーネントと置き換わるも ex. HoroscopesApi

Slide 43

Slide 43 text

間接入力と間接出力 間接入力: テストコードから見えないテスト対象へ 入力 間接出力: テストコードから見えないテスト対象 出力 ex. HoroscopesApi

Slide 44

Slide 44 text

間接入力と間接出力 間接入力: $horoscope_japanese_name テスト対象が依存するコンポーネント 間接出力: $birthday_yyyymmdd テスト対象

Slide 45

Slide 45 text

テストダブル 種類 ・ダミー ・スタブ ・モック ・スパイ ・フェイク

Slide 46

Slide 46 text

ダミー テストに影響を与えない代替オブジェクト

Slide 47

Slide 47 text

スタブ テスト対象へ 間接入力を操作できるも

Slide 48

Slide 48 text

📝スタブを使ったテスト src/tests/Feature/HoroscopesGetRequestTest.php スタブ化(間接入力)

Slide 49

Slide 49 text

モック 間接出力 期待結果を持ち、実際 間接出力と 比較判定を行う。 スタブ 機能を内包する場合もある

Slide 50

Slide 50 text

📝モックを使ったテスト HoroscopesInterfaceを実装したインスタンスで、 getJapaneseName関数が引数’19941107’で一度だけ実行される src/tests/Feature/HoroscopesGetRequestTest.php 間接出力 期待値

Slide 51

Slide 51 text

スパイ テスト対象 間接出力を記録し、参照可能にしたも

Slide 52

Slide 52 text

スパイを使ったテスト 間接出力 期待値

Slide 53

Slide 53 text

📝 今回 スタブとモックを 使ってテストを作成しましょう