SlideShare a Scribd company logo
1 of 19
Download to read offline
Copyright © Xchange Solutions All right reserved.
Fukuoka.php Vol.17 ~Rebooted~
Laravelとテストについて
株式会社エクスチェンジ ソリューションズ
野田 健夫
2016.06.22
2
Copyright © Xchange Solutions All right reserved.
こんにちは!
野田 健夫(のだたけお)
https://twitter.com/nodatakeo
https://www.facebook.com/nodatakeo
株式会社エクスチェンジ ソリューションズ
3
Copyright © Xchange Solutions All right reserved.
今日の内容
1. 開発者に立ちはだかるテストの壁
2. なぜテストをやるのか?
3. テストの種類
4. テストへのジレンマ
5. Laravelテスト
 環境構築
 API編
 ウェブページ編
 その他
6. まとめ
4
Copyright © Xchange Solutions All right reserved.
開発者に立ちはだかるテストの壁
環境作るのが面倒くさい。
実装に比べて生産的でない感じがする。
単体テストはともかくとして、シナリオ
テストが作りにくい。
時間がない。
5
Copyright © Xchange Solutions All right reserved.
なぜテストをやるのか?
利用可能な状態を担保するため。
要件を満たしているか確認するため。
品質を高め、信頼性を上げるため。
システムが動かなかったり、品質が低いと
利用者・顧客の不利益になる。その
リカバリーにかかる作業コストも大きい。
6
Copyright © Xchange Solutions All right reserved.
テストの種類
単体テスト
結合テスト
システムテスト
メソッド・関数の期待値検査
APIスキーマ・HTMLコンテンツチェック
シナリオテスト・脆弱性テスト
パフォーマンス、ログ、サーバー周りなど
これまでテスト自動化に悩んでいた領域
→xUnitテスト
→debugbar、slowログ、jmeter、zabbixなど
※ウェブアプリケーションでの例
7
Copyright © Xchange Solutions All right reserved.
テストへのジレンマ
 テストの必要性は理解しているけど、コスト高い
のでは?
 自動テストでできる検査って、ロジック以下の
assertHoge系の値検査ぐらいしかなかったっけ?
調べてみたらLaravelでいろいろテストを
支援する仕組みが用意されていた。
8
Copyright © Xchange Solutions All right reserved.
Laravelのテスト: phpunit
よく使われているphpunitでのテストを
ベースとしている。
composer dump-autoload
./vendor/phpunit/phpunit/phpunit tests
composer dump-autoload
./vendor/phpunit/phpunit/phpunit --filter 'testContent' tests/api/ApiContentControllerTest.php
./tests 以下のテストケースをすべて実行する。
./tests 以下のテストケースのうち特定のテストクラスでfilterして実行する。
9
Copyright © Xchange Solutions All right reserved.
Laravelのテスト: 環境構築(Fixture)
 テストのフィクスチャ(Fixture:ベースとなるデー
タ設定)に Seederを使う。
過去の案件では、.envのAPP_ENVをみて、環境ごとに切り替えれるSeederを用意。
abstract class BaseSeeder extends Seeder
{
/**
* Get default seeds by table name
* @param $target table name
* @return void
*/
public function getConfig($target)
{
$config = require(base_path('database/seeds/default_'. config('app.env') . '.php'));
return array_get($config, $target);
}
}
class ContentSeeder extends BaseSeeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
//削除
Content::truncate();
// コンテンツのデータ追加
foreach ($this->getConfig('contents') as $record) {
$dao = new Content ();
$dao->setUpRecord($record);
$dao->save();
}
}
}
テストの初期状態を共有
10
Copyright © Xchange Solutions All right reserved.
Laravelのテスト: APIスキーマチェック
 seeJsonStructureメソッド
キー名の配列を渡して構造をチェック
 assertResponseStatus/assertResponseOkメソッド
HTTPステータスコードをチェック
// JSONパラメータ
$content = [];
// メソッド
$method = 'GET';
// URL
$url = route("contents.get");
// サーバー環境変数
$server = $this->getServerParameter($method, $url);
// JSONでAPIを呼び出し
$this->withServerVariables($server)
->json($method, $url, $content, $server);
// JSON構造のチェック
$this->seeJsonStructure([
'error',
‘content_list' => [
'*' => [
'id',
'title',
],
],
]);
// ステータスコードのチェック
$this->assertResponseStatus(200);
// レスポンス状態のチェック
$this->assertResponseOk();
11
Copyright © Xchange Solutions All right reserved.
Laravelのテスト: API値チェック
 seeメソッド
