제네릭 메서드의 단위 테스트

방법: 단위 테스트 만들기 및 실행에 설명된 것처럼 제네릭 메서드에 대해서도 다른 메서드와 동일한 방식으로 단위 테스트를 생성할 수 있습니다. 다음 단원에서는 제네릭 메서드에 대해 단위 테스트를 만드는 방법에 대한 정보와 예제를 제공합니다.

형식 인수 및 형식 제약 조건

Visual Studio에서는 MyList<T> 같은 제네릭 클래스에 대해 단위 테스트를 생성할 때 제네릭 도우미와 테스트 메서드라는 두 가지 메서드를 생성합니다. MyList<T>에 하나 이상의 형식 제약 조건이 있는 경우 형식 인수는 형식 제약 조건을 모두 만족해야 합니다. 테스트 대상 제네릭 코드가 허용 가능한 모든 입력에 대해 제대로 작동하도록 하기 위해 테스트 메서드에서는 테스트할 모든 제약 조건을 사용하여 제네릭 도우미 메서드를 호출합니다.

예제

다음 예제에서는 제네릭용 단위 테스트를 보여 줍니다.

  • 생성된 테스트 코드 편집. 이 예제에는 생성된 테스트 코드 및 편집된 테스트 코드의 두 단원이 있습니다. 여기서는 제네릭 메서드에서 생성된 원시 테스트 코드를 실제로 사용할 수 있는 테스트 메서드로 편집하는 방법을 보여 줍니다.

  • 형식 제약 조건 사용. 이 예제에서는 형식 제약 조건을 사용하는 제네릭 메서드용 단위 테스트를 보여 줍니다. 이 예제의 경우 형식 제약 조건이 충족되지 않습니다.

예제 1: 생성된 테스트 코드 편집

이 단원의 테스트 코드는 SizeOfLinkedList()라는 테스트 대상 코드 메서드입니다. 이 메서드는 연결된 목록에 있는 노드 수를 지정하는 정수를 반환합니다.

생성된 테스트 코드 단원의 첫 번째 코드 샘플에는 Visual Studio Premium 또는 Visual Studio Ultimate에서 생성되어 편집되지 않은 테스트 코드가 나와 있습니다. 그리고 편집된 테스트 코드 단원의 두 번째 샘플에서는 코드가 int 및 char의 서로 다른 두 데이터 형식에 대해 SizeOfLinkedList 메서드의 기능을 테스트하도록 만드는 방법을 보여 줍니다.

이 코드에는 두 가지 메서드가 있습니다.

  • 테스트 도우미 메서드(SizeOfLinkedListTestHelper<T>()). 기본적으로 테스트 도우미 메서드의 이름에는 "TestHelper"가 붙습니다.

  • 테스트 메서드(SizeOfLinkedListTest()). 모든 테스트 메서드에는 TestMethod 특성이 표시됩니다.

생성된 테스트 코드

다음 테스트 코드는 SizeOfLinkedList() 메서드에서 생성됩니다. 이 테스트는 편집되지 않은 상태의 생성된 테스트이므로 SizeOfLinkedList 메서드를 제대로 테스트하려면 수정해야 합니다.

public void SizeOfLinkedListTestHelper<T>()
{
    T val = default(T); // TODO: Initialize to an appropriate value
    MyLinkedList<T> target = new MyLinkedList<T>(val); // TODO: Initialize to an appropriate value
    int expected = 0; // TODO: Initialize to an appropriate value
    int actual;
    actual = target.SizeOfLinkedList();
    Assert.AreEqual(expected, actual);
    Assert.Inconclusive("Verify the correctness of this test method.");
}

[TestMethod()]
public void SizeOfLinkedListTest()
{
   SizeOfLinkedListTestHelper<GenericParameterHelper>();
}

위의 코드에서 제네릭 형식 매개 변수는 GenericParameterHelper입니다. 다음 예제에서처럼 특정 데이터 형식을 제공하도록 이 매개 변수를 편집할 수도 있지만 이 문 없이도 테스트를 실행할 수 있습니다.

편집된 테스트 코드

다음 코드에서 테스트 메서드 및 테스트 도우미 메서드는 테스트 대상 코드 메서드인 SizeOfLinkedList()를 제대로 테스트할 수 있도록 편집되었습니다.

테스트 도우미 메서드

테스트 도우미 메서드에서는 다음 단계를 수행합니다. 이 단계는 코드에서 1단계에서 5단계로 레이블이 지정된 줄에 해당합니다.

  1. 연결된 제네릭 목록을 만듭니다.

  2. 연결된 목록에 네 개의 노드를 추가합니다. 이러한 노드 내용의 데이터 형식은 알 수 없습니다.

  3. 연결된 목록의 예상 크기를 expected 변수에 할당합니다.

  4. 연결된 목록의 실제 크기를 계산하여 actual 변수에 할당합니다.

  5. actual을 Assert 문의 expected와 비교합니다. 실제 크기가 예상 크기와 다르면 테스트가 실패합니다.

