Slide 1

Slide 1 text

PHP Unit Test workshop #engineers_lt #laraveljpcon 企画:エンジニアの登壇を応援する会 / ワークショップチーム 制作:Tadouma, よしたく, FORTE, ariaki

Slide 2

Slide 2 text

Laravel Conference JP はじめに ● PHP 7.1 以上が動作する PC が必要です ● PHP の基本構文を理解されている方が対象です ● PHPUnit 最新版のインストール が必要です(※セッション内で準備します) ● 以下をダウンロードする必要があります https://github.com/engineers-lt/laracon ● Wi-Fi 端末を希望の方はスタッフまでお声がけください 注意事項 2

Slide 3

Slide 3 text

Laravel Conference JP はじめに ● 説明時間と解答時間をそれぞれ設けます ○ 解答時間は自由に課題を解いてください ○ 課題を多く準備していますので、すべてを解く必要はありません ○ 解答例はダウンロードできますので、いつでも確認できます ● 質問は気軽にスタッフを呼び止めてください ● 解答時間中は、自由に途中入退室していただいて構いません ワークショップの流れ 3

Slide 4

Slide 4 text

Laravel Conference JP はじめに このワークショップで配布される問題及び解答例は必ずしも最善なコードとは限りません。 また入念な確認を行っておりますが、すべての環境における動作の正確性を保証しません。 少しでも疑問に思った箇所がありましたら、必ず公式マニュアルをご参照ください。 また、改善点などあれば是非スタッフまでご共有ください。 免責事項 4

Slide 5

Slide 5 text

Laravel Conference JP 5 はじめに @nekokotlin @yoshitaku_jp @kuwahara_jsri @FORTEgp05 @chiroruxxxx @ariaki4dev 本日のスタッフ

Slide 6

Slide 6 text

制作/登壇 Tadouma @nekokotlin よしたく @yoshitaku_jp FORTE @FORTEgp05 ariaki @ariaki4dev chiro @chiroruxxxx k-kuwahara @kuwahara_jsri tetsunosuke @tetsunosuke ねむ @nemu1986 さっぴー川原 @sapi_kawahara スライド作成 協力 6

Slide 7

Slide 7 text

Laravel Conference JP テストのメリット・デメリットを再確認 Tadouma | @nekokotlin 7

Slide 8

Slide 8 text

Laravel Conference JP 8 はじめに 自己紹介 Tadouma | @nekokotlin 趣味 ● 筋トレ ● 腹筋ローラー大好き ● 猫大好き ● 初心者(Laravel/Kotlin)

Slide 9

Slide 9 text

Laravel Conference JP 9 はじめに このセクションで伝えること テストの概要 自動テストのメリット/デメリット 1 2

Slide 10

Slide 10 text

Laravel Conference JP 10 テストの概要

Slide 11

Slide 11 text

Laravel Conference JP 11 テストの概要 ● プログラムが仕様どおりに動作するのを確認すること ● プログラミングの欠陥を見つける作業のこと ● テストコードを書くことで自動化できるもの テストの定義

Slide 12

Slide 12 text

Laravel Conference JP 12 テストの概要 ● 様々な観点で分類が可能 ○ 工程での分類 ○ 技法での分類 ● 自動テストについて テストの種類

Slide 13

Slide 13 text

Laravel Conference JP 13 テストの概要 ● 工程での分類 ○ 単体テスト ■ 関数、メソッド単位のテスト ○ 結合テスト ■ 単体テストで検証したプログラムを組み合わせて行うテスト ○ システムテスト ■ 実運用を想定したテスト テストの種類

Slide 14

Slide 14 text

Laravel Conference JP 14 テストの概要 ● 技法での分類 ○ ホワイトボックステスト ■ 過程・処理が正しいか試すテスト ○ ブラックボックステスト ■ 出力結果が正しいか試すテスト ○ モンキーテスト ■ 対象箇所や操作手順を定めずに、思いつきで操作するテスト テストの種類

Slide 15

Slide 15 text

Laravel Conference JP 15 テストの概要 ● 自動テストフレームワーク ○ PHPUnit ■ いわゆるxUnit系 ○ Laravelフレームワーク ■ PHPUnitが標準搭載 自動テストについて

Slide 16