レスポンス中に値が含まれるか検査が可能。
 responseプロパティ
レスポンス自体も取得できるので、値を抜き出せば、従来のassert
チェックも可能。
$this->see('Laravel 5');
$response = json_decode($this->response->content(), true);
$this->assertEquals('Laravel 5', $response['title']);
12
Copyright © Xchange Solutions All right reserved.
Laravelのテスト: WEBコンテンツチェック
 visitメソッド
URLにアクセス。
 typeメソッド
指定IDフォームに入力。
 pressメソッド
指定IDボタンを押下。
 seePageIsメソッド
現在URL値をチェック。
$this->visit(route('admin.logout'));
$this->visit(route('admin.login'));
$this->type('a@aaa.com', 'login_id');
$this->type('testpw123', 'login_pw');
$this->press('action');
$this->seePageIs(route('admin.top'));
$this->see('TOPページ');
シナリオテストの動作チェックが可能。
13
Copyright © Xchange Solutions All right reserved.
Chrome Extension: Laravel TestTools
14
Copyright © Xchange Solutions All right reserved.
Chrome Extension: Laravel TestTools
開発ツール(ctrl+shift+i)のタブに「Laravel TestTools」が追加。
Selenium IDEの記録のような形で[Record]ボタンを押下すると
テストコードが生成されます。
15
Copyright © Xchange Solutions All right reserved.
DB値のチェック
seeInDatabaseメソッド
テーブル内に指定したキーのレコードがあるかチェック。
$this->seeInDatabase('users', ['email' => 'sally@example.com']);
16
Copyright © Xchange Solutions All right reserved.
Test用Trait
 Illuminate/Foundation/Testing/DatabaseMigrations.php (Trait)
 テスト開始時にマイグレーションを実行し、終了後にマイグレーションロールバックする。
 Illuminate/Foundation/Testing/DatabaseTransactions.php (Trait)
 テスト開始時にトランザクションを開始し、終了後にロールバックする。
 Illuminate/Foundation/Testing/WithoutEvents.php (Trait)
 すべてのイベントを抑止して余計な処理を発生させない。
 Illuminate/Foundation/Testing/WithoutMiddleware.php (Trait)
 すべてのミドルウェアを抑止して余計な処理を発生させない。
 Illuminate/Foundation/Testing/Conserns/* (Trait)
 テスト向けの各種実装。see*系(seeJsonStructureなど)は、ほかのフレームワークでも参考になると
思います。
17
Copyright © Xchange Solutions All right reserved.
まとめ
 テスト自動化は、テストの壁を低くする。
 開発してリリースしておしまいでなく、開発が継続する案件
が増えている。デグレを避けるためにも必須になりつつある
ように感じている。
 フレームワークが持っているテストの仕組みを使うことでAPI
スキーマテストやシナリオテストといったより複雑なテスト
自動化をシンプルに行うことができる。
 テストは放っておくと腐る。テストが適切に行われるよう仕
様変更や動作が変わった場合は、メンテナンスを必ず行う。
18
Copyright © Xchange Solutions All right reserved.
番外編:GuzzleでAPI/シナリオテスト
 GuzzleもAPIクライアントとしてだけでなく
テストにもシンプルで使い易いと思います。
public function __construct()
{
$this->endPoint = "https://hoge.jp";
$this->client = new HttpClient($this->endPoint);
}
/**
* OAuth 認証ページテスト
* @Test
*/
public function testAuthorization() {
$this->endPoint = “https://hogehoge.jp”;
$this->client = new HttpClient($this->endPoint);
// rfc6570
$uri = array(‘/auth/authorize?response_type={response_type}&client_id={client_id}&state={state}’,
array(‘response_type’ => ‘code’, ‘client_id’ => ‘demoapp’, ‘state’ => session_id()));
// リクエストを作成
$request = $this->client->get($uri);
// レスポンスを取得
$response = $request->send();
// 値検査
$this->assertEquals(200, $response->getStatusCode());
}
19
Copyright © Xchange Solutions All right reserved.
番外編:テストを取り巻く技術要素
Behat/Mink/PHPSpec
PHPUnit
Framework Unit Testing
Library Unit Testing
単体テスト
結合テスト
Selenium
BDD
※どこまでテストケースに書くかは案件内容と設計内容による。

