📚 PHP 최상급 - 6주차: 테스트 자동화 (단위/통합/E2E 테스트)- 01 PHPUnit을 이용한 단위 테스트

2025. 10. 19. 13:03프로그램/PHP 최상급

단위 테스트의 중요성 및 PHPUnit 소개

📚 PHP 최상급 - 6주차: 테스트 자동화 (단위/통합/E2E 테스트)- 01 PHPUnit을 이용한 단위 테스트

 

#소프트웨어 #개발에서 #테스트(#Test)는 코드의 #품질과 #안정성(#Stability)을 보장하는 핵심 활동이에요. 특히, #단위 #테스트(#Unit_Test)는 애플리케이션의 가장 작은 단위(주로 #클래스 또는 #메서드)가 예상대로 정확히 동작하는지 검증하는 과정이에요. 이는 #버그를 사전에 발견하고, #리팩토링(#Refactoring) 시 기존 기능이 손상되지 않도록 보호하는 역할을 해요.

#PHP 환경에서는 #PHPUnit이 사실상의 #표준 #테스팅 #프레임워크(#Testing_Framework)로 사용되고 있어요. #Java의 #JUnit 계열을 따르며, #개발자가 #테스트를 #자동화하고 #결과를 쉽게 확인할 수 있도록 다양한 기능을 제공해요.


PHPUnit 설치 및 기본 설정

#PHPUnit은 일반적으로 #Composer를 통해 프로젝트에 추가해요.

1. Composer를 이용한 설치

Bash
 
composer require --dev phpunit/phpunit
  • --dev 옵션은 #PHPUnit이 #개발(#Development) 환경에서만 필요하며 #운영(#Production) 환경에는 포함되지 않도록 지정해요.

2. 설정 파일 (phpunit.xml)

프로젝트 루트 디렉토리에 phpunit.xml 파일을 생성하여 #테스트의 #경로, #부트스트랩 파일, #코드 #커버리지 설정 등을 지정할 수 있어요.

XML
 
<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.5/phpunit.xsd"
         bootstrap="vendor/autoload.php"
         colors="true">
    <testsuites>
        <testsuite name="Application">
            <directory>tests</directory> 
        </testsuite>
    </testsuites>
    </phpunit>

단위 테스트 클래스 작성 원칙 및 구조

루젠소프트 단위 테스트 클래스 작성 원칙 및 구조

 

#PHPUnit을 사용하여 테스트를 작성할 때는 특정 #규칙을 따라야 해요.

1. 테스트 클래스 구조

  • 상속: 모든 #테스트 #클래스는 PHPUnit\Framework\TestCase를 #상속받아야 해요.
  • 파일/클래스 명명: 테스트 대상 클래스 이름 뒤에 Test를 붙이고, tests/ 디렉토리에 저장하는 것이 관례예요 (예: Calculator 클래스 -> CalculatorTest.php).
  • 테스트 메서드: 테스트 대상 메서드 이름 앞에 test를 붙이거나, #@test #어노테이션(#Annotation)을 붙여야 #PHPUnit이 이를 #테스트로 인식해요.

2. AAA 패턴 (Arrange-Act-Assert)

좋은 #단위 #테스트는 일반적으로 AAA 패턴을 따라 세 부분으로 구성돼요.

  1. Arrange (준비): 테스트에 필요한 초기 #상태(#State), #객체, #입력 #데이터를 설정해요.
  2. Act (실행): 테스트 대상 코드(메서드)를 실행해요.
  3. Assert (단언/검증): 실행 결과가 예상과 일치하는지 #PHPUnit의 #단언(#Assertion) 메서드를 사용하여 검증해요.

3. 단언(Assertion) 메서드 예시

#PHPUnit은 결과를 검증하기 위한 다양한 #단언 #메서드를 제공해요.

