2017. 4. 27. 15:30

TDD(Test-driven development, 태스트 주도 개발)이 여전히 핫합니다.

비주얼 스튜디오에는 '단위 테스트'라는 프로젝트가 있습니다.

이것을 이용하면 쉽게 TDD를 할 수 있습니다.

 

이 포스팅에서 간단하게 TDD를 해보겠습니다.

 

1. 고객님 가라사대

어느 날 고객님께서 원하는 기능은 이렇다며 엑셀을 하나 보낸다.

 

1) 기능 1

1 넣으면 10

2 넣으면 20

3 넣으면 30

 

2) 기능 2

텍스트를 입력하면 앞에 우리가 지정한 문자열을 먼저 찍어 주세요~

 

분석하기

단위 테스트 만들기 정말 쉬운 요구사항입니다.

 

1) 기능1 : 들어온 값에 곱하기 10

리스트나 배열로 만들어서 고객이 제시한 조건을 넣어 확인

 

2 기능2 : 들어온 문자열과 기존 문자열 합치기

지정한 문자열과 추가 문자열이 결과에 포함되어 있는지 확인

 

2. 단위 테스트 프로젝트 만들기

단위 테스트를 만드는 방법은 두 가지가 있습니다.

직접 만드는 방법과 비주얼 스튜디오에서 자동으로 생성하도록 하는 방법입니다.

 

자동으로 생성한다고 해서 크게 달라지는 건 없고 메소드만 나열해주는 수준입니다.

하지만 이 정도라도 해주는 게 감지덕지죠 ㅎㅎㅎ

 

2-1. 수동으로 만들기

솔루션에서 '단위 테스트 프로젝트'를 'VSUnitTest01.Test'로 생성합니다.

 

 

 

2-2. 자동으로 만들기

'VSUnitTest01'클래스에서 오른쪽 클릭을 한 후 '단위 테스트 만들기'를 선택합니다.

 

 

 

'단위 테스트 만들기' 창에서 원하는 대로 세팅을 하고 확인을 누릅니다.

 

 

 

'테스트 프로젝트'를 '새 테스트 프로젝트'로 하면 새로운 프로젝트가 생성됩니다.

한번 생성하면 그다음부터는 해당 프로젝트를 선택하여 추가하면 됩니다.

 

3. 코드 만들기

수동으로 만들었다면 직접 추가 해야 합니다.

 

테스트 프로젝트에서 생성한 클래스를 다음과 같이 작성합니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
[TestClass]
public class UnitTest1
{
/// <summary>
/// VSUnitTest01 > Value.
/// 기본 테스트
/// </summary>
[TestMethod]
public void TestMethod1_Value()
{
    //arrange
    int nArrange = 11;
    string sArrange = "StringAssert 클래스";
 
    VSUnitTest01NS.VSUnitTest01 taget = new VSUnitTest01NS.VSUnitTest01();
 
    //act
    taget.Value = nArrange;
    taget.ValueText = sArrange;
 
    //assert
    Assert.IsTrue(taget.Value == nArrange, "숫자입력이 되지 않았습니다.");
    StringAssert.Contains(taget.ValueText, sArrange, "문자열 입력이 되지 않았습니다.");
}
 
/// <summary>
/// VSUnitTest01 > Multiply.
/// 곱하기 테스트
/// </summary>
[TestMethod]
public void TestMethod1_Multiply()
{
    //arrange
    int[,] nTemp = new int[55];
    nTemp[00= 1; nTemp[01= 10;
    nTemp[10= 2; nTemp[11= 20;
    nTemp[20= 3; nTemp[21= 30;
 
    VSUnitTest01NS.VSUnitTest01 taget = new VSUnitTest01NS.VSUnitTest01();
 
    for (int i = 0; i < 3++i)
    {
        //act
        int nResult = taget.Multiply(nTemp[i, 0]);
 
        //assert
        Assert.IsTrue(nResult == nTemp[i, 1], "값 처리가 잘못 되었습니다.");
    }
}
 
/// <summary>
/// VSUnitTest01 > Multiply.
/// 곱하기 테스트
/// </summary>
[TestMethod]
public void TestMethod1_AddString()
{
    //arrange
    string sTemp = "StringAssert";
 
    VSUnitTest01NS.VSUnitTest01 taget = new VSUnitTest01NS.VSUnitTest01();
 
    //act
    string nResult = taget.AddString(sTemp);
 
    //assert
    StringAssert.Matches(nResult, new Regex(sTemp), "필요한 문자열이 들어가 있지 않습니다. : " + sTemp);
    StringAssert.Matches(nResult, new Regex(taget.ValueText), "필요한 문자열이 들어가 있지 않습니다. : " + taget.ValueText);
}
cs

 

 

어셜션(Assert) 클래스를 이용하여 단위 테스트 된 내용을 표시할 수 있습니다.

(참고 : Assert 클래스 사용 )

 

단위 테스트가 제대로 만들어졌는지 확인해 보려면 '5.'을 먼저 해봅니다.

지금 단계에서는 모든 단위 테스트가 실패해야 정상입니다.

 

단위 테스트용 코드는 매우 단순하므로 따로 설명하지 않겠습니다.

직접 분석해 보세요.

 

 

4. 샘플 코드 만들기

이 시나리오에서는 클래스 하나 만들고 함수 두 개 만들면 끝입니다.

 

'기능1'은 입력값에 '곱하기 10'을 하면 됩니다.

'기능2'는 입력값과 지정된 값을 합쳐서 리턴하면 됩니다.

 

'클래스 라이브러리' 프로젝트를 생성하고 'VSUnitTest01'클래스를 생성합니다.

아래 코드를 넣어 줍니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class VSUnitTest01
{
    /// <summary>
    /// 기준 값
    /// </summary>
    public int Value { get; set; }
    /// <summary>
    /// 기준 값에 대한 텍스트
    /// </summary>
    public string ValueText { get; set; }
 
    public VSUnitTest01()
    {
        this.Value = 10;
        this.ValueText = "Hello, World";
    }
 
    public int Multiply(int ParamValue)
    {
        return this.Value * ParamValue;
    }
 
    public string AddString(string sParam)
    {
        return this.ValueText + " " + sParam;
    }
}
cs

 

 

5. 테스트 탐색기 사용하기

테스트 > 창 > 테스트 탐색기

를 열면 생성된 단위 테스트를 확인할 수 있습니다.

 

 

 

'VSUnitTest01.Test'프로젝트에 클래스를 추가하고 아래와 같이 코드를 넣습니다.

'테스트 탐색기'에서 '모두 실행'을 눌러 유닛 테스트를 시작합니다.

코드에 문제가 없으므로 모두 통과가 됩니다.

 

 

 

'Value'를 다른 값으로 바꾸고 테스트해봅시다.

 

 

 

마무리

테스트 프로젝트 : VSUnitTest01.zip

 

만약 상업용 비주얼 스튜디오를 사용하고 있다면 코드렌즈(CodeLens)를 사용하여 단위 테스트 결과가 메소드위에 표시할 수 있습니다.

 

 

 

이렇게 말이죠.

전 버그 덕분에 쓰고 있긴 한데 2017에서는 이 버그 수정됐다는 소리가 ㅎㅎㅎ