2012-05-17 4 views
7

일부 코드를 테스트하는 데 도움이되는 NUnit 이론을 만들었습니다. 테스트되는 실제 코드는이 질문에 대해 내가 테스트하는 데 사용하는 데이터만큼 중요하지 않습니다. 즉, 24 시간제 시간 및 분.NUnit 이론을 설계하는 방법은 무엇입니까?

필자는이 기능을 이용하여 기능을 활용하고 NUnit 2.6 이론 기능의 제한 사항을 준수하기 위해 필자의 조명기를 작성했습니다. 특히 Datapoints가 정확한 유형의 인수와 일치한다는 특징을 해결하기 위해 Hour 및 Minute와 같은 클래스를 만들어야한다고 느꼈습니다. 내가 찾은 무엇

[TestFixture] 
public class TimeWindowParserTheoryFixture 
{ 
    public class Hour 
    { 
     public int Value; 
    } 

    public class Minute 
    { 
     public int Value; 
     public string AsString { get { return Value.ToString("00"); } } 
    } 

    [Datapoints] 
    public IEnumerable<Hour> Hours 
    { 
     get 
     { 
      return Enumerable 
       .Range(0, 25) 
       .Select(v => new Hour() { Value = v }) 
       .Union(Enumerable.Repeat((Hour)null, 1)); 
     } 
    } 

    [Datapoints] 
    public IEnumerable<Minute> Minutes 
    { 
     get 
     { 
      return Enumerable 
       .Range(0, 60) 
       .Select(v => new Minute() { Value = v }) 
       .Union(Enumerable.Repeat((Minute)null, 1)); 
     } 
    } 

    [Datapoints] 
    public IEnumerable<string> Separators 
    { 
     get { return new[] { " ", "-" }; } 
    } 

    [Theory] 
    public void ValidHours(Hour startHour, 
     Minute startMinute, 
     Hour endHour, 
     Minute endMinute, 
     string separator) 
    { 
     Assume.That(startHour != null); 
     Assume.That(endHour != null); 

     var parser = new TimeWindowParser(); 
     var startMinutesString = String.Format("{0}{1}", startMinute == null ? "" : ":", startMinute == null ? "" : startMinute.AsString); 
     var endMinutesString = String.Format("{0}{1}", endMinute == null ? "" : ":", endMinute == null ? "" : endMinute.AsString); 
     var pattern = String.Format("{0}{1}{2}{3}{4}{5}{6}", startHour, startMinutesString, "", separator, endHour, endMinutesString, ""); 
     //Console.WriteLine(pattern); 
     var result = parser.Parse(pattern); 
     Assert.That(result, Is.Not.Null); 
     Assert.That(result.Start, Is.EqualTo(startHour)); 
     Assert.That(result.End, Is.EqualTo(endHour)); 
    } 
} 

은 그 I 메모리가 부족할 정도로 큰 세트 NUnit과 결과의 기본 조합 논리 동안 생성 된 데이터 세트의 크기입니다. 그것은 내가 테스트를 설정하고 데이터가 문제가되어야하는 것처럼 보이지 않지만 분명히 그렇기 때문에 나는이 문제에 대해 어떻게 다르게 생각하는지에 대한 조언을 구하고 있습니다. 내가 얻은 OutOfMemoryException 스택 추적이있다.

System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown. 
at System.Text.StringBuilder.ExpandByABlock(Int32 minBlockCharCount) 
at System.Text.StringBuilder.Append(Char* value, Int32 valueCount) 
at System.Text.StringBuilder.AppendHelper(String value) 
at System.Text.StringBuilder.Append(String value) 
at NUnit.Core.MethodHelper.GetDisplayName(MethodInfo method, Object[] arglist) 
at NUnit.Core.Builders.NUnitTestCaseBuilder.BuildSingleTestMethod(MethodInfo method, Test parentSuite, ParameterSet parms) 

이 예외는 단순히 시험 방법의 이름을 (하는 getDisplayName 참조)를 얻으려고 노력에 의해 생성 될 나타납니다 자체 홀수입니다. 이것이 (알려진 또는 그렇지 않은) 버그인지 확실하지 않습니다. BTW, Parameterized 테스트에 사용 된 덜 실험적인 범위 및 값 특성을 사용하여이 조명기를 다시 작성하면 매우 유사한 OOM 예외가 발생합니다.

답변

10

귀하의 질문은 이론을 사용하는 방법에 관한 것이지만, 먼저 "이론 이론"에 대해 이야기하고 싶습니다. 그런 다음 구현 세부 사항으로 돌아가겠습니다. 당신이 밖으로 시작하는 이론이있는 경우에만 이론을 사용한다 이론들

이론. 그렇지 않으면 Datapoints를 사용하여 전통적인 예제 중심 테스트를 수행하는 것입니다. "이론을 가짐으로써"나는 진리에 대한 일반적인 진술을하고 있음을 의미한다. Generaly the Theory (코드)는 가능한 입력을 거치고 가정을 충족시키지 못하는 것을 필터링합니다. 좋은 이론의 예는 다음과 같습니다. 양의 실수의 경우 제곱근에 곱해서 같은 숫자가됩니다. "

테스트를 보면 이론이 증명하고자하는 이론을 이해할 수 없습니다. 이것은 데이터 포인트를 사용하는 것을 제외하고는 표준 매개 변수화 된 테스트와 같을뿐입니다. 당신이해야 할 유일한 가정은 minuts가 널이 아니라는 것입니다. 처음에는 분을 제공 했으므로 이상합니다

결론은 :. 나는이 이론의 좋은 사용하는 것입니다 생각

역학하지 않는

24 * 24 * 60 * 60 * 2 데이터 포인트를 생성하고 있습니다. 그것은 많은 양의 데이터입니다. 구문 분석 알고리즘이 24:13에 대해 작동하지만 24:14에 실패 할 것이라고 생각하는 이유가 있습니까?

Datapoints를 조합하여 사용하는 것이 사실이며 쌍으로 사용하면 더 나을 수도 있습니다. 그러나 DataPoint는 이론에서 데이터를 전달하는 여러 가지 방법 중 하나 일뿐입니다. 이론은 이론이 당신이 그들에게주는 모든 데이터를 다루어야한다는 것입니다.

대안

제가 적용됩니다 일반적으로 파서 또는 파서에 대한 이론을 생각할 수 없기 때문에 내가 테스트로이 작성합니다. 나는 단지 유효한 문자열을 생성하는 메서드를 가리키는 TestCaseSourceAttribute를 사용하거나 단순히 문자열의 큰 배열에 테스트 유효한 데이터를 제공 할 것입니다.다양한 종류의 잘못된 데이터를 처리하는 또 다른 테스트가 필요합니다.

찰리

관련 문제