Upgrade to Pro — share decks privately, control downloads, hide ads and more …

2022年度新卒技術研修「 ソフトウェアテスト」講義

2022年度新卒技術研修「 ソフトウェアテスト」講義

ソフトウェアテストの基礎を学ぶ講義です。ハンズオンも載せています。
・講義
 ・ソフトウェアテストの概要
 ・自社で取り扱われるソフトウェアテストを3種類紹介
  ・単体テスト
  ・結合テスト
  ・ステージング環境での受け入れテスト
・ハンズオン
 ・Laravelで構築されたサンプルアプリケーションを題材に単体テストを書く体験をする

excitejp
PRO

June 15, 2022
Tweet

More Decks by excitejp

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    log

    View Slide

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

    View Slide

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




    View Slide

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

    View Slide

  17. ハンズオン

    View Slide

  18. 準備
    ・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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  26. 📝 テストケース作成

    View Slide

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

    View Slide

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

    View Slide

  29. ホワイトボックステスト

    View Slide

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

    View Slide

  31. ⚡ 仕様変更 ⚡

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  35. 📝 依存性注入(DI)

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  39. 📝 DI

    View Slide

  40. テストダブル

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide