C#

C# 기초부터 고급까지 Chapter 2.8.1: MSTest 완전정복 – 기본부터 실전 예제까지

Juan_ 2025. 5. 2. 22:29
728x90

📘 Chapter 2.8.1: MSTest 완전정복 – 기본부터 실전 예제까지


✅ 이 챕터에서 확실하게 배울 것

  • MSTest란 무엇인가?
  • xUnit과 구조적으로 뭐가 다른가?
  • MSTest 프로젝트 생성 및 설정
  • [TestClass], [TestMethod]의 의미
  • Assert 사용법
  • 데이터 기반 테스트 ([DataRow])
  • MSTest에서 Mock 사용하기 (Moq 연동)

1️⃣ MSTest란?


Microsoft에서 공식 제공하는 단위 테스트 프레임워크

  • ✅ Visual Studio 통합성 최강
  • ✅ Attribute 기반 구조
  • ✅ .NET Framework 시절부터 쭉 사용됨
  • ✅ 안정성, 호환성 좋음
  • 실무에서 여전히 많이 씀

2️⃣ MSTest vs xUnit 한눈 정리


항목 MSTest xUnit
프로젝트 템플릿 mstest xunit
테스트 어노테이션 [TestMethod] [Fact]
클래스 지정 [TestClass] 필요 필요 없음
Assertion Assert.AreEqual() 등 Assert.Equal() 등
속성 방식 Attribute 기반 Attribute + 확장성

✅ 두 프레임워크 다 강력함. 단지 스타일 차이.


3️⃣ MSTest 프로젝트 생성


dotnet new mstest -n MyApp.MSTests
cd MyApp.MSTests
dotnet add reference ../MyApp/MyApp.csproj
  • ✅ 생성되면 UnitTest1.cs 기본 포함됨
  • ✅ 모든 테스트 클래스는 [TestClass] 달아야 인식됨

4️⃣ 기본 테스트 예제


🔧 테스트 대상 클래스

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

✅ MSTest 코드

using Microsoft.VisualStudio.TestTools.UnitTesting;

[TestClass]
public class CalculatorTests
{
    [TestMethod]
    public void Add_두수를_더하면_정상결과나와야함()
    {
        // Arrange
        var calc = new Calculator();

        // Act
        int result = calc.Add(3, 5);

        // Assert
        Assert.AreEqual(8, result);
    }
}
  • [TestClass] + [TestMethod]가 필수
  • ✅ 메서드 이름 자유롭게 쓰면 됨!

5️⃣ 다양한 Assert 정리


메서드 설명
Assert.AreEqual(expected, actual) 값 비교
Assert.IsTrue(condition) 조건 만족
Assert.IsNotNull(obj) null 아님 확인
Assert.ThrowsException() 예외 발생 확인

💥 예외 확인 예제

[TestMethod]
public void Divide_By_Zero_예외발생()
{
    var calc = new Calculator();

    Assert.ThrowsException<DivideByZeroException>(() =>
    {
        calc.Divide(10, 0);
    });
}

6️⃣ 데이터 기반 테스트 (DataRow)


[TestMethod]
[DataRow(2, 3, 6)]
[DataRow(0, 100, 0)]
[DataRow(5, 5, 25)]
public void Multiply_테스트(int a, int b, int expected)
{
    var calc = new Calculator();

    int result = calc.Multiply(a, b);

    Assert.AreEqual(expected, result);
}
  • [DataRow] 붙이면 자동으로 여러 입력값으로 반복 테스트 가능
  • [TestMethod]랑 같이 써야 함

7️⃣ 의존성 테스트 – Moq 연동


📌 인터페이스 예제

public interface IEmailService
{
    void Send(string email);
}

📌 대상 클래스

public class UserService
{
    private readonly IEmailService _email;

    public UserService(IEmailService email)
    {
        _email = email;
    }

    public bool Register(string email)
    {
        _email.Send(email);
        return true;
    }
}

📦 Moq 설치

dotnet add package Moq

✅ MSTest에서 Mock 사용

[TestClass]
public class UserServiceTests
{
    [TestMethod]
    public void Register_이메일_전송되어야함()
    {
        // Arrange
        var mock = new Mock<IEmailService>();
        var service = new UserService(mock.Object);

        // Act
        var result = service.Register("test@example.com");

        // Assert
        mock.Verify(e => e.Send("test@example.com"), Times.Once());
        Assert.IsTrue(result);
    }
}
  • ✅ xUnit과 완전히 같은 방식으로 Moq 쓸 수 있다
  • ✅ Assert 방식만 다름 (Assert.IsTrue, AreEqual 등)

✅ MSTest 실무 팁


상황 추천
Visual Studio 중심 개발 MSTest 유리
.NET Framework 프로젝트 MSTest 기본
빠르게 배우고 쓰기 xUnit 직관적이지만 MSTest도 충분히 강력
팀에서 이미 쓰고 있음 팀 룰 따르자 (MSTest 많이 씀!)

✅ 최종 요약


항목 요약
MSTest 구조 [TestClass] + [TestMethod]
데이터 테스트 [DataRow]
Assertion Assert.AreEqual, IsTrue, ThrowsException
Mock Moq 연동 가능 (xUnit과 동일)

📢 다음 챕터 예고 🎓

다음 챕터 주제
Chapter 2.9 인터페이스 활용 – 다형성 실전 예제

✋ 제자야!

이제:

  • xUnit vs MSTest 차이도 머리에 딱 정리됐고
  • Mock 예제도 실전 감각으로 익혔다면

바로 다음 챕터 2.9로 갈지?

아니면 Moq 쪽 더 심화해볼지?

외쳐라! 가보자 or 더 줘보자!
장선생 바로 따라간다잉 😎🔥

728x90