Slide 16 text

Laravel Conference JP 16 自動テストのメリット/デメリット

Slide 17

Slide 17 text

Laravel Conference JP 17 自動テストのメリット・デメリット ● コードの品質向上、正確性向上 ● コスト削減 ● 保守性の向上 ● 開発者のスキルアップ ● 仕様の把握や仕様漏れの減少 メリット

Slide 18

Slide 18 text

Laravel Conference JP 18 自動テストのメリット/デメリット ● コードの品質向上、正確性向上 ○ 自分のミスに気づく ○ 大規模プロジェクトや大量データを扱う際に役立つ ○ リグレッションの発見 ● コスト削減 ○ テスターに任せず自動テストでのカバー ○ テストカバレッジの提出がラクに ○ ロジックの正確性が担保され、レビュー時間も削減 メリット

Slide 19

Slide 19 text

Laravel Conference JP 19 自動テストのメリット/デメリット ● 保守性の向上 ○ リファクタリングを安心して行える ● 開発者のスキルアップ ○ テストを書くことによって実コードの書き方に工夫が生まれた ○ 初心者にとっては想定範囲を広げることにつながった ● 仕様の把握や仕様漏れの減少 ○ 仕様の確認ができる ○ その結果仕様漏れや仕様の不具合に気づける メリット

Slide 20

Slide 20 text

Laravel Conference JP 20 自動テストのメリット/デメリット ● 開発速度の低下 ○ 実装の2倍、テストコード作成の時間がかかった ● 学習コスト ○ 学習コストがかかり、炎上案件では全面的な導入が難しかった ● 保守コスト ○ プログラムの規模が大きくなる/仕様変更によりテストコードの修正が必要 デメリット

Slide 21

Slide 21 text

Laravel Conference JP 初めてのユニットテスト よしたく | @yoshitaku_jp 21

Slide 22

Slide 22 text

Laravel Conference JP 22 はじめに 自己紹介 よしたく | @yoshitaku_jp サッカー 漫画 趣味 アウトプット ブログ → https://yoshitaku-jp.hatenablog.com/ #write_blog_every_week

Slide 23

Slide 23 text

Laravel Conference JP 23 はじめに このセクションで伝えること PHPUnit の紹介 PHPUnit のインストール PHPUnit の使い方 ワークショップ 1 2 32 4

Slide 24

Slide 24 text

Laravel Conference JP 24 PHPUnit の紹介

Slide 25

Slide 25 text

Laravel Conference JP 25 PHPUnit の紹介 ● PHP 向けのユニットテストフレームワーク ○ xUnit の PHP 版 ● 最新版は PHPUnit 8(2019/2/16時点) ● PHP 7.2 - 7.4 に対応 ● Laravel に標準搭載 ● PHP のテストツールとしては一番使われている ○ phpspec ○ Atoum PHPUnit とは

Slide 26

Slide 26 text

Laravel Conference JP 26 PHPUnit のインストール

Slide 27

Slide 27 text

Laravel Conference JP 27 PHPUnit のインストール 以下のコマンドで、必要なモジュールをダウンロードする ※ワークショップ用 GitHub リポジトリは初期設定済のため、インストールのみで良い PHPUnit のインストール方法(ワークショップ用リポジトリ) composer install ※インストールに成功すると、以下のようなファイル/ディレクトリが作成される vendor

Slide 28

Slide 28 text

Laravel Conference JP 28 PHPUnit のインストール 以下のコマンドで、composer を使用して最新版をインストールする PHPUnit のインストール方法(初期ディレクトリ) composer require phpunit/phpunit --dev ※インストールに成功すると、以下のようなファイル/ディレクトリが作成される vendor composer.json composer.lock

Slide 29

Slide 29 text

Laravel Conference JP 29 PHPUnit のインストール 以下のコマンドで、インストールされた PHPUnit のバージョンを確認する PHPUnit のインストール方法 vendor/bin/phpunit --version ※「PHPUnit 7.5.3 by Sebastian Bergmann and contributors.」のようにバージョンが表示されたら成功

Slide 30

Slide 30 text

Laravel Conference JP 30 PHPUnit の使い方

Slide 31

Slide 31 text

