이전 글에서 TDD의 개념과 MSTest 설정 방법을 알아보았습니다. 이제는 실제로 간단한 기능을 TDD로 구현해 보겠습니다. 😎
이번 글에서는 계산기 프로그램을 예제로 사용해 MSTest로 테스트 코드 작성 → 코드 작성 → 리팩토링까지 진행해 보겠습니다.
✅ 테스트 대상 코드 개요
간단한 계산기(Calculator) 클래스를 만들고 다음 기능을 구현합니다.
✔️ 덧셈 (Add)
✔️ 뺄셈 (Subtract)
✔️ 곱셈 (Multiply)
✔️ 나눗셈 (Divide)
테스트 코드를 먼저 작성한 후, 이를 통과하도록 코드를 작성하는 TDD 사이클을 따라가겠습니다.
🏗️ 프로젝트 구조 설정
1️⃣ 프로젝트 생성
이전 글에서 만든 TDDExample 솔루션에 다음과 같은 구조로 프로젝트를 구성합니다.
TDDExample
├── TDDExample (기능 코드)
├── TDDExample.Tests (테스트 코드)
2️⃣ Calculator 클래스 생성
TDDExample 프로젝트에 Calculator.cs 파일 생성
namespace TDDExample
{
public class Calculator
{
// 여기에 코드 작성 예정
}
}
✅ 테스트 코드 작성하기
이제 TDD 사이클의 Red 단계입니다.
테스트를 먼저 작성하고 이를 통과하도록 코드를 작성하겠습니다.
🧪 1. 덧셈 테스트 작성하기
TDDExample.Tests 프로젝트에서 CalculatorTests.cs 파일 작성
using Microsoft.VisualStudio.TestTools.UnitTesting;
using TDDExample;
namespace TDDExample.Tests
{
[TestClass]
public class CalculatorTests
{
[TestMethod]
public void Add_ShouldReturnSumOfTwoNumbers()
{
// Arrange
var calculator = new Calculator();
int a = 3;
int b = 5;
int expected = 8;
// Act
int result = calculator.Add(a, b);
// Assert
Assert.AreEqual(expected, result);
}
}
}
✔️ 테스트 설명
- Arrange → 테스트에 필요한 값 설정
- Act → 실제 코드 실행
- Assert → 결과값이 예상값과 같은지 확인
🚨 2. 컴파일 오류 발생 → 코드 작성 필요
테스트를 실행하면 다음과 같은 오류가 발생합니다.
❌ 오류: Calculator 클래스에 Add 메서드가 정의되지 않았습니다.
👉 다음 단계에서 테스트가 통과하도록 Add 메서드를 구현하겠습니다.
✅ 테스트 통과 코드 작성하기
TDD 사이클의 Green 단계입니다.
테스트가 통과하도록 최소한의 코드를 작성합니다.
🧑💻 Calculator.cs 수정
namespace TDDExample
{
public class Calculator
{
public int Add(int a, int b)
{
return a + b;
}
}
}
🚀 테스트 실행 및 통과 확인
- Visual Studio에서 테스트 → 모든 테스트 실행
- 결과 창에서 테스트 성공 확인
✅ 성공 메시지 출력 → "Add_ShouldReturnSumOfTwoNumbers 통과"
✅ 다른 연산도 동일한 방식으로 구현하기
같은 방식으로 뺄셈, 곱셈, 나눗셈 테스트 및 코드를 추가합니다.
🧪 3. 뺄셈 테스트 작성
[TestMethod]
public void Subtract_ShouldReturnDifferenceOfTwoNumbers()
{
// Arrange
var calculator = new Calculator();
int a = 10;
int b = 3;
int expected = 7;
// Act
int result = calculator.Subtract(a, b);
// Assert
Assert.AreEqual(expected, result);
}
🧑💻 Subtraction 코드 작성
public int Subtract(int a, int b)
{
return a - b;
}
🧪 4. 곱셈 테스트 작성
[TestMethod]
public void Multiply_ShouldReturnProductOfTwoNumbers()
{
// Arrange
var calculator = new Calculator();
int a = 4;
int b = 5;
int expected = 20;
// Act
int result = calculator.Multiply(a, b);
// Assert
Assert.AreEqual(expected, result);
}
🧑💻 Multiply 코드 작성
public int Multiply(int a, int b)
{
return a * b;
}
🧪 5. 나눗셈 테스트 작성
[TestMethod]
public void Divide_ShouldReturnQuotientOfTwoNumbers()
{
// Arrange
var calculator = new Calculator();
int a = 10;
int b = 2;
int expected = 5;
// Act
int result = calculator.Divide(a, b);
// Assert
Assert.AreEqual(expected, result);
}
🧑💻 Divide 코드 작성
public int Divide(int a, int b)
{
if (b == 0)
throw new DivideByZeroException("Cannot divide by zero.");
return a / b;
}
✅ 리팩토링 단계
이제 코드를 깔끔하게 정리해 보겠습니다.
- 중복 코드 제거
- 변수 및 메서드 명명 규칙 통일
👉 최종 리팩토링된 코드는 다음과 같습니다.
public class Calculator
{
public int Add(int a, int b) => a + b;
public int Subtract(int a, int b) => a - b;
public int Multiply(int a, int b) => a * b;
public int Divide(int a, int b)
{
if (b == 0)
throw new DivideByZeroException("Cannot divide by zero.");
return a / b;
}
}
🚀 최종 테스트 결과 확인
모든 테스트를 실행하고 결과를 확인합니다.
✅ 모든 테스트 통과 → 코드 완성! 🎉
🎯 마무리 및 다음 단계
이제 TDD 사이클을 성공적으로 적용했습니다.
다음 글에서는 예외 처리 및 다양한 입력 값에 대한 테스트 추가를 진행해 보겠습니다.