PHPUnit 에서 예외 테스트(Exception Test) 하기


단위 테스트 작성시 특정 Exception 이 발생해야 하는 경우가 있습니다.


예로 입력값이 유효한 전화 번호인지 검증하는 validator 를 만들었다면 유효하지 않은 입력값일 경우 테스트 코드는 \Illuminate\Validation\ValidationException 예외가 발생하지 않으면 단위테스트가 실패한 것으로 처리해야 합니다.


이런 예외를 테스트하기 위해 PHPUnit 은 2가지 방법을 제공합니다.

@expectedException 사용

예전 버전의 PHPUnit 은 이를 위해 다음과 같이 @expectedException 을 테스트 함수의 PHPDoc 에 기술해 주면 됐지만 deprecated 됐고 PHPUnit 9 에서는 제거될 예정입니다.

<?php

class ValidationTest extends TestCase
{
    /**
     * @test
     * @expectedException \Illuminate\Validation\ValidationException
     */
    public function thrown_validation_exception_when_input_invalid_phone_number()
    {
		$invalid_phone_number = [
            'invalid_phone_number' => '987654321',
        ];

        $validator = Validator::make($invalid_phone_number, [
            'invalid_phone_number' => [
                'required',
                'max:15',
                new CellPhoneRule(),
            ],
        ]);

        $validator->validate();

        $this->assertTrue(true);
	}


expectException method 사용

최신 버전의 PHPUnit 은 expectException(string $exception) 메서드 사용을 권장하고 있습니다. 테스트 코드 시작점에 호출해 주고 테스트 코드를 아래에 기술해 주면 됩니다.

<?php

class ValidationTest extends TestCase
{
    /**
     * @test
     */
    public function thrown_validation_exception_when_input_invalid_phone_number()
    {
		// 발생할 Exception 설정
		$this->expectException(\Illuminate\Validation\ValidationException::class);

        $invalid_phone_number = [
            'invalid_phone_number' => '987654321',
        ];


Ref