More Related Content

What's hot

「自分のとこでは動くけど…」を無くす devcontainer
「自分のとこでは動くけど…」を無くす devcontainer「自分のとこでは動くけど…」を無くす devcontainer
「自分のとこでは動くけど…」を無くす devcontainerYuta Matsumura
 
ドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したことドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したことBIGLOBE Inc.
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean ArchitectureAtsushi Nakamura
 
Osc2015北海道 札幌my sql勉強会_波多野_r3
Osc2015北海道 札幌my sql勉強会_波多野_r3Osc2015北海道 札幌my sql勉強会_波多野_r3
Osc2015北海道 札幌my sql勉強会_波多野_r3Nobuhiro Hatano
 
オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫Yuta Imai
 
Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方
Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方
Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方kwatch
 
webエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのrediswebエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのredisnasa9084
 
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―shinjiigarashi
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?Moriharu Ohzu
 
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐりKazuyuki TAKASE
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ信之 岩永
 
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発慎一 古賀
 
Laravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのかLaravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのかShohei Okada
 
java.lang.OutOfMemoryError #渋谷java
java.lang.OutOfMemoryError #渋谷javajava.lang.OutOfMemoryError #渋谷java
java.lang.OutOfMemoryError #渋谷javaYuji Kubota
 
paizaのオンラインジャッジを支えるDockerとその周辺
paizaのオンラインジャッジを支えるDockerとその周辺paizaのオンラインジャッジを支えるDockerとその周辺
paizaのオンラインジャッジを支えるDockerとその周辺paiza
 
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Springドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring増田 亨
 
C#の強み、或いは何故PHPから乗り換えるのか
C#の強み、或いは何故PHPから乗り換えるのかC#の強み、或いは何故PHPから乗り換えるのか
C#の強み、或いは何故PHPから乗り換えるのかYoshifumi Kawai
 

What's hot (20)

ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
 
「自分のとこでは動くけど…」を無くす devcontainer
「自分のとこでは動くけど…」を無くす devcontainer「自分のとこでは動くけど…」を無くす devcontainer
「自分のとこでは動くけど…」を無くす devcontainer
 
ドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したことドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したこと
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
Osc2015北海道 札幌my sql勉強会_波多野_r3
Osc2015北海道 札幌my sql勉強会_波多野_r3Osc2015北海道 札幌my sql勉強会_波多野_r3
Osc2015北海道 札幌my sql勉強会_波多野_r3
 
オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫
 
Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方
Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方
Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方
 
webエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのrediswebエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのredis
 
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり
 
WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ
 
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
ちゃんとした C# プログラムを書けるようになる実践的な方法~ Visual Studio を使った 高品質・低コスト・保守性の高い開発
 
Laravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのかLaravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのか
 
java.lang.OutOfMemoryError #渋谷java
java.lang.OutOfMemoryError #渋谷javajava.lang.OutOfMemoryError #渋谷java
java.lang.OutOfMemoryError #渋谷java
 
paizaのオンラインジャッジを支えるDockerとその周辺
paizaのオンラインジャッジを支えるDockerとその周辺paizaのオンラインジャッジを支えるDockerとその周辺
paizaのオンラインジャッジを支えるDockerとその周辺
 
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Springドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
 
Mavenの真実とウソ
Mavenの真実とウソMavenの真実とウソ
Mavenの真実とウソ
 
C#の強み、或いは何故PHPから乗り換えるのか
C#の強み、或いは何故PHPから乗り換えるのかC#の強み、或いは何故PHPから乗り換えるのか
C#の強み、或いは何故PHPから乗り換えるのか
 

Similar to Laravelとテストについて

バリデーション駆動開発(仮称)で プロジェクトメンバー全員を幸せにした話
バリデーション駆動開発(仮称)で プロジェクトメンバー全員を幸せにした話バリデーション駆動開発(仮称)で プロジェクトメンバー全員を幸せにした話
バリデーション駆動開発(仮称)で プロジェクトメンバー全員を幸せにした話Kentarou Takeda
 
