[테스트코드]단위테스트 - 예제

보람·2022년 1월 19일
0

테스트코드

목록 보기
2/4

단위테스트 구성

많이 사용하는 방법은 작성하고자 하는 Class를 기준으로 테스트 클래스를 생성하여 해당 Class 안에 있는 함수에 대한 테스트 함수를 작성하는 것이다!
아래처럼..

CalcClass -> CalcClassTest

  • add() -> testAdd()
  • minus() -> testMinus()

기본 예제 → PhpUnit을 사용하여 배열 작업 테스트

  1. Class의 테스트는 ClassTest로 들어간다.
  2. ClassTest는 기본적으로 TestCase를 상속받는다.
  3. 함수앞에 test를 두거나 @test 를 사용하여 테스트임을 표시할 수 있다.
  4. 테스트 방법에서는 실제 값이 기대값과 일차한다고 주장할 수 있는 assertEquals 함수를 사용했다.
<?php
use PHPUnit\Framework\TestCase;

class StackTest extends TestCase
{

    public function testPushAndPop()
    {
        $stack = [];
        $this->assertEquals(0, count($stack));

        array_push($stack, 'foo');
        $this->assertEquals('foo', $stack[count($stack)-1]);
        $this->assertEquals(1, count($stack));

        $this->assertEquals('foo', array_pop($stack));
        $this->assertEquals(0, count($stack));
    }
}
?>

위 예제 함수의 명칭이 test로 시작해서 위 함수는 @test 를 붙이지 않고도 테스트 실행이 가능하다.

테스트 의존성(dependencies)

단위테스트는 한가지의 기능만을 테스트해야 하지만 반드시 캡슐화해야만 하는 것은 아니다. 테스트 방법들 사이에는 숨겨진 암묵적 의존성이 있다.

PHPUnit의 @depends 는 테스트 방법 간의 명시적 종속성 선언을 지원한다. 이러한 의존성은 테스트 방법이 실행되는 순서를 정의하지 않지만, 생산자에 의해 테스트 설비의 값을 반환하고 전달할 수 있다.

  • A함수에서 리턴해주는 함수를 B함수에서 쓰고자 할때 @depends 를 이용할 수 있을 것 같다.
  • 어떤 컬럼값을 바꾼 모델을 리턴하는 테스트 함수를 다른 테스트 함수에서 의존성을 주입해준다면 해당 리턴된 모델을 사용할 수 있다.
  • 테스트 함수가 아닌 다른 함수를 이용해서도 해당 모델값을 리턴받을 수 있지만 다른점이 있다면 한번더 assert함수를 호출하여 해당 $model 값을 테스트할 수 있다는 점이다.
/**
  * @test
  * @testdox 값을 넣은 모델 리턴
  * @return void
  */
public function a_can_get_test_model()
{
    $model = TestModel::find($this->id);
    
    $this->assertNotEmpty($model);

    $model->test_col = 'test입니다.';
    
    return $model
}

/**
  * @test
  * @testdox 모델의 컬럼값이 생각하는 값과 일치하는지 테스트
  * @depends a_can_get_test_model
  * @param Model $testModel
  * @return void
  */
public function a_can_compare_equal_test_col(Model $testModel)
{
    $this->assertEquals($testModel->test_col, 'test입니다.', '값이 일치하지 않습니다.');
}
  • a_can_compare_equal_test_col()함수 실행전 a_can_get_test_model()함수에서 assert 함수를 실행한 모델을 리턴받아서 사용할 수 있다.

@depends 는 아래와 같이 여러개를 정의할 수도 있다.

이때 string $first, string $second는 생략해도 되고 명시해도 된다!!

public function testFirst()
{
    $this->assertTrue(true);
    return 'first';
}

public function testSecond()
{
    $this->assertTrue(true);
    return 'second';
}

/**
 * @depends testFirst
 * @depends testSecond
 * @return void
 */
public function testMultiple(string $first, string $second)
{
    $this->assertEquals(['first','second'], func_get_args());
}

해당 글은 더 좋은 예제가 있다면 추가될 예정입니다 : )

profile
백엔드 개발자

0개의 댓글