단언 메서드 설명
$this->assertEquals($expected, $actual) 두 값이 같은지 검증해요.
$this->assertTrue($condition) 조건이 true인지 검증해요.
$this->assertCount($expectedCount, $array) 배열의 #요소 #개수를 검증해요.
$this->assertInstanceOf($expectedClass, $object) 객체가 특정 #클래스의 #인스턴스인지 검증해요.
$this->assertNull($variable) 변수가 null인지 검증해요.

4. 코드 예시

예를 들어, 간단한 덧셈 기능을 가진 Calculator 클래스에 대한 테스트 코드는 다음과 같이 작성해요.

src/Calculator.php

PHP
 
<?php
class Calculator {
    public function add(int $a, int $b): int {
        return $a + $b;
    }
}

tests/CalculatorTest.php

PHP
 
<?php
use PHPUnit\Framework\TestCase;

class CalculatorTest extends TestCase {
    
    public function testAdditionOfTwoNumbers(): void {
        // Arrange (준비)
        $calculator = new Calculator();
        $expected = 5;
        
        // Act (실행)
        $result = $calculator->add(2, 3);
        
        // Assert (검증)
        $this->assertEquals($expected, $result, "2 + 3은 5여야 합니다.");
    }
    
    public function testNegativeNumberAddition(): void {
        // Arrange
        $calculator = new Calculator();
        
        // Act & Assert (단순화)
        $this->assertEquals(0, $calculator->add(-5, 5));
    }
}

테스트 실행 및 추가 기능

루젠소프트 PHP강의 - 테스트 실행 및 추가 기능

 

1. 테스트 실행

터미널에서 #PHPUnit #실행 파일을 호출하여 테스트를 실행해요.

Bash
 
# Composer 설치 시
./vendor/bin/phpunit 

# 특정 테스트 파일만 실행
./vendor/bin/phpunit tests/CalculatorTest.php

2. Mock 객체 (Mock Object)

#단위 #테스트는 테스트 대상 단위 외의 **외부 #의존성(#Dependency)**으로부터 #독립적이어야 해요. 예를 들어, 데이터베이스나 #외부 #API 호출이 필요한 경우, 실제 의존성 대신 #Mock #객체를 사용하여 테스트 #환경을 #격리해요.

  • #Mock 객체를 사용하면 특정 메서드가 호출되었는지, 어떤 #인자(#Argument)로 호출되었는지 등을 확인하고, 정해진 #결과값을 #반환하도록 설정할 수 있어요.

3. 데이터 제공자 (Data Provider)

동일한 #테스트 #로직을 여러 #입력 #데이터 #세트로 반복 실행해야 할 때 #데이터 #제공자(#Data_Provider) 기능을 사용해요. 이는 #테스트 #코드의 #중복을 줄이고 테스트 케이스를 명확하게 관리할 수 있게 해줘요.

PHP
 
    /**
     * @dataProvider additionProvider
     */
    public function testAdd(int $a, int $b, int $expected): void {
        $calculator = new Calculator();
        $this->assertEquals($expected, $calculator->add($a, $b));
    }
    
    public function additionProvider(): array {
        return [
            [0, 0, 0],
            [1, 1, 2],
            [10, 5, 15],
            [-1, 1, 0],
        ];
    }

#PHPUnit은 #테스트 #자동화의 기본이며, 견고한 #PHP #애플리케이션 개발에 필수적인 도구예요. 이를 통해 개발자는 코드 변경에 대한 확신을 가지고 개발할 수 있어요.

 

 

기간,수량별 추가50%할인, KT초고속IP, 블로그,지식인,쇼핑,지도 마케팅 가능

https://xn--299ao67b9qbmsf04c.net/

 

VPN 5,500원 / IP교체 1,100원 / 유동프록시 22,000원 | LuzenVPN 루젠VPN

국내최저가 고정IP서비스,유동프록시(IP4000개이상제공),PPTP,L2TP,IPSec,OpenVPNVPN,통신사VPN,VPN프로그램,고정IP,고정아이피,PPTP,저렴한VPN,리니지MVPN,리니지VPN,아이온VPN,던파VPN,유동프록시,유동PROXY,바이

vpn.luzensoft.com