PHPカンファレンス小田原2024での発表資料です https://fortee.jp/phpconodawara-2024/proposal/4d39c7ef-058c-4648-b1d7-5510497e0d81
![単体テストを書かない技術 #phpcon_odawara](https://cdn-ak-scissors.b.st-hatena.com/image/square/19f13f3ef979d7a3cf8b3b525f1a2590a37297bd/height=288;version=1;width=512/https%3A%2F%2Ffiles.speakerdeck.com%2Fpresentations%2F0225ffe59b404b148d4bdf9d33a246f4%2Fslide_0.jpg%3F29720498)
10 月から開発グループ直下の所属となりました。岡田(okashoi)です。 先日 12/15(土)に開催された PHP Confernece 2018 にて「Laravel × レイヤードアーキテクチャを実践して得られた知見と反省」というテーマで登壇させていただきました。 PHP Conference 2018 の様子 PHP Conference 2018 のテーマは「GROWTH」 今年は「GROWTH」をテーマに合計 38 のセッション + 10 を超える LT がありました。 どのセッションも興味深い内容であり、当日の来場者はおよそ 1000 人にものぼったそうで、たいへん盛り上がりました。 当日の盛り上がりは twitter からも見て取れると思います。 twitter.com 発表内容 Laravel × レイヤードアーキテクチャを実践して得られた知見と反省 / Practi
BASE Advent Calendar 2018 (13日目) この記事は、「BASE Advent Calendar 2018」の13日目の記事です。 devblog.thebase.in Backend Engineerの沖中 (@okinaka) です。 読者のみなさんはテストを書いてますか?テストが面倒くさいとか思ってませんか?(私はたまにあります) そんな時、モチベーションをあげるには、どのような工夫をしていますか? 私の場合、カバレッジ計測の結果のレポートがとても役に立っています。 レポートを眺めると、視覚的に 「どの行が実行された」とか 「カバレッジ率が◯%」だとか 「ここ複雑だけどテストがないクラスがあるよ」など、 いろいろ気づきがあります。 「ここマズイな、テスト書いて確認しなくちゃ!」という気持ちになるのでとても重宝しています。 とてもいいツールだと思うのですが、残念
<?php require_once './vendor/autoload.php'; $faker = Faker\Factory::create('ja_JP'); $gender = ['男','女']; for($i=0; $i<10; $i++) { echo $faker->name."<br>"; echo $faker->address."<br>"; echo $faker->userName."<br>"; echo $faker->password."<br>"; echo $faker->email."<br>"; echo $faker->phoneNumber."<br>"; echo $faker->date($format='Y-m-d',$max='now')."<br>"; echo $faker->creditCardNumber."<br>"; ec
mockeryとは ReflectionClassやPHPUnit内蔵のMockBuilderを小難しく使わずとも2行でmock作れます。そうmockeryならね。 もうちょっと詳しく とりあえずサンプル見てもらえると早いと思います。 <?php $mock = Mockery::mock('Hoge'); $mock->shouldReceive('fuga')->andReturn('hogehogefugafuga!'); echo $mock->fuga(); // hogehogefugafuga! Mockery::mock('Hoge');で指定しているクラス名Hogeは実在するクラスを指定すれば、そのクラスを継承したmockを作成するとのことです。 テキトーな文字列を指定した場合は空のクラスのmockを作成します。 これだけだとイマイチ凄さが分かりませんが、私が感動したのは
PHPUnitでMockeryを使う場合の最低限のメモ。 Mockeryとはなんぞや? Mockを作るためのツール。要は、存在しないClassを代替してテストを進めるためのツールと思ってよい。 下記のようなコードがある場合、どうぜんHogeClassが存在することが前提となる。 が、大きなプロジェクト等で「まだHogeClassが無い!」などという場合でもある程度テストを進めておける。 //インスタンス生成 $m = new Hoge('foo'); //メソッドを実行 $m->Hello('foo'); //assertの中で使う $this->assertEquals("Hello foo",$m->Hello('foo'));
例えばこんなクラスコードがあるとする。 <?php namespace App; use Psr\Log\LoggerInterface; use App\Util\DB; use App\Exception\DbException; class BlogService { /** @var DB */ protected $db; /** @var LoggerInterface */ protected $logger; public function __construct(DB $db, LoggerInterface $logger) { $this->db = $db; $this->logger = $logger; } public function createNewPost(int $userId, string $title) { $this->db->begin()
こんにちは。clonedです。 最近、改めてテストコードのあるプログラムは強い、と感じます。テストされている、変更による破壊を検知できる、というそのままの意味もありますし、テストが書ける程度にコードが整頓されている、つまり実装間違いが起きにくいコードであるという意味もあります。 テストを悪く言う人はあまりいないと思いますが、テストを書けない理由はいろいろあります。その中でも「テストを書いている時間がない」について考えます。 テストを書いている時間は本当にないのか テストコードを書いて実行するよりも、ブラウザをリロードしたり、アプリを立ち上げ直した方が早く動作確認を行える場合、テストを書くことは “時間がかかること” になります。 大抵の場合、テストコードを書いて実行するよりも、アプリケーションを動作させる方が早いかもしれません(本当はそうでもないと思っていますが一般的な感覚値)。ですが、テ
通常 private や protected に指定されているクラスのプロパティやメソッドを読み書きしたり実行したりすることは出来ません。 しかしテストの際などに一時的にその制限を無視してアクセスしたい場合もあります。そういったときは ReflectionClass を使うことで実現できます。 <?php class MyClass { private $foo = ""; private function bar($str){ return $str . "!"; } } $myClass = new MyClass(); $refrection = new ReflectionClass(get_class($myClass)); // プロパティの読み書き $foo = $refrection->getProperty('foo'); $foo->setAccessible(true
はじめに 既存のコードに対するテストを書く時など、テストを書くこと自体の工数を削減できないかという観点にて、スナップショットテストと言うものを試しました。PHPUnitにもスナップショットテストのライブラリが提供されているのでその使い方についてまとめます。 そもそもスナップショットテストとは もともとは、Facebook製のJSテストフレームワークJestの機能として提供されているものです。 また、スナップショットテストのすゝめという@kenttさんのスナップショットテストについての記事が概要に知るにはとても参考になるのでおすすめです。 上記の記事を引用させていただくと、概要はこんな感じです。 スナップショットテスト 最初のテスト実行時にテストケースのアウトプットが保存(スナップショット)される スナップショットを目視で確認して期待通りならOK 2回目以降はアウトプットとスナップショットを
題目の通りなのですが、PHPUnitで複数のアサーションを実行して最後に失敗があったか確認する方法をメモしておきます。 本来(なるべく)なら1テスト1アサーションがいいのでしょうけど、とりあえず簡単なアサーションをざぁーーーっと流して最後に失敗したものだけを確認したいこともあるのではないのでしょうか。 そんな要求を満たすには以下の方法もあるのではないかという話です。 ※すいません、これ以外やったことありませn 方法 以下の例外をキャッチする。 \PHPUnit_Framework_ExpectationFailedException はい、これだけです。 PHPUnitでテストに失敗した時、内部では上記の例外をキャッチしてゴニョゴニョしているようです。(多分) なので、一旦上記の例外を先にキャッチしてしまいます。 サンプル 簡単なサンプルは以下の通りです。 ※エラーメッセージはjsonにし
PHPUnit マニュアル – 第8章 データベースのテスト https://phpunit.de/manual/current/ja/database.html で紹介されている、YAMLデータセットを使ったテストを動かしてみる。データベースに MySQL を使う。 ソースコードはこちら: takatama/php-dbunit-yaml https://github.com/takatama/php-dbunit-yaml Mac OS X を使って開発する。 MySQL の準備 MySQL をインストールする Mac へ MySQL を Homebrew でインストールする手順 - Qiita http://qiita.com/hkusu/items/cda3e8461e7a46ecf25d ユーザー、データベース、パスワードを作る ユーザー user@localhost を、パスワ
DBを使ったテストを考えた場合、 ・Insertのテストが走るとTableにそのデータがInsertされテストが正常完了する ・上記テストをもう一度走らせると、前回のInsertされたデータがあるのでDuplicateでテストが失敗する 上記の問題を解決することを考える ・テストが走るとテーブルが初期化される ・Insertのテストが走ると初期化されているので、前のテストでInsertされたデータは消えているので、Duplicateにはならない。 phpunit/dbunit ・テストが接続するDB情報を設定できる ・テストが走るとテーブルのデータが初期化される インストール Composerを使ってインストール
<?php class SampleClass { public function __construct() { exit; } public function hoge() { return TRUE; } } <?php require_once 'SampleClass.php'; class SampleClassTest extends PHPUnit_Framework_TestCase { public function testHogeReturnTrue() { $this->class = new SampleClass(); $this->assertTrue($this->class->hoge()); } }
class StubTest extends PHPUnit_Framework_TestCase { public function testReturnValueMapStub() { $mock = $this->getMockBuilder('SomeClass') ->getMock(); // 値を返すためのマップ // 配列の先頭から第一引数、第二、、、として、最後にダミーの返却値 // この場合は引数が3つ $map = array( array('a', 'b', 'c', 'd'), array('e', 'f', 'g', 'h'), ); $mock ->method('doSomething') ->will($this->returnValueMap($map)); // $mock->doSomething() は、渡した引数に応じて異なる値を返します $th
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く