Program/C#

C# 유닛(단위)테스트(1)

사막여유 2024. 12. 9. 23:50
728x90

오늘은 C#에서의 유닛(단위) 테스트에 대해 알아보려 합니다.

 

C#에서 유닛(단위) 테스트란?

유닛 테스트(Unit Test)는 프로그램의 작은 조각(주로 클래스나 메서드)이 올바르게 작동하는지 검증하는 과정입니다. "유닛(Unit)"은 프로그램의 가장 작은 독립 실행 단위를 의미합니다.

쉽게 말해, 코드가 우리가 기대한 대로 동작하는지 자동으로 확인하는 테스트입니다.

 


 

유닛 테스트의 종류

  1. 수동 테스트
    • 사람이 직접 입력 값을 넣고 결과를 확인하는 방식.
    • 단점: 반복 작업이 많아 시간이 오래 걸림.
  2. 자동화 테스트
    • 테스트 코드를 작성하여 자동으로 테스트를 수행.
    • 장점: 반복적으로 실행 가능하고, 실수 확률이 적음.

 


 

C#에서 유닛 테스트의 방식

C#에서는 주로 다음과 같은 유닛 테스트 프레임워크를 사용합니다.

  1. MSTest
    • Microsoft에서 제공하는 기본 유닛 테스트 프레임워크.
    • Visual Studio와 통합이 잘 되어 있음.
  2. xUnit
    • 간결한 문법과 확장성이 뛰어난 유닛 테스트 프레임워크.
  3. NUnit
    • 강력한 기능과 다양한 어트리뷰트를 제공하는 프레임워크.

 


 

유닛 테스트를 어떻게 사용하는가?

테스트 대상 클래스

public class Calculator
{
    public int Add(int a, int b)
    {
        return a + b;
    }
}

테스트 클래스

아래는 MSTest를 사용한 테스트 코드의 예입니다.

using Microsoft.VisualStudio.TestTools.UnitTesting;

[TestClass]
public class CalculatorTests
{
    [TestMethod]
    public void Add_ValidInputs_ReturnsCorrectSum()
    {
        // Arrange
        var calculator = new Calculator();
        int a = 3, b = 5;

        // Act
        int result = calculator.Add(a, b);

        // Assert
        Assert.AreEqual(8, result); // 기대값: 8
    }
}

 


 

테스트 코드 작성 방법 (3A 원칙)

테스트 코드는 다음의 **3A 패턴(Arrange, Act, Assert)**을 따릅니다:

  1. Arrange (준비)
    • 테스트에 필요한 데이터를 준비.
  2. Act (실행)
    • 테스트 대상 메서드 호출.
  3. Assert (검증)
    • 기대값과 실제 결과를 비교.

 


 

Visual Studio에서 MSTest로 유닛 테스트 실행하기

  1. 테스트 프로젝트 생성
    • Visual Studio에서 새 프로젝트 > 단위 테스트 프로젝트(MSTest) 선택.
  2. 테스트 클래스 작성
    • [TestClass] 어트리뷰트를 붙여 테스트 클래스 선언.
    • [TestMethod] 어트리뷰트를 붙여 테스트 메서드 선언.
  3. 테스트 실행
    • Visual Studio 상단 메뉴에서 테스트 > 모든 테스트 실행 클릭.
    • 테스트 결과는 테스트 탐색기에서 확인 가능.

 


 

MSTest 예시: 모듈 테스트 작성

테스트 대상 클래스

public class LaneDetector
{
    public string DetectLaneType(byte[] image)
    {
        if (image == null || image.Length == 0)
            throw new ArgumentException("Invalid image data");

        return "Solid"; // 예시로 '실선' 반환
    }
}

MSTest 기반 테스트 코드

using Microsoft.VisualStudio.TestTools.UnitTesting;

[TestClass]
public class LaneDetectorTests
{
    [TestMethod]
    public void DetectLaneType_ValidImage_ReturnsLaneType()
    {
        // Arrange
        var laneDetector = new LaneDetector();
        byte[] image = new byte[] { 255, 128, 64 };

        // Act
        string laneType = laneDetector.DetectLaneType(image);

        // Assert
        Assert.AreEqual("Solid", laneType);
    }

    [TestMethod]
    [ExpectedException(typeof(ArgumentException))]
    public void DetectLaneType_InvalidImage_ThrowsArgumentException()
    {
        // Arrange
        var laneDetector = new LaneDetector();
        byte[] invalidImage = null;

        // Act
        laneDetector.DetectLaneType(invalidImage);

        // Assert
        // ExpectedException으로 예외 발생 확인
    }
}

 


 

테스트 코드의 장점

  • 코드 품질 향상: 버그를 사전에 방지.
  • 유지보수 편리: 코드 수정 후에도 기존 기능 검증 가능.
  • 협업 효율성: 코드 동작을 명확히 설명하는 문서 역할.

MSTest는 Visual Studio와 통합되어 간단히 테스트 코드를 작성하고 실행할 수 있어 개발 초기에 유용하게 활용할 수 있습니다. 

728x90

'Program > C#' 카테고리의 다른 글

C# netDxf 라이브러리 (1)  (0) 2024.12.16
C# 유닛(단위)테스트(2)  (1) 2024.12.09
C# 디스크I/O  (1) 2024.12.07
C# _ Interface  (0) 2024.11.24
C# 병렬처리3 _ Mutex  (0) 2024.11.23