Laravel における Blade 拡張のツラミ
Laravel における Blade 拡張のツラミLaravel における Blade 拡張のツラミ
Laravel における Blade 拡張のツラミShohei Okada
 
Ruby on Rails 入門
Ruby on Rails 入門Ruby on Rails 入門
Ruby on Rails 入門Yasuko Ohba
 
Introduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGoodIntroduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGoodAtsuhiro Kubo
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDEdcubeio
 
C# から java へのプログラム移植で体験したtddの効果は?
C# から java へのプログラム移植で体験したtddの効果は?C# から java へのプログラム移植で体験したtddの効果は?
C# から java へのプログラム移植で体験したtddの効果は?Shinichi Hirauchi
 
第104回 php勉強会@東京 Laravel
第104回 php勉強会@東京 Laravel第104回 php勉強会@東京 Laravel
第104回 php勉強会@東京 LaravelJunKeun Lee
 
Step by stepで学ぶTerraformによる監視付きAWS構築
Step by stepで学ぶTerraformによる監視付きAWS構築Step by stepで学ぶTerraformによる監視付きAWS構築
Step by stepで学ぶTerraformによる監視付きAWS構築Yo Takezawa
 
Scala EE 7 Essentials
Scala EE 7 EssentialsScala EE 7 Essentials
Scala EE 7 Essentialstnoda
 
A HUGE CHANGE RAILS 5 IS APPROACHING FAST
A HUGE CHANGE RAILS 5 IS APPROACHING FASTA HUGE CHANGE RAILS 5 IS APPROACHING FAST
A HUGE CHANGE RAILS 5 IS APPROACHING FASTKenichi Tachibana
 
LaravelでAPI定義を管理する
LaravelでAPI定義を管理するLaravelでAPI定義を管理する
LaravelでAPI定義を管理するKenjiro Kubota
 
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]David Buck
 
Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Tokuhiro Matsuno
 
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜JustSystems Corporation
 
Laravel / Lumen 次の一歩
Laravel / Lumen 次の一歩Laravel / Lumen 次の一歩
Laravel / Lumen 次の一歩Yuuki Takezawa
 

Similar to Laravelとテストについて (20)

バリデーション駆動開発(仮称)で プロジェクトメンバー全員を幸せにした話
バリデーション駆動開発(仮称)で プロジェクトメンバー全員を幸せにした話バリデーション駆動開発(仮称)で プロジェクトメンバー全員を幸せにした話
バリデーション駆動開発(仮称)で プロジェクトメンバー全員を幸せにした話
 
Laravel における Blade 拡張のツラミ
Laravel における Blade 拡張のツラミLaravel における Blade 拡張のツラミ
Laravel における Blade 拡張のツラミ
 
Ruby on Rails 入門
Ruby on Rails 入門Ruby on Rails 入門
Ruby on Rails 入門
 
Introduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGoodIntroduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGood
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDE
 
転職とLaravel
転職とLaravel転職とLaravel
転職とLaravel
 
C# から java へのプログラム移植で体験したtddの効果は?
C# から java へのプログラム移植で体験したtddの効果は?C# から java へのプログラム移植で体験したtddの効果は?
C# から java へのプログラム移植で体験したtddの効果は?
 
第104回 php勉強会@東京 Laravel
第104回 php勉強会@東京 Laravel第104回 php勉強会@東京 Laravel
第104回 php勉強会@東京 Laravel
 
PHPコアから読み解くPHP5.5
PHPコアから読み解くPHP5.5PHPコアから読み解くPHP5.5
PHPコアから読み解くPHP5.5
 
3 tips of Laravel
3 tips of Laravel3 tips of Laravel
3 tips of Laravel
 
Step by stepで学ぶTerraformによる監視付きAWS構築
Step by stepで学ぶTerraformによる監視付きAWS構築Step by stepで学ぶTerraformによる監視付きAWS構築
Step by stepで学ぶTerraformによる監視付きAWS構築
 
Lithium Labo #1
Lithium Labo #1Lithium Labo #1
Lithium Labo #1
 
Scala EE 7 Essentials
Scala EE 7 EssentialsScala EE 7 Essentials
Scala EE 7 Essentials
 
