학습
PHP PHP에서의 테스트 주도 개발 (TDD)
PHP PHP에서의 테스트 주도 개발 (TDD) — 고급
PHP에서의 테스트 주도 개발 (TDD)
1. 도입 (왜 배워야 하는가)
테스트 주도 개발(TDD)은 소프트웨어 개발에서 필수적인 방법론으로 자리 잡고 있습니다. TDD를 통해 코드를 작성하기 전에 테스트 케이스를 먼저 작성함으로써 개발자는 명확한 목표를 가지고 코드를 작성할 수 있습니다. 실무에서 TDD를 적용하지 않으면 다음과 같은 문제가 발생할 수 있습니다:
- 버그 발생 빈도 증가: 사전 테스트가 없는 코드는 더 많은 버그를 유발할 가능성이 높습니다.
- 리팩토링 어려움: 기존 코드가 어떤 기능을 수행하는지 명확하지 않으면, 변경 시 오류가 발생할 수 있습니다.
- 의사소통 문제: 팀원 간의 이해도가 떨어져 협업이 어려워질 수 있습니다.
따라서 TDD는 고품질의 코드를 작성하고 유지보수성을 향상시키는 데 매우 중요합니다.
2. 핵심 개념 설명
TDD의 핵심 개념은 "Red-Green-Refactor" 주기입니다. 이를 통해 코드의 품질을 보장할 수 있습니다. 이 과정을 실생활 비유로 설명하자면, 요리 레시피를 작성하는 과정과 유사합니다. 먼저 요리 방법(테스트)을 정하고, 이를 따라 요리를 만든 후(코드 작성) 맛을 보고(리팩토링) 수정하는 방식입니다.
관련 용어 정리
| 용어 | 설명 |
|---|---|
| Red | 실패하는 테스트 케이스 작성 |
| Green | 테스트를 통과하는 최소한의 코드 작성 |
| Refactor | 코드를 정리하고 최적화하는 단계 |
3. 기본 코드 예제
아래는 PHP에서 TDD를 적용하여 간단한 덧셈 함수를 테스트하는 예제입니다.
// Calculator.php
class Calculator {
public function add($a, $b) {
return $a + $b;
}
}
// CalculatorTest.php
class CalculatorTest extends PHPUnit\Framework\TestCase {
public function testAdd() {
$calc = new Calculator();
$this->assertEquals(4, $calc->add(2, 2));
}
}
Calculator.php에서 Calculator 클래스를 정의하고 add 메서드를 추가합니다.CalculatorTest.php에서 PHPUnit을 사용하여 Calculator 클래스의 add 메서드를 테스트합니다.실행 결과:
OK (1 test, 1 assertion)
코드 한 줄씩 동작 설명:
Calculator클래스가 덧셈 기능을 수행하는add메서드를 정의합니다.CalculatorTest클래스는 PHPUnit의 TestCase를 상속받아 테스트 케이스를 작성합니다.testAdd메서드에서Calculator인스턴스를 생성하고add메서드를 호출하여 2와 2를 더합니다.assertEquals메서드는 결과가 기대한 값(4)과 일치하는지 확인합니다.- 잘못된 코드:
- 올바른 코드: 테스트 케이스를 작성해야 합니다.
- 잘못된 코드:
- 올바른 코드: 항상 실패한 원인을 분석하고 수정해야 합니다.
- TDD는 고품질의 코드를 작성하는 데 필수적입니다.
- "Red-Green-Refactor" 주기를 통해 테스트를 먼저 작성하고 코드를 발전시켜 나갑니다.
- 실전 예제로 장바구니 및 사용자 인증 시스템을 구현할 수 있습니다.
- 다음에 학습하면 좋은 주제는 Continuous Integration (CI)와 Behavior Driven Development (BDD)입니다.
4. 실전 활용 예제
예제 1: 쇼핑몰에서 장바구니를 구현할 때
장바구니에 상품을 추가하는 기능을 TDD로 구현할 수 있습니다.
// Cart.php
class Cart {
private $items = [];
public function addItem($item) {
$this->items[] = $item;
}
public function getItems() {
return $this->items;
}
}
// CartTest.php
class CartTest extends PHPUnit\Framework\TestCase {
public function testAddItem() {
$cart = new Cart();
$cart->addItem('apple');
$this->assertCount(1, $cart->getItems());
}
}
예제 2: 사용자 인증 시스템
사용자 로그인 기능을 TDD로 구현하여 보안을 강화할 수 있습니다.
// User.php
class User {
private $password;
public function setPassword($password) {
$this->password = password_hash($password, PASSWORD_DEFAULT);
}
public function verifyPassword($password) {
return password_verify($password, $this->password);
}
}
// UserTest.php
class UserTest extends PHPUnit\Framework\TestCase {
public function testVerifyPassword() {
$user = new User();
$user->setPassword('secret');
$this->assertTrue($user->verifyPassword('secret'));
}
}
5. 흔한 실수와 주의사항
실수 1: 테스트 케이스를 작성하지 않음
$result = $calc->add(2, 2);
echo $result; // 4
실수 2: 테스트가 실패할 경우 원인을 찾지 않음
$this->assertEquals(5, $calc->add(2, 2)); // 실패