3

Visual Studio 용 사용자 지정 테스트 유형을 구현했습니다. 사용자 정의 테스트 유형은 dll에서 테스트 요소를 읽습니다. 내 ITip 구현은 매력처럼 작동합니다. 테스트 요소가로드되고 테스트 뷰 도구 창에 표시됩니다.Visual Studio 용 사용자 지정 테스트 유형을 실행할 때 FileNotFound 문제 해결

테스트 요소를 선택하고 실행하면 실행되지 않음 상태가됩니다. 이 문제를 디버깅하는 동안 QTAgent32.exe에서 FileNotFoundException이 발생한다는 것을 알았습니다. 그것은 그것이 테스트 케이스를 정의하는 DLL을 찾을 수 없다는 것을 알려줍니다. 또한, 내 TestAdapter.Initialize 메서드가 호출되기 전에 실패합니다. 내 테스트 DLL을 Visual Studio의 PrivateAssemblies 디렉토리에 복사했습니다. 내가 할 때 내 테스트 요소가 통과합니다. 내 사용자 지정 테스트 어댑터에서 코드를 디버깅 할 수도 있습니다. 그래서이 모든 것의 의미는 QTAgent32.exe가 원래 디렉토리에서 테스트 DLL을 찾을 수 없다는 것입니다.

내 질문에 QTAgent32가 원래 디렉토리에 내 테스트 DLL을 찾으려면 어떻게해야합니까? 완료를 위해 필자는 Tip Load 메서드 코드를 추가합니다 :

public override ICollection Load(string location, ProjectData projectData, IWarningHandler warningHandler) 
{ 
    Trace.WriteLine("Started RegexTestTip Load."); 
    if (string.IsNullOrEmpty(location)) 
    { 
     throw new ArgumentException("File location was not specified!", "location"); 
    } 

    var fileInfo = new FileInfo(location); 
    if (!fileInfo.Exists) 
    { 
     throw new ErrorReadingStorageException(
       string.Format("Could not find a file on the specified location: {0}", location)); 
    } 
    var result = new List<ITestElement>(); 
    var extension = fileInfo.Extension.ToLower(); 
    if (extension != ".dll") 
    { 
     return result; 
    } 

    Assembly testAssembly = Assembly.LoadFrom(location); 
    var testClasses = testAssembly.GetTypes(). 
     Where(t => Attribute.IsDefined(t, typeof(RegexTestClassAttribute))); 

    foreach (Type testClass in testClasses) 
    { 
     PropertyInfo property = testClass.GetProperties(). 
      SingleOrDefault(p => Attribute.IsDefined(p, typeof(TestedRegexAttribute))); 
     if (property == null || !TestedRegexAttribute.Validate(property)) 
     { 
      throw new InvalidDataInStorageException("A Regex test must define a Tested Regex property with type Regex"); 
     } 
     var testCases = testClass.GetProperties(). 
      Where(p => Attribute.IsDefined(p, typeof(RegexTestCaseAttribute))); 

     foreach (PropertyInfo testCase in testCases) 
     { 
      if (!RegexTestCaseAttribute.Validate(testCase)) 
      { 
       throw new InvalidDataInStorageException("A test case property must return a String value."); 
      } 
      var testElement = new RegexTestElement(property, testCase); 
      testElement.Storage = location; 
      testElement.Name = testCase.Name; 
      testElement.Description = "A simple description"; 
      testElement.ProjectData = projectData; 
      result.Add(testElement); 
     } 
    } 
    Trace.WriteLine("Finished RegexTestTip Load."); 
    return result; 
} 
+0

질문을 항상 강조 표시하여 요점을 매우 빨리 이해할 수 있습니다. –

+0

@Venkat - 강조 표시는 무엇입니까? 대담하게 만드시겠습니까? – Ikaso

답변

1

dll을 실행 파일과 동일한 디렉터리에 두어 보았습니까? 그것의 명백함을 용서하십시오, 그러나 때때로 저희를 물리는 진짜로 간단한 것. 하지만 그것은 GAC 권리에있어?

+0

내가 질문에서 말했듯이 나는 그것을했다. Visual Studio의 PrivateAssemblies 디렉토리에 내 DLL을 넣어 문제를 해결했습니다. 그러나 이것은 Visual Studio의 PrivateAssemblies 디렉토리에 각 단위 테스트 dll을 복사하지 않기 때문에 해결책이 아닙니다. – Ikaso

+0

아, 제대로 읽지 못했습니다. 시도해 볼 일이 몇 가지 있습니다 - 에이전트를 중지시키고 시작 했습니까? 잘못되었을 경우이 링크에 따라 완전히 다시 시작해야합니다. http://blogs.msdn.com/b/girishp/archive/2012/03/09/tfs-2010-build-controlling-qtagent32- exe-the-test-agent-process-startup-and-termination-within-build-workflow.aspx 특정 문제는 언급되어 있지 않지만 여기에 관련된 것이 있는지 궁금합니다. "sc \\ mymachine stop vsttagent"및 "sc \\ mymachine start vsttagent" – hoonto

+0

을 사용할 수 있습니다. 필자는 TFS가 아닌 Visual Studio에서 테스트를 실행하고 있기 때문에 이것이 적절하지 않다고 생각합니다. – Ikaso