A HUGE CHANGE RAILS 5 IS APPROACHING FAST
A HUGE CHANGE RAILS 5 IS APPROACHING FASTA HUGE CHANGE RAILS 5 IS APPROACHING FAST
A HUGE CHANGE RAILS 5 IS APPROACHING FAST
 
Spock's world
Spock's worldSpock's world
Spock's world
 
LaravelでAPI定義を管理する
LaravelでAPI定義を管理するLaravelでAPI定義を管理する
LaravelでAPI定義を管理する
 
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
 
Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)
 
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
 
Laravel / Lumen 次の一歩
Laravel / Lumen 次の一歩Laravel / Lumen 次の一歩
Laravel / Lumen 次の一歩
 

More from Takeo Noda

スタートアップにやさしいAWS
スタートアップにやさしいAWSスタートアップにやさしいAWS
スタートアップにやさしいAWSTakeo Noda
 
Prometeusについてはじめてみよう / Let's start Prometeus
Prometeusについてはじめてみよう / Let's start PrometeusPrometeusについてはじめてみよう / Let's start Prometeus
Prometeusについてはじめてみよう / Let's start PrometeusTakeo Noda
 
ディレクションのすゝめ
ディレクションのすゝめディレクションのすゝめ
ディレクションのすゝめTakeo Noda
 
負荷テスト入門
負荷テスト入門負荷テスト入門
負荷テスト入門Takeo Noda
 
データ解析入門
データ解析入門データ解析入門
データ解析入門Takeo Noda
 
Laravelの認証について
Laravelの認証についてLaravelの認証について
Laravelの認証についてTakeo Noda
 
Zabbixで学ぶ統計解析入門
Zabbixで学ぶ統計解析入門Zabbixで学ぶ統計解析入門
Zabbixで学ぶ統計解析入門Takeo Noda
 
映像・音響機材入門
映像・音響機材入門映像・音響機材入門
映像・音響機材入門Takeo Noda
 
サイト運用者に向けたバージョン管理について
サイト運用者に向けたバージョン管理についてサイト運用者に向けたバージョン管理について
サイト運用者に向けたバージョン管理についてTakeo Noda
 
Laravel5を使って開発してみた
Laravel5を使って開発してみたLaravel5を使って開発してみた
Laravel5を使って開発してみたTakeo Noda
 

More from Takeo Noda (12)

スタートアップにやさしいAWS
スタートアップにやさしいAWSスタートアップにやさしいAWS
スタートアップにやさしいAWS
 
Vue入門
Vue入門Vue入門
Vue入門
 
Prometeusについてはじめてみよう / Let's start Prometeus
Prometeusについてはじめてみよう / Let's start PrometeusPrometeusについてはじめてみよう / Let's start Prometeus
Prometeusについてはじめてみよう / Let's start Prometeus
 
ディレクションのすゝめ
ディレクションのすゝめディレクションのすゝめ
ディレクションのすゝめ
 
負荷テスト入門
負荷テスト入門負荷テスト入門
負荷テスト入門
 
データ解析入門
データ解析入門データ解析入門
データ解析入門
 
Laravelの認証について
Laravelの認証についてLaravelの認証について
Laravelの認証について
 
Zabbixで学ぶ統計解析入門
Zabbixで学ぶ統計解析入門Zabbixで学ぶ統計解析入門
Zabbixで学ぶ統計解析入門
 
Zabbix入門
Zabbix入門Zabbix入門
Zabbix入門
 
映像・音響機材入門
映像・音響機材入門映像・音響機材入門
映像・音響機材入門
 
サイト運用者に向けたバージョン管理について
サイト運用者に向けたバージョン管理についてサイト運用者に向けたバージョン管理について
サイト運用者に向けたバージョン管理について
 
Laravel5を使って開発してみた
Laravel5を使って開発してみたLaravel5を使って開発してみた
Laravel5を使って開発してみた
 