Laravel Conference JP 31 PHPUnit の使い方 はじめてのテスト 以下のように「Hello, world」を返却するクラスのテストコードを書いてみよう

Slide 32

Slide 32 text

Laravel Conference JP 32 PHPUnit の使い方 はじめてのテスト 前ページのテストケースは以下のように書く

Slide 33

Slide 33 text

Laravel Conference JP 33 PHPUnit の使い方 TestCase を継承したクラスを作成する test から始まるメソッドでテストを記述する 引数両者の値が一致する場合は成功としてテストケースを設定する

Slide 34

Slide 34 text

Laravel Conference JP 34 PHPUnit の使い方 ● Hello という名前のクラスのテストは、HelloTest という名前のクラスに記述します ● テストクラスは、ほとんどの場合 PHPUnit\Framework\TestCase を継承します ● テストメソッドは、test から始まるパブリックメソッドになります ● テストメソッドの中で assertEquals() のようなアサーションメソッドを記載します ● 困った場合はマニュアルを参照しましょう ( https://phpunit.readthedocs.io/ja/latest/index.html ) はじめてのテスト

Slide 35

Slide 35 text

Laravel Conference JP 35 PHPUnit の使い方 以下のコマンドで、テストを実行します はじめてのテスト vendor\bin\phpunit HelloTest PHPUnit 8.0.2 by Sebastian Bergmann and contributors. . 1 / 1 (100%) Time: 308 ms, Memory: 4.00MB OK (1 test, 1 assertion) 全てのテストが成功したら以下のように表示されるでしょう

Slide 36

Slide 36 text

Laravel Conference JP 36 PHPUnit の使い方 いずれかのテストに失敗した場合は以下のように表示されます はじめてのテスト PHPUnit 8.0.2 by Sebastian Bergmann and contributors. F 1 / 1 (100%) Time: 327 ms, Memory: 4.00MB There was 1 failure: 1) HelloTest::testGetMessage Failed asserting that two strings are equal.  :(中略) FAILURES! Tests: 1, Assertions: 1, Failures: 1.

Slide 37

Slide 37 text

Laravel Conference JP 37 PHPUnit の使い方 ● 一致 ● 真偽値 ● 文字列比較 ● 数値比較 ● その他 アサーションメソッドの種類

Slide 38

Slide 38 text

Laravel Conference JP 38 PHPUnit の使い方 ● 一致 アサーションメソッドの種類 assertEquals() 引数の両者が等しくない場合にエラー assertSame() 引数の両者が同型同値でない場合にエラー assertNull() 引数の両者が Null でない場合にエラー

Slide 39

Slide 39 text

Laravel Conference JP 39 PHPUnit の使い方 ● 真偽値 アサーションメソッドの種類 assertTrue() 引数が True 以外の場合にエラー assertFalse() 引数が False 以外の場合にエラー

Slide 40

Slide 40 text

Laravel Conference JP 40 PHPUnit の使い方 ● 文字列比較 アサーションメソッドの種類 assertRegExp() 引数が指定された正規表現に合致しない場合にエラー assertStringMatchesFormat() 引数が指定された書式に合致しない場合にエラー assertStringStartsWith() 引数が指定された文字列から開始されない場合にエラー assertStringEndsWith() 引数が指定された文字列で終了しない場合にエラー

Slide 41

Slide 41 text

Laravel Conference JP 41 PHPUnit の使い方 ● 数値比較 アサーションメソッドの種類 assertGreaterThan() 引数が指定された値より大きくない場合にエラー assertGreaterThanOrEqual() 引数が指定された値以上でない場合にエラー assertLessThan() 引数が指定された値より小さくない場合にエラー assertLessThanOrEqual() 引数が指定された値以下でない場合にエラー

Slide 42

Slide 42 text

Laravel Conference JP 42 PHPUnit の使い方 ● その他 ○ 配列系 ■ assertArrayHasKey, assertArraySubset, ... ○ クラス系 ■ assertClassHasAttribute, ... ○ ファイル系 ■ assertFileExist, assertFileEquals, assertFileIsReadable, assertFileIsWritable, ... ○ ディレクトリ系 ■ assertDirectoryExists, assertDirectoryIsReadable, assertDirectoryIsWritable, ... アサーションメソッドの種類

