Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Laravelとテストについて
Search
Takeo Noda
June 22, 2016
Programming
1
1.1k
Laravelとテストについて
テストにまつわる話とLaravelでのテスト事例を紹介。
Takeo Noda
June 22, 2016
Tweet
Share
More Decks by Takeo Noda
See All by Takeo Noda
システム開発におけるディレクションのすゝめ / the way to direction
nodat
1
1.6k
Laravelの認証について / Let's talk about Laravel
nodat
2
470
Zabbixで学ぶ統計解析入門
nodat
1
1.6k
Laravel5を使って開発してみた
nodat
0
240
Other Decks in Programming
See All in Programming
Railsアプリケーションと パフォーマンスチューニング ー 秒間5万リクエストの モバイルオーダーシステムを支える事例 ー Rubyセミナー 大阪
falcon8823
4
930
CursorはMCPを使った方が良いぞ
taigakono
1
170
GoのGenericsによるslice操作との付き合い方
syumai
3
680
Deep Dive into ~/.claude/projects
hiragram
8
1.4k
「Cursor/Devin全社導入の理想と現実」のその後
saitoryc
0
140
Systèmes distribués, pour le meilleur et pour le pire - BreizhCamp 2025 - Conférence
slecache
0
100
PostgreSQLのRow Level SecurityをPHPのORMで扱う Eloquent vs Doctrine #phpcon #track2
77web
2
300
Rubyでやりたい駆動開発 / Ruby driven development
chobishiba
1
370
20250628_非エンジニアがバイブコーディングしてみた
ponponmikankan
0
370
Gleamという選択肢
comamoca
6
760
Code as Context 〜 1にコードで 2にリンタ 34がなくて 5にルール? 〜
yodakeisuke
0
100
設計やレビューに悩んでいるPHPerに贈る、クリーンなオブジェクト設計の指針たち
panda_program
6
1.3k
Featured
See All Featured
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
48
5.4k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
45
7.4k
[RailsConf 2023] Rails as a piece of cake
palkan
55
5.6k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
7
700
The Cost Of JavaScript in 2023
addyosmani
51
8.4k
We Have a Design System, Now What?
morganepeng
53
7.7k
Java REST API Framework Comparison - PWX 2021
mraible
31
8.6k
The Pragmatic Product Professional
lauravandoore
35
6.7k
Automating Front-end Workflow
addyosmani
1370
200k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
124
52k
Testing 201, or: Great Expectations
jmmastey
42
7.5k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.3k
Transcript
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('
[email protected]
', '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' => '
[email protected]
']);
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 ※どこまでテストケースに書くかは案件内容と設計内容による。