단위 테스트 케이스를 설계할 때 고려해야 할 두 가지 주요 접근 방식은 다음과 같습니다:
- 파라미터 기반 접근법
- 실행 경로 기반 접근법
public static bool ContainsNamelessItems(this List<Item> items)
{
return items.Any(item => item.Name.IsNullOrEmpty());
}
이 메서드는 항목 리스트를 입력으로 받아 각 항목의 이름 속성이 비어 있는지 확인합니다. 이름이 존재하고 비어 있지 않으면 true를 반환하고, 그렇지 않으면 false를 반환합니다.
파라미터 기반 접근법으로 테스트 케이스 구성하기
이 접근법은 메서드에 전달될 수 있는 다양한 입력 값들을 고려하는 것입니다. 입력 파라미터인 items는 다음과 같은 가능한 상태를 가질 수 있습니다:- 빈 리스트
- 하나 이상의 이름이 없는 항목 포함
- 모든 항목이 이름을 갖는 경우
- null 값
- 빈 리스트인 경우, 결과는 false여야 합니다.
public void WhenItemListIsEmpty_ShouldReturnFalse()
{
var items = new List<Item>();
var result = items.ContainsNamelessItems();
result.Should().BeFalse("because an empty list cannot have nameless items");
}
- 이름이 없는 항목이 하나라도 포함된 리스트인 경우, 결과는 true여야 합니다.
public void WhenListContainsNamelessItem_ShouldReturnTrue()
{
var items = new List<Item>
{
new Item { Name = "Item1" },
new Item { Name = string.Empty } // nameless item
};
var result = items.ContainsNamelessItems();
result.Should().BeTrue("because there is at least one nameless item");
}
- 모든 항목이 유효한 이름을 갖는 경우, 결과는 false여야 합니다.
public void WhenAllItemsHaveNames_ShouldReturnFalse()
{
var items = new List<Item>
{
new Item { Name = "Item1" },
new Item { Name = "Item2" }
};
var result = items.ContainsNamelessItems();
result.Should().BeFalse("because all items have valid names");
}
- null 리스트인 경우, ArgumentNullException이 발생해야 합니다.
public void WhenItemListIsNull_ShouldThrowArgumentNullException()
{
List<Item> items = null;
Action act = () => items.ContainsNamelessItems();
act.Should().Throw<ArgumentNullException>("because the input list is null");
}
실행 경로 기반 접근법으로 테스트 케이스 구성하기
이 방법은 메서드 내부에서 실행되는 모든 가능한 경로를 분석하여 테스트 케이스를 설계하는 것입니다. 기존 메서드는 단일 실행 경로만 가지고 있지만, 조건문을 추가하면 여러 경로가 생성됩니다. 예를 들어 null 체크를 추가해보겠습니다. 새로운 메서드 구현은 다음과 같습니다:public static bool ContainsNamelessItems(List<Item> items)
{
if (items == null)
throw new ArgumentException("Items collection cannot be null.");
return items.Any(item => item.Name.IsNullOrEmpty());
}
이 경우에 해당하는 테스트는 다음과 같습니다:
public void WhenItemListIsNull_ShouldThrowArgumentException()
{
List<Item> items = null;
Action act = () => items.ContainsNamelessItems();
act.Should().Throw<ArgumentException>()
.WithMessage("Items collection cannot be null.");
}