Symfonyでバリデーションのテストを書く方法を丁寧に解説!初心者でもできる自動チェック入門
生徒
「Symfonyのバリデーションって便利ですけど、ちゃんと動いてるかどうかを確認する方法ってありますか?」
先生
「いい質問ですね。Symfonyでは、PHPUnitというテストツールを使って、バリデーションの動作を自動でチェックできますよ。」
生徒
「自動でチェックできるって安心ですね!テストの書き方を詳しく教えてください!」
先生
「もちろんです。初心者の方にも分かりやすく、ステップごとに説明していきますね。」
1. バリデーションのテストって何をするの?
Symfonyでのバリデーションのテストとは、データに対して設定したルール(バリデーション)が正しく働いているかどうかを自動で確認する作業のことです。
例えば、「名前は空であってはいけない」「メールアドレスは正しい形式で入力する」といったルールがある場合、間違ったデータを与えてエラーになるか、正しいデータを与えてエラーにならないかをテストコードで確かめます。
これにより、将来誰かがコードを変更しても、バリデーションが壊れていないかをすぐに発見できるのです。
2. Symfonyで使われるテストツール:PHPUnitとは?
PHPUnit(ピーエイチピー・ユニット)は、PHPでテストを書くための代表的なツールです。Symfonyでは初めからこのPHPUnitが使えるようになっていて、すぐにテストを書くことができます。
テストとは「正しく動くか自動で確認するチェックリスト」のようなものです。人間が何度も確認しなくて済むように、プログラムで確かめる仕組みです。
3. テスト対象のエンティティを準備しよう
まずは、テストする対象のエンティティクラスを用意します。ここではUserというクラスにnameとemailのバリデーションを設定します。
use Symfony\Component\Validator\Constraints as Assert;
class User
{
/**
* @Assert\NotBlank(message="名前は必須です。")
*/
private $name;
/**
* @Assert\Email(message="メールアドレスの形式が正しくありません。")
*/
private $email;
public function setName(string $name) { $this->name = $name; }
public function getName(): ?string { return $this->name; }
public function setEmail(string $email) { $this->email = $email; }
public function getEmail(): ?string { return $this->email; }
}
ここでは@Assert\NotBlankと@Assert\Emailというルール(アノテーション)を使って、バリデーションを設定しています。
4. バリデーションテストの基本構成を覚えよう
Symfonyのテストクラスはtestsフォルダに置きます。ファイル名の最後にはTestをつけます。クラスも同じくTestで終わるようにします。
以下は、バリデーションテストの基本的なコードです。
use PHPUnit\Framework\TestCase;
use Symfony\Component\Validator\Validation;
class UserValidationTest extends TestCase
{
public function testNameIsRequired()
{
$validator = Validation::createValidatorBuilder()
->enableAnnotationMapping()
->getValidator();
$user = new User();
$user->setName('');
$user->setEmail('valid@example.com');
$errors = $validator->validate($user);
$this->assertGreaterThan(0, count($errors));
}
}
Validation::createValidatorBuilder()を使うことで、アノテーションを有効にしたValidatorを作成しています。assertGreaterThanは「エラーが1件以上あることを確認する」テストです。
5. 複数の項目をテストするには?
テストは1項目ずつ丁寧に行うのが基本ですが、複数のバリデーションルールを1つのテストクラスにまとめることもできます。
public function testInvalidEmail()
{
$validator = Validation::createValidatorBuilder()
->enableAnnotationMapping()
->getValidator();
$user = new User();
$user->setName('田中');
$user->setEmail('間違った形式');
$errors = $validator->validate($user);
$this->assertGreaterThan(0, count($errors));
}
このテストでは、正しい名前と、間違った形式のメールアドレスを使って、バリデーションエラーが発生することを確認しています。
6. テストの実行方法を知ろう
テストは、ターミナル(黒い画面のコマンド操作)で実行します。下記のコマンドで、すべてのテストが自動でチェックされます。
php bin/phpunit
成功したテストは緑色、失敗したテストは赤色で表示されます。失敗した場合は、どこが間違っているのかエラーメッセージで確認できます。
7. バリデーションのテストを書くメリットとは?
手動でバリデーションを毎回確認するのは大変です。しかし、テストを書いておけば、Symfonyが自動でチェックしてくれます。
- エンティティのルールが壊れていないか常に確認できる
- バリデーションエラーの見逃しを防げる
- 複数人で開発していても安心できる
特に大規模なSymfonyプロジェクトでは、バリデーションテストの自動化は欠かせません。