본문 바로가기

ETC

[C#] TDD (단위테스트) 작성하기

1. TDD

1.1 TDD 란

코드를 작성하고 원하는 데로 동작하고 결과를 내고 있는지를 확인할 때는

가장 쉽고 편한 방법으로 콘솔로 출력하는 방법을 많이 사용하게 된다.

하지만 규모가 꽤 있는 프로그램의 경우 콜 솔로 모두 확인하는 것은 꽤나 힘든 일이고

확인 후에 콘솔 출력 코드를 지우는 일 또한 매우 번거로운 일이다.

그렇다고 안 지우면 나중에 다른 곳을 테스트할 때 이전에 안 지운 출력 코드로 인해 찾기 힘든 일도 발생한다.

또한 새로운 기능을 테스트는 그렇게 힘든 일이 아니라고 해도

기존에 있던 서비스가 잘 동작하는지 확인하는 것은 정말 큰 비용이 요구된다.

특히 패키지 업데이트를 했을 때 기존의 동작하던 로직들이 이상이 없는지 체크한다고 했을 때는

일일이 콘솔에 출력해가며 할 수는 없는 것이다.

이렇게 새로운 기능이 추가될 때 기존의 기능들이 이상 없이 잘 동작하는지 확인할 수 있게 하는 것이

단위 테스트이다.

기존의 기능들을 모두 테스트 코드로 구현해놓으면 새로운 기능이 추가가 될 때 테스트 코드를 실행시키는 것으로

이상 여부를 쉽게 파악이 가능하다.

 

 

2. 코드작성

2.1 샘플 코드 작성

먼저 간단한 코드 2가지를 작성해볼것이다.

public class Login
{
	public bool CallLoginProcess(string id , string pwd)
	{
		//로그인 프로세스 동작후 로그인 성공 반환
		return true;
	}
}
public class Calculator
{
	public int Add(int number1 , int number2)
	{
		return number1 + number2;
	}
	public int Sub(int number1, int number2)
	{
		return number1 - number2;
	}
}

이제 위의 Class를 확인할 테스트 코드를 작성하여 의도한데로 동작하는지 확인할것이다.

 

 

2.2 테스트 프로젝트 생성

새프로젝트를 만들어서 단위테스트 프로젝트를 생성한다.

위와같이 실제 동작할 프로젝트와 테스트할 프로젝트를 준비해야한다.

 

 

 

2.2 테스트 프로젝트 참조

테스트 프로젝트에서 실제 프로젝트를 참조해야한다.

 

2.4 Assert 사용하기

Assert.IsTrue(value); //: value 가 True 인지 테스트한다.
Assert.IsFalse(value); //: value 가 False 인지 테스트한다.
Assert.AreEqual(expected, value); //: 예상값 expected 과 실제 값 value 가 같은지 테스트한다.
Assert.IsNull(value); //: vlaue 가 null 인지 테스트한다.
Assert.Assert.IsNotNull(value); //: vlaue 가 null 이 아닌지 테스트한다.
//위의 메소드들은 매개변수 2개를 사용할수있다.
//1번 매개변수는 위와같고 2번 매개변수는 실패했을때 보여줄 메시지를 보여준다.

Assert.IsNull(value,"value가 null이 아니다."); // : vlaue가 null인지 테스트하고 만약 테스트 실패라면 메시지를 보여준다.

 

2.5 테스트 코드 작성

 

먼저 Login Class 를 테스트할 코드를 작성할것이다.

테스트를 하는 방법은 많이있지만 간단하게 사용할수있는 Assert 를 사용할것이다.

[TestMethod]
public void CallLoginProcessTest()
{
	string id = "admin";
	string pwd = "123";
	Login login = new Login();
	bool result = login.CallLoginProcess(id, pwd);
	Assert.IsTrue(result);
}

 

id 와 pwd를 Login Class 의 CallLoginProcess 메소드 에게 전달하고

이 반환값이 True 인지 검사하는 코드이다.

다음으로 Calculator Class 의 테스트 코드도 작성해보자.

[TestClass]
public class CalculatorTest
{
	[TestMethod]
	public void AddTest()
	{
		int number1 = 10;
		int number2 = 4;
		int expected = 14;
		Calculator calculator = new Calculator();
		int result = calculator.Add(number1, number2);
		Assert.AreEqual(expected, result);
	}
	[TestMethod]
	public void SubTest()
	{
		int number1 = 10;
		int number2 = 4;
		int expected = 10;
		Calculator calculator = new Calculator();
		int result = calculator.Sub(number1, number2);
		Assert.AreEqual(expected, result); //<-- fail
	}
}

여기서 AreEqual 의 매개변수는

1번 인자는 결과를 예상한 값이고 2번인자는 실제 결과값을 넣는다.

AddTest를 보면 1번인자에 예상결과인 10 을 넘겨주었고 2번인자에 실제 결과를 넣은걸 볼수있다.

SubTest를 보면 일부러 예상결과를 다르게 넣어보았다.

 

 

2.6 테스트 코드 실행

모든 테스트를 실행시켜보자.

결과를 보면

AddTest , CallLoginProcessTest 은 성공하였지만 SubTest가 실패했다고 알려주고있다.

메시지를 확인해보면

예상은 10이 나올것이라고 보았지만

실제 메소드가 동작한결과를 보니 6 이 나와서 실패하였다고 알려주고있다.

 

 

 

2.7 예제 코드

https://github.com/k4keye/TDD

 

k4keye/TDD

C# and Java TDD. Contribute to k4keye/TDD development by creating an account on GitHub.

github.com

 

'ETC' 카테고리의 다른 글