Slide 43

Slide 43 text

Laravel Conference JP 43 PHPUnit の使い方 引数は以下のとおり assertEquals(mixed $expected, mixed $actual[, string $message = ’’]) $expected 期待値を記述する(※実際値と一致した場合にテストが通過する) $actual 実際値を記述する(※テストメソッドの実行結果など) $message テスト失敗時に表示するメッセージ assertEquals()

Slide 44

Slide 44 text

Laravel Conference JP 44 ワークショップ

Slide 45

Slide 45 text

Laravel Conference JP 45 ワークショップ ● 課題をたくさん準備していますので、時間内に全問解答する必要はありません ● 不明点があれば気軽にスタッフまで声をかけてください ● ワークショップに必要な各ファイルは以下よりダウンロード可能です https://github.com/engineers-lt/laracon 注意点

Slide 46

Slide 46 text

Laravel Conference JP 46 ワークショップ 課題 Hello World をテストしよう 消費税計算をテストしよう FizzBuzz をテストしよう 各月の日数をテストしよう 1 2 32 4

Slide 47

Slide 47 text

Laravel Conference JP 47 ワークショップ ● 「Hello World」を返却するクラスをテストしよう https://github.com/engineers-lt/laracon/blob/master/src/basic/WS1.php 1. Hello World をテストしよう

Slide 48

Slide 48 text

Laravel Conference JP 48 ワークショップ ● 単価と税率から税込金額を返却するクラスをテストしよう ○ 対象メソッドに引数がある場合にどう動くか確認しよう ○ 別の値を入れたときも動くか確認しよう https://github.com/engineers-lt/laracon/blob/master/src/basic/WS2.php 2. 消費税計算をテストしよう

Slide 49

Slide 49 text

Laravel Conference JP 49 ● FizzBuzz クラスをテストしよう ○ 引数が 3 の場合にどんな動きをするか確認しよう ○ 引数が 5 の場合にどんな動きをするか確認しよう ○ 引数が 15 の場合にどんな動きをするか確認しよう ○ 引数が上記以外の場合にどんな動きをするか確認しよう https://github.com/engineers-lt/laracon/blob/master/src/basic/WS3.php ワークショップ 3. FizzBuzz をテストしよう

Slide 50

Slide 50 text

Laravel Conference JP 50 ● 月から日数を返却するクラス をテストしよう ○ 各月の日数が正しいか確認しよう ○ 存在しない月の場合の動作を確認し、例外に対処しよう https://github.com/engineers-lt/laracon/blob/master/src/basic/WS4.php ワークショップ 4. 各月の日数をテストしよう

Slide 51

Slide 51 text

Laravel Conference JP 51 課題の解答時間は 14:20 までです ● 自由に休憩して頂いて構いません ● 質問はお気軽にスタッフまで声をかけてください

Slide 52

Slide 52 text

Laravel Conference JP 本格的なテストのワークショップ FORTE | @FORTEgp05 Laravel Conference JP 52

Slide 53

Slide 53 text

Laravel Conference JP 53 はじめに 自己紹介 FORTE | @FORTEgp05 53 53 aozora.fm → https://fortegp05.github.io/aozorafm/ 技術書典6で『はじめる技術 つづける技術』を頒布予定  詳しくは #はじめる技術つづける技術 まで! アウトプット

Slide 54

Slide 54 text

Laravel Conference JP 54 はじめに このセクションで伝えること 課題の説明 ワークショップ 54 54 1 2

Slide 55

Slide 55 text

Laravel Conference JP 55 課題の説明 55 55

Slide 56

Slide 56 text

Laravel Conference JP 56 課題の解答時間は 15:50 までです ● 自由に休憩して頂いて構いません ● 質問はお気軽にスタッフまで声をかけてください 56 56

Slide 57

Slide 57 text

Laravel Conference JP 57 エンジニアの登壇を応援する会 connpass https://engineers.connpass.com/ TECH PLAY https://techplay.jp/community/engineers-lt http://bit.ly/elt-slack Slack

Slide 58

Slide 58 text

Laravel Conference JP 58 アンケート bit.ly / laracon-enquete

Slide 59

Slide 59 text

エンジニアの登壇を応援する会 http://portal.engineers-lt.info/