こんなテーマの座談会を社内各サービスの代表者間でやってみたい。
先日Twitterで少し話題になっていました。まだ古いPHPを使い続けている現場では役立つかも?
個人的にはリファレンスは滅べばいいのに扱いが難しいし、本当に必要な場面も少ないのでできれば避けたほうがいいと思っていますが、稀に必要になった場合の罠が軽減されるのは嬉しいです。
体系的に学ぶ 安全なWebアプリケーションの作り方(通称:徳丸本)はWebアプリケーション開発者必読・必携だが、分厚いのでまずこういった記事から入るのも良いのでは
カッチリ実装したい人にとっては嬉しい修正なのだが、既存システムに導入するのは極めて勇気が要りそう。PHP界隈でも意見が分かれていそう。
アプリケーションの状況に応じて、動的プロパティの許可/不許可を細かく制御できるのなら、ぜひ導入してほしい。
個人での利用は問題ないが、会社で使っている個人ツールはどうなんだろう
やっぱり内部ではこういう動きしていたんだねっていう実装が垣間見れます。
あまり使ったことが無いツールもありましたが、PhpStorm はやっぱり入っていました。
PHPプログラムとして作成可能なユニットテスト
最低限の機能(参考)
テストコードを実行する際に一番最初に実行されるメソッド。
テスト対象としているクラスのインスタンス化や各テストで利用する共通処理の初期化などに利用。
<?php declare(strict_types=1);
use PHPUnit\Framework\TestCase;
final class StackTest extends TestCase
{
private $stack;
protected function setUp(): void
{
$this->stack = [];
}
public function testEmpty(): void
{
$this->assertTrue(empty($this->stack));
}
}
値を比較、検査して想定通りの値になっているかを確認するためのメソッド。テストコードを記述する上で最も重要。
テストコードはこのアサーションメソッドを各テストメソッド内に記述していきテスト対象のクラスや共通処理が期待通りの動作になっているかを確認するイメージ。
値の比較が可能なアサーションメソッド。(型の厳密なチェックも可能)
$this->assertSame('hoge', 'hoge'); // OK
$this->assertSame('hoge', 'fuga'); // NG
$this->assertSame(0, 0); // OK
$this->assertSame(0, false); // NG
Trueが返されることを確認するアサーションメソッド。
assertSame
メソッドでも同様のケースが記述できるが、テスト結果がわかりやすくなるというメリットがある
$flag = FALSE;
$this->assertTrue($flag);
$this->assertSame(TRUE, $flag);
# assertTrueのメッセージ
Failed asserting that false is true.
# assertSameのメッセージ
Failed asserting that false is identical to true.
アサーションメソッドの詳細は以前の PHP TechCafe の show note を参照
PHPerのための「PHPUnit について語り合う」PHP TechCafe
テストメソッドへの引数をまとめて記載することができるメソッドを作成することができます。
データプロバイダに指定するメソッドには、アノテーション @dataProvider
を指定し、配列や反復が可能な値を返すようにする必要があります。
<?php
use PHPUnit\Framework\TestCase;
class DataTest extends TestCase
{
/**
* @dataProvider additionProvider
*/
public function testAdd($a, $b, $expected)
{
$this->assertEquals($expected, $a + $b);
}
public function additionProvider()
{
return [
[0, 0, 0],
[0, 1, 1],
[1, 0, 1],
[1, 1, 3]
];
}
}
?>
各テストメソッドに対するメタ情報。
アノテーション自体は PHPDoc にも利用することがあるが、PHPUnit では各テストメソッドの依存関係を定義することなどが可能。
アノテーションが付与されたテストメソッド側で依存しているテストメソッドの戻り値を引数として受け取れる。
記述方法は以下の通り。
@depends + "テストメソッド名"
以下は PHPUnit の公式マニュアルで紹介されているサンプルコード。
<?php declare(strict_types=1);
use PHPUnit\Framework\TestCase;
final class StackTest extends TestCase
{
public function testEmpty(): array
{
$stack = [];
$this->assertEmpty($stack);
return $stack;
}
/**
* @depends testEmpty
*/
public function testPush(array $stack): array
{
array_push($stack, 'foo');
$this->assertSame('foo', $stack[count($stack)-1]);
$this->assertNotEmpty($stack);
return $stack;
}
/**
* @depends testPush
*/
public function testPop(array $stack): void
{
$this->assertSame('foo', array_pop($stack));
$this->assertEmpty($stack);
}
}
テスト時に、実際のオブジェクトの動作をシュミレートしてくれる模造品オブジェクトのこと。
依存するオブジェクトが何らかの理由でテスト時に利用できないときに使用する。
たとえば、
サンプルコード:
https://phpunit.readthedocs.io/ja/latest/test-doubles.html#test-doubles-mock-objects
すべてOKの場合
$ vendor/bin/phpunit Test.php
PHPUnit 7.4.5 by Sebastian Bergmann and contributors.
.... 4 / 4 (100%)
Time: 87 ms, Memory: 4.00 MB
OK (4 tests, 10 assertions)
NGがある場合
テストコード Test.php の testRoll()
を以下のように書き換えた場合。
/**
* @depends testSided
*/
public function testRoll($dice){
$dice->roll();
$this->assertTrue(1 <= $dice->getNumber()
&& 0 >= $dice->getNumber()); // 6 だったものを 0 に書き換え
}
$ vendor/bin/phpunit Test.php
PHPUnit 7.4.5 by Sebastian Bergmann and contributors.
...F 4 / 4 (100%)
Time: 78 ms, Memory: 4.00 MB
There was 1 failure:
1) Test::testRoll
Failed asserting that false is true.
/var/www/html/Test.php:40
FAILURES!
Tests: 4, Assertions: 10, Failures: 1.
https://github.com/MasaKuuuu/dicegame
or
or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up
Syntax | Example | Reference | |
---|---|---|---|
# Header | Header | 基本排版 | |
- Unordered List |
|
||
1. Ordered List |
|
||
- [ ] Todo List |
|
||
> Blockquote | Blockquote |
||
**Bold font** | Bold font | ||
*Italics font* | Italics font | ||
~~Strikethrough~~ | |||
19^th^ | 19th | ||
H~2~O | H2O | ||
++Inserted text++ | Inserted text | ||
==Marked text== | Marked text | ||
[link text](https:// "title") | Link | ||
![image alt](https:// "title") | Image | ||
`Code` | Code |
在筆記中貼入程式碼 | |
```javascript var i = 0; ``` |
|
||
:smile: | Emoji list | ||
{%youtube youtube_id %} | Externals | ||
$L^aT_eX$ | LaTeX | ||
:::info This is a alert area. ::: |
This is a alert area. |
On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?
Please give us some advice and help us improve HackMD.
Syncing