Laravelとテストについて

  • 1. Copyright © Xchange Solutions All right reserved. Fukuoka.php Vol.17 ~Rebooted~ Laravelとテストについて 株式会社エクスチェンジ ソリューションズ 野田 健夫 2016.06.22
  • 2. 2 Copyright © Xchange Solutions All right reserved. こんにちは! 野田 健夫(のだたけお) https://twitter.com/nodatakeo https://www.facebook.com/nodatakeo 株式会社エクスチェンジ ソリューションズ
  • 3. 3 Copyright © Xchange Solutions All right reserved. 今日の内容 1. 開発者に立ちはだかるテストの壁 2. なぜテストをやるのか? 3. テストの種類 4. テストへのジレンマ 5. Laravelテスト  環境構築  API編  ウェブページ編  その他 6. まとめ
  • 4. 4 Copyright © Xchange Solutions All right reserved. 開発者に立ちはだかるテストの壁 環境作るのが面倒くさい。 実装に比べて生産的でない感じがする。 単体テストはともかくとして、シナリオ テストが作りにくい。 時間がない。
  • 5. 5 Copyright © Xchange Solutions All right reserved. なぜテストをやるのか? 利用可能な状態を担保するため。 要件を満たしているか確認するため。 品質を高め、信頼性を上げるため。 システムが動かなかったり、品質が低いと 利用者・顧客の不利益になる。その リカバリーにかかる作業コストも大きい。
  • 6. 6 Copyright © Xchange Solutions All right reserved. テストの種類 単体テスト 結合テスト システムテスト メソッド・関数の期待値検査 APIスキーマ・HTMLコンテンツチェック シナリオテスト・脆弱性テスト パフォーマンス、ログ、サーバー周りなど これまでテスト自動化に悩んでいた領域 →xUnitテスト →debugbar、slowログ、jmeter、zabbixなど ※ウェブアプリケーションでの例
  • 7. 7 Copyright © Xchange Solutions All right reserved. テストへのジレンマ  テストの必要性は理解しているけど、コスト高い のでは?  自動テストでできる検査って、ロジック以下の assertHoge系の値検査ぐらいしかなかったっけ? 調べてみたらLaravelでいろいろテストを 支援する仕組みが用意されていた。
  • 8. 8 Copyright © Xchange Solutions All right reserved. Laravelのテスト: phpunit よく使われているphpunitでのテストを ベースとしている。 composer dump-autoload ./vendor/phpunit/phpunit/phpunit tests composer dump-autoload ./vendor/phpunit/phpunit/phpunit --filter 'testContent' tests/api/ApiContentControllerTest.php ./tests 以下のテストケースをすべて実行する。 ./tests 以下のテストケースのうち特定のテストクラスでfilterして実行する。
  • 9. 9 Copyright © Xchange Solutions All right reserved. Laravelのテスト: 環境構築(Fixture)  テストのフィクスチャ(Fixture:ベースとなるデー タ設定)に Seederを使う。 過去の案件では、.envのAPP_ENVをみて、環境ごとに切り替えれるSeederを用意。 abstract class BaseSeeder extends Seeder { /** * Get default seeds by table name * @param $target table name * @return void */ public function getConfig($target) { $config = require(base_path('database/seeds/default_'. config('app.env') . '.php')); return array_get($config, $target); } } class ContentSeeder extends BaseSeeder { /** * Run the database seeds. * * @return void */ public function run() { //削除 Content::truncate(); // コンテンツのデータ追加 foreach ($this->getConfig('contents') as $record) { $dao = new Content (); $dao->setUpRecord($record); $dao->save(); } } } テストの初期状態を共有
  • 10. 10 Copyright © Xchange Solutions All right reserved. Laravelのテスト: APIスキーマチェック  seeJsonStructureメソッド キー名の配列を渡して構造をチェック  assertResponseStatus/assertResponseOkメソッド HTTPステータスコードをチェック // JSONパラメータ $content = []; // メソッド $method = 'GET'; // URL $url = route("contents.get"); // サーバー環境変数 $server = $this->getServerParameter($method, $url); // JSONでAPIを呼び出し $this->withServerVariables($server) ->json($method, $url, $content, $server); // JSON構造のチェック $this->seeJsonStructure([ 'error', ‘content_list' => [ '*' => [ 'id', 'title', ], ], ]); // ステータスコードのチェック $this->assertResponseStatus(200); // レスポンス状態のチェック $this->assertResponseOk();
  • 11. 11 Copyright © Xchange Solutions All right reserved. Laravelのテスト: API値チェック  seeメソッド レスポンス中に値が含まれるか検査が可能。  responseプロパティ レスポンス自体も取得できるので、値を抜き出せば、従来のassert チェックも可能。 $this->see('Laravel 5'); $response = json_decode($this->response->content(), true); $this->assertEquals('Laravel 5', $response['title']);
  • 12. 12 Copyright © Xchange Solutions All right reserved. Laravelのテスト: WEBコンテンツチェック  visitメソッド URLにアクセス。  typeメソッド 指定IDフォームに入力。  pressメソッド 指定IDボタンを押下。  seePageIsメソッド 現在URL値をチェック。 $this->visit(route('admin.logout')); $this->visit(route('admin.login')); $this->type('a@aaa.com', 'login_id'); $this->type('testpw123', 'login_pw'); $this->press('action'); $this->seePageIs(route('admin.top')); $this->see('TOPページ'); シナリオテストの動作チェックが可能。
  • 13. 13 Copyright © Xchange Solutions All right reserved. Chrome Extension: Laravel TestTools
  • 14. 14 Copyright © Xchange Solutions All right reserved. Chrome Extension: Laravel TestTools 開発ツール(ctrl+shift+i)のタブに「Laravel TestTools」が追加。 Selenium IDEの記録のような形で[Record]ボタンを押下すると テストコードが生成されます。
  • 15. 15 Copyright © Xchange Solutions All right reserved. DB値のチェック seeInDatabaseメソッド テーブル内に指定したキーのレコードがあるかチェック。 $this->seeInDatabase('users', ['email' => 'sally@example.com']);
  • 16. 16 Copyright © Xchange Solutions All right reserved. Test用Trait  Illuminate/Foundation/Testing/DatabaseMigrations.php (Trait)  テスト開始時にマイグレーションを実行し、終了後にマイグレーションロールバックする。  Illuminate/Foundation/Testing/DatabaseTransactions.php (Trait)  テスト開始時にトランザクションを開始し、終了後にロールバックする。  Illuminate/Foundation/Testing/WithoutEvents.php (Trait)  すべてのイベントを抑止して余計な処理を発生させない。  Illuminate/Foundation/Testing/WithoutMiddleware.php (Trait)  すべてのミドルウェアを抑止して余計な処理を発生させない。  Illuminate/Foundation/Testing/Conserns/* (Trait)  テスト向けの各種実装。see*系(seeJsonStructureなど)は、ほかのフレームワークでも参考になると 思います。
  • 17. 17 Copyright © Xchange Solutions All right reserved. まとめ  テスト自動化は、テストの壁を低くする。  開発してリリースしておしまいでなく、開発が継続する案件 が増えている。デグレを避けるためにも必須になりつつある ように感じている。  フレームワークが持っているテストの仕組みを使うことでAPI スキーマテストやシナリオテストといったより複雑なテスト 自動化をシンプルに行うことができる。  テストは放っておくと腐る。テストが適切に行われるよう仕 様変更や動作が変わった場合は、メンテナンスを必ず行う。
  • 18. 18 Copyright © Xchange Solutions All right reserved. 番外編:GuzzleでAPI/シナリオテスト  GuzzleもAPIクライアントとしてだけでなく テストにもシンプルで使い易いと思います。 public function __construct() { $this->endPoint = "https://hoge.jp"; $this->client = new HttpClient($this->endPoint); } /** * OAuth 認証ページテスト * @Test */ public function testAuthorization() { $this->endPoint = “https://hogehoge.jp”; $this->client = new HttpClient($this->endPoint); // rfc6570 $uri = array(‘/auth/authorize?response_type={response_type}&client_id={client_id}&state={state}’, array(‘response_type’ => ‘code’, ‘client_id’ => ‘demoapp’, ‘state’ => session_id())); // リクエストを作成 $request = $this->client->get($uri); // レスポンスを取得 $response = $request->send(); // 値検査 $this->assertEquals(200, $response->getStatusCode()); }
  • 19. 19 Copyright © Xchange Solutions All right reserved. 番外編:テストを取り巻く技術要素 Behat/Mink/PHPSpec PHPUnit Framework Unit Testing Library Unit Testing 単体テスト 結合テスト Selenium BDD ※どこまでテストケースに書くかは案件内容と設計内容による。