2013-07-17 2 views
0

Nunit을 사용하고 있습니다. 테스트가 실행되기 전에 모든 테스트에 대한 모든 테스트 테스트 데이터를로드합니다. 왜 이런 일이 발생하는지 알고 싶습니다. 난 내가 아래 사용하고 데이터 소스가 Nunit은 테스트가 실행되기 전에 모든 테스트의 모든 테스트 데이터를로드합니다.

private IEnumerable Example 
{ 
    get { return GetExample; } 
} 
private IEnumerable GetExample() 
{ 
    var doc = XDocument.Load("Example.xml"); 
    return 
     from Examples in doc.Descendants("Example") 
     let Example1 = Examples.Attribute("Example1").Value 
     let Example2 = Examples.Attribute("Example2").Value 
     let Example3 = Examples.Attribute("Example3").Value 

     select new object[] { Example1, Example2, Example3}; 
} 
[TestCaseSource("Example")] 
public void ShouldLogin(string username, string password, bool expected) 
{ 
    // just test that uses the data from above 
} 
<?xml version="1.0" encoding="utf-8" ?> 
<Examples> 
    <Example Example1="fsse" Example2="dj7sihfs" Example3="true" /> 
    <Example Example1="hgtd" Example2="sd122?=s" Example3="true" /> 
    <Example Example1="asde" Example2="!!sf3mff" Example3="true" /> 
    <Example Example1="bsfd" Example2="--sdfj+?" Example3="true" /> 
    <Example Example1="aefb" Example2="!#¤%/(sd" Example3="true" /> 

</Examples> 

두 개의 서로 다른 테스트 같은 테스트 데이터를 호출 할 때 때 그것은 두 번 같은 데이터를로드 XML

있는 코드를 게시 한 data.I를로드하는 다른 효과적인 방법이있는 경우 원하는 미리 도움을 주셔서 감사합니다.

+0

당신은 제공하지 않는 *를 사용할 수 있습니다. GetExample이 NUnit 텍스트 픽스처에 위치하는 곳은 언제/얼마나 자주 실행될 것인가를 정의합니다. 이 코드를 사용하는 전체 텍스트 픽스쳐를 제공하십시오. –

답변

0

디자인으로 생각합니다. NUnit은 테스트 전에 환경을 정리하고 실행 순서에 관계없이 테스트를 위해 동일한 조건을 생성하도록 설계되었습니다.

테스트 A가 XDocument를 변경하면 테스트 B가 해당 변경 사항과 함께 실행됩니다. 그 결과 불확실한 테스트 결과가 나올 수 있습니다.

테스트 B가 테스트 A의 변경 사항을 예상하는 경우 테스트가 완전히 분리되지 않았기 때문에 좋지 않습니다.

해당 동작을 변경하지 않으려면 지연 필드를 구현하고 첫 번째 액세스시에만 테스트 데이터를로드하십시오. 테스트에서 데이터를 변경하지 않는다는 것을 알고 있지만주의를 기울이면 성능을 향상시킬 수 있습니다.

private static Lazy<IEnumerable> testData = new Lazy<IEnumerable>(GetExample); 

private static IEnumerable GetExample() { 
    var doc = XDocument.Load("Example.xml"); 
    return 
     from Examples in doc.Descendants("Example") 
     let Example1 = Examples.Attribute("Example1").Value 
     let Example2 = Examples.Attribute("Example2").Value 
     let Example3 = Examples.Attribute("Example3").Value 

     select new object[] { username, password, expected }; 
} 

또한 TestFixtureSetupAttribute

* 당신의 GetExample 호출하는 방법을
private IEnumerable testData; 

[TestFixtureSetUp] 
public void LoadTestData() { 
    testData = GetExample(); 
} 
+0

테스트가 실행되기 전에 모든 테스트가 처음로드되는 이유를 설명해 주셔서 감사합니다.하지만'System.Reflection.TargetParameterCountException : Parameter count mismatch. '오류가 발생했을 때 게으른로드를 사용할 때 제안했습니다. –

관련 문제