테스트 메서드

테스트 메서드는 SizeOfLinkedListTest 테스트를 실행할 때 호출되는 코드로 컴파일됩니다. 이 메서드에서는 다음 단계를 수행합니다. 이 단계는 코드에서 6단계에서 7단계로 레이블이 지정된 줄에 해당합니다.

  1. 테스트 도우미 메서드를 호출할 때 <int>를 지정하여 테스트가 integer 변수에 대해 작동하는지 확인합니다.

  2. 테스트 도우미 메서드를 호출할 때 <char>를 지정하여 테스트가 char 변수에 대해 작동하는지 확인합니다.

public void SizeOfLinkedListTestHelper<T>()
{
    T val = default(T); 
    MyLinkedList<T> target = new MyLinkedList<T>(val); // step 1
    for (int i = 0; i < 4; i++) // step 2
    {
        MyLinkedList<T> newNode = new MyLinkedList<T>(val);
        target.Append(newNode);
    }
    int expected = 5; // step 3
    int actual;
    actual = target.SizeOfLinkedList(); // step 4
    Assert.AreEqual(expected, actual); // step 5
}

[TestMethod()]
public void SizeOfLinkedListTest() 
{
    SizeOfLinkedListTestHelper<int>();  // step 6
    SizeOfLinkedListTestHelper<char>(); // step 7
}

참고

SizeOfLinkedListTest 테스트가 실행될 때마다 해당 TestHelper 메서드가 두 번 호출됩니다. 테스트가 성공하려면 Assert 문이 항상 true여야 합니다. 테스트가 실패하는 경우 실패의 원인이 <int>를 지정한 호출인지 아니면 <char>을 지정한 호출 중 어느 쪽인지는 알 수 없습니다. 두 항목 중 실패의 원인을 확인하려면 호출 스택을 검사하거나 테스트 메서드에 중단점을 설정한 다음 테스트를 실행하는 동안 디버깅합니다. 자세한 내용은 방법: ASP.NET 솔루션에서 테스트를 실행하는 동안 디버깅을 참조하십시오.

예제 2: 형식 제약 조건 사용

이 예제에서는 만족되지 않는 형식 제약 조건을 사용하는 제네릭 메서드용 단위 테스트를 보여 줍니다. 첫 번째 단원에서는 테스트 대상 코드 프로젝트의 코드를 보여 줍니다. 형식 제약 조건은 강조 표시되어 있습니다.

두 번째 단원에서는 테스트 프로젝트의 코드를 보여 줍니다.

테스트 대상 코드 프로젝트

using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;

namespace ClassLibrary2
{
    public class Employee
    {
        public Employee(string s, int i)
        {
        }
    }

    public class GenericList<T> where T : Employee
    {
        private class Node
        {
            private T data;
            public T Data
            {
                get { return data; }
                set { data = value; }
            }
        }
    }
}

테스트 프로젝트

새로 생성된 모든 단위 테스트와 마찬가지로 이 단위 테스트에도 결과 충분 Assert 문을 추가해야 올바른 결과가 반환됩니다. TestMethod 특성이 표시된 메서드에는 Assert 문을 추가하지 않으며 "TestHelper" 메서드에만 추가합니다. 이 테스트는 이 메서드가 포함되어 있으므로 이름이 DataTestHelper<T>()로 지정됩니다.

이 예제에서 제네릭 형식 매개 변수 T 에는 where T : Employee 제약 조건이 있습니다. 테스트 메서드에서는 이 제약 조건이 충족되지 않습니다. 그러므로 DataTest() 메서드에는 T에 적용된 형식 제약 조건을 제공해야 한다는 경고가 표시되는 Assert 문이 포함되어 있습니다. 이 Assert 문의 메시지는 ("No appropriate type parameter is found to satisfies the type constraint(s) of T. " + "Please call DataTestHelper<T>() with appropriate type parameters.");입니다.

즉, DataTestHelper<T>() 메서드를 DataTest() 테스트 메서드에서 호출할 때는 Employee 형식의 매개 변수 또는 Employee에서 파생된 클래스를 전달해야 합니다.

using ClassLibrary2;

using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace TestProject1

{
    [TestClass()]
    public class GenericList_NodeTest
    {
    
        public void DataTestHelper<T>()
            where T : Employee
        {
            GenericList_Shadow<T>.Node target = new GenericList_Shadow<T>.Node(); // TODO: Initialize to an appropriate value
            T expected = default(T); // TODO: Initialize to an appropriate value
            T actual;
            target.Data = expected;
            actual = target.Data;
            Assert.AreEqual(expected, actual);
            Assert.Inconclusive("Verify the correctness of this test method.");
        }

        [TestMethod()]
        public void DataTest()
        {
            Assert.Inconclusive("No appropriate type parameter is found to satisfies the type constraint(s) of T. " +
            "Please call DataTestHelper<T>() with appropriate type parameters.");
        }
    }
}

참고 항목

개념

단위 테스트 분석

단위 테스트를 사용하여 코드 확인