owned this note
owned this note
Published
Linked with GitHub
# PHPerのための「PHPUnit について語り合う」PHP TechCafe
## PHPers News
::: info
[PHPの各バージョンの計算速度を比較してみた](https://zenn.dev/foolishell/articles/2c2e26f8566b74)
:::
::: info
[個人的におすすめしたいプログラムの技術サイト](https://qiita.com/SARDONYX/items/16cd2ef2ea4b842915a9)
:::
::: info
[PHPerのための配列処理100本ノック](https://zenn.dev/ad5/articles/60ca8edadc236f)
:::
::: info
[【PHP8.1?】PHPのあらゆる関数を部分適用できるようにするRFC](https://qiita.com/rana_kualu/items/788ebf4fef188bd24e03)
:::
::: info
[【PHP8.1】PHPで交差型が使えるようになる](https://qiita.com/rana_kualu/items/f49582bc94e0bae23d9c)
:::
::: info
[IE11がついに2022年6月15日で終了へ 日本でのシェアは?](https://www.itmedia.co.jp/pcuser/articles/2105/21/news053_2.html)
:::
::: info
[Laravel is 10 years old!](https://laravel-news.com/laravel-is-10-years-old)
:::
::: info
[業務用コードの書き方(ver1.0)](https://qiita.com/aruim/items/b6aa38c67e20f46ba561)
:::
::: info
[補遺: Laravel でテスト駆動開発するときの守破離と序破急](https://qiita.com/nunulk/items/b466ca10a087f4cd7dc8)
:::
::: info
[PhpStormに入れておくと作業が爆速になるプラグイン一覧](https://qiita.com/nagareboshi/items/69dc6d5b6a0b7cc4cf27)
:::
::: info
[PHP8.1で追加された新しい戻り値の型「never」について](https://php.watch/versions/8.1/never-return-type)
:::
::: info
[PHPカンファレンス沖縄2021【参加レポート】](https://tech-blog.rakus.co.jp/entry/20210601/it-event)
:::
::: info
[ラッキービジター詐欺で使用されるPHPマルウェア](https://blogs.jpcert.or.jp/ja/2021/06/php_malware.html)
:::
::: info
[Laravel大規模開発入門!MVC分離のFatModel問題に対する責任分離と依存管理、その設計と考え方について](https://eh-career.com/engineerhub/entry/2021/05/28/160000)
:::
::: info
[PHPの現場 42. Laravel 本と開発現場(ytake / kurikazu / omoon)](https://php-genba.shin1x1.com/42)
:::
::: info
[PHPフレームワーク Laravel Webアプリケーション開発 バージョン8.x対応](https://www.amazon.co.jp/dp/4802613008/)
:::
## PHPUnit
### 参考資料
[PHPUnitのアサーションメソッドを知ろう! - RAKUS Developers Blog](https://tech-blog.rakus.co.jp/entry/20200716/phpunit)
### テストとは
* 品質を担保するための工程
* プログラムが期待通りに動いているかの確認
* たとえば...
* 正しい挙動をしているか
* 負荷をかけた時は正常に動くか
* 部品を合わせた時に正しく動くか
### Unit テストとは
* 単体テスト
* クラスや関数などの単位で動作を確認するテスト
* 画面遷移での動作確認が不要
### PHPUnit とは
PHPプログラムとして作成可能なユニットテスト
[PHPUnit マニュアル](https://phpunit.readthedocs.io/ja/latest/#)
[その他のPHP系のユニットテストツール](https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88%E3%83%86%E3%82%B9%E3%83%88%E3%83%BB%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF%E4%B8%80%E8%A6%A7#PHP)
### 実際にはどう使っている??
#### 利用方法
#### 参考書籍などの紹介
### TDD
- テスト駆動開発
- https://www.amazon.co.jp/%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA-Kent-Beck/dp/4274217884
- TDD Boot Camp 2020 Online #1 基調講演/ライブコーディング
- https://www.youtube.com/watch?v=Q-FJ3XmFlT8
### PHPUnitアサーションメソッド
[PHPUnitのアサーションメソッドを知ろう! - RAKUS Developers Blog](https://tech-blog.rakus.co.jp/entry/20200716/phpunit)
`アサーションメソッド` と `アノテーション` を組み合わせることでテスト対象のクラスや関数が期待通りに動作しているかを確認する
* アサーションメソッド
* 値を比較、検査して想定通りの値になっているかを確認
```php=
<?php
use PHPUnit\Framework\TestCase;
// PHPUnit での配列操作のテスト(PHPUnit のドキュメントより転載)
class StackTest extends TestCase
{
public function testPushAndPop()
{
$stack = [];
$this->assertSame(0, count($stack));
array_push($stack, 'foo');
$this->assertSame('foo', $stack[count($stack)-1]);
$this->assertSame(1, count($stack));
$this->assertSame('foo', array_pop($stack));
$this->assertSame(0, count($stack));
}
}
```
* アノテーション
* テストメソッド間の依存性を明示的に宣言する
```php=
<?php
use PHPUnit\Framework\TestCase;
// @depends アノテーションを使った依存性の表現(PHPUnit のドキュメントより転載)
class StackTest extends TestCase
{
public function testEmpty()
{
$stack = [];
$this->assertEmpty($stack);
return $stack;
}
/**
* @depends testEmpty
*/
public function testPush(array $stack)
{
array_push($stack, 'foo');
$this->assertSame('foo', $stack[count($stack)-1]);
$this->assertNotEmpty($stack);
return $stack;
}
/**
* @depends testPush
*/
public function testPop(array $stack)
{
$this->assertSame('foo', array_pop($stack));
$this->assertEmpty($stack);
}
}
```
### アサーションメソッド
#### assertEquals
* ある値が期待した値と等しいかを判定
* 比較時に暗黙の型変換が行われるため、あまり利用しない方が良い
```php=
// 以下のアサーションは全て成功になる
$this->assertEquals(1, '1');
$this->assertEquals(null, '');
$this->assertEquals(null, false);
$this->assertEquals(null, 0);
$this->assertEquals('1', true);
```
#### assertSame
* `assertEquals` とは異なり、型の厳密な比較が可能なアサーションメソッド
* 基本的にこちらを利用する方針で問題ないはず
```php=
$this->assertSame('hoge', 'hoge'); // OK
$this->assertSame(0, 0); // OK
$this->assertSame(false, false); // OK
$this->assertSame('hoge', 'fuga'); // NG
$this->assertSame(0, false); // NG
$this->assertSame(7, '7'); // NG
```
#### assertTrue, assertFalse, assertNull
* `treu`, `false`, `null` を判定するアサーション
* テスト結果の確認には `assertSame` を利用するよりわかりやすい
```php=
$actualValue = false;
// 以下はいずれも失敗になる
$this->assertTrue($actualValue);
$this->assertSame(true, $actualValue);
```
以下はテスト失敗時のメッセージ
```
# assertSame(true, false) のメッセージ
Failed asserting that false is identical to true.
# assertTrue(false) のメッセージ
Failed asserting that false is true.
```
#### assertCount
* 配列や `countable` なオブジェクトwの要素数を検査するアサーション
* こちらも `assertSame` よりもテストの結果がわかりやすい
```php=
// 以下はいずれも失敗になる
$this->assertCount(1, []);
$this->asserSame(1, count([]));
```
```
# assertCount(1, []) のメッセージ
Failed asserting that actual size 0 matches expected size 1.
# assertSame(1, count([])) のメッセージ
Failed asserting that 0 is identical to 1.
```
#### assertStringStartsWith, assertStringEndsWith, assertStringContainsString
* 文字列検査系のアサーション
* assertSameだと煩雑になるテストが簡単に書けるようになる
```php=
// 以下2つは同じ内容のテスト
$this->assertStringStartsWith('foo', $string);
$this->assertSame(0, strpos($string, 'foo')); // 何をテストしたいのか理解しにくい
// 以下2つは同じ内容のテスト
$this->assertStringEndsWith('bar', $string);
$this->assertSame('bar', substr($string, -3)); // これも理解しにくい
```
#### assertRegExp
* 正規表現が利用できる文字列検査
* 上記の `assertStringContainsString` よりも複雑な上限のテストが作成可能
#### assertIsXXX, assertInstanceOf
* 値が配列かどうかの検査方法
* assertTrue(is_array($value))
* assertIsArray($value)
* その他にも以下が存在
* is_int
* is_numeric
* is_string
* is_bool
* is_callable
* is_object
* オブジェクトの型検査
* assertInstanceOf(SomeClass::class, $value)