Visual Studio 2017부터 단위 테스트에 DataRow 특성 지원
아마도 대부분의 단위 테스트가 동일한 메서드에 대한 다양한 입력 값을 넣고 기댓값을 비교하는 것일 듯합니다. (특히나 경곗값 테스트도 그렇고.)
그럴 때, 일일이 "[Test]" 메서드를 작성할 수도 있고 아니면 하나의 테스트 메서드에 몽땅 밀어 넣는 경우도 있을 것입니다. 대개의 경우 권고는 전자의 경우를 따르라고 하지만 그렇게 하면 너무 과다하게 테스트 메서드가 늘어남과 동시에 테스트 자체의 코드에도 중복이 많게 됩니다. 그래서 제 경우에는 후자의 방식을 주로 선호했는데요.
예를 들어, 다음과 같이 GetFirstCharIsUpper라는 메서드를,
using System;
namespace ClassLibrary1
{
public class Class1
{
public string GetFirstCharIsUpper(string text)
{
if (char.IsLower(text[0]) == true)
{
return text[0] + text.Substring(1);
}
return text;
}
}
}
테스트하기 위해 이런 식으로 작성하는 것입니다.
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace ClassLibrary1.Tests
{
[TestClass()]
public class Class1Tests
{
Class1 _cl = new Class1();
[TestMethod()]
public void GetFirstCharIsUpperTest()
{
Assert.IsNull(_cl.GetFirstCharIsUpper(null));
StringAssert.Equals(string.Empty, _cl.GetFirstCharIsUpper(""));
StringAssert.Equals("1", _cl.GetFirstCharIsUpper("1"));
StringAssert.Equals("한글", _cl.GetFirstCharIsUpper("한글"));
StringAssert.Equals(" test", _cl.GetFirstCharIsUpper(" test"));
StringAssert.Equals("Test", _cl.GetFirstCharIsUpper("test"));
}
}
}
그런데, 이렇게 하면 불편한 점이 있는데 특정 입력 값에서 단위 테스트를 실패하는 경우 다음과 같은 식으로,
딱 거기까지만 테스트가 되고 끝나 버린다는 점입니다. 위의 경우 "Assert.IsNull(_cl.GetFirstCharIsUpper(null));" 코드에서 Assert가 발생한 것인데, 사실 두 번째 Assert에서도 문제가 함께 있는데도 그 테스트까지는 진행이 안 된 것입니다. 그래서 저렇게 발생한 오류를 수정하고 다시 한번 단위 테스트를 구동하는 경우 이내 다음번 assert에서 다시 테스트가 실패할 것이고 또 그것을 수정하기를 반복해야 합니다.
바로 이러한 번잡함을 "DataRow" 특성으로 해결할 수 있는데요,
[TestMethod]
[DataRow(null, null)]
[DataRow("", "")]
[DataRow("1", "1")]
[DataRow("한글", "한글")]
[DataRow(" test", " test")]
[DataRow("Test", "test")]
public void GetFirstCharIsUpperTest2(string expected, string arg)
{
StringAssert.Equals(expected, _cl.GetFirstCharIsUpper(arg));
}
오~~~ 깔끔하죠? ^^ 중복 코드도 많이 없어지고, 게다가 테스트 역시 하나의 항목으로 묶여 관리도 편할뿐더러 DataRow 항목에 대해 모두 실행을 하기 때문에,
보는 바와 같이 테스트 실패한 입력 값의 유형을 모두 파악할 수 있어 한 번에 모두 수정하고 다시 단위 테스트를 돌릴 수 있습니다.
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]