2011-08-04 2 views
1

과부하로 사이트를 테스트하려고합니다. 나는 틀린 제목이 나에게 가능한 실을 꿰는 문제점이다는 것을 나타내는 어떤 경우에 나타난 ㄴ다는 것을 것을을 발견했다. 이 문제를 해결하기 위해 다음 테스트를 설정했습니다.유닛 테스트 : 로컬 서버로 무거운 서버로드 복제

[TestMethod] 
public void Test1() { 
    var isValid = true; 

    for (var i = 0; i < 100; i++) { 
     // Send the request (note Http.WebRequest is a utility method which returns the contents of the page) 
     var request = Http.WebRequest("http://localhost/SomePage"); 

     var document = new HtmlDocument(); // Html Agility Pack 
     document.LoadHtml(request.Data); 

     // Get the required info 
     var title = document.DocumentNode.SelectSingleNode("//title").InnerText.Trim(); 

     // Test if the info is valid 
     if (title != "Some Page") { 
      isValid = false; 
      break; 
     } 

     Thread.Sleep(100); 
    } 

    Assert.IsTrue(isValid); 
} 

알림이 웹 요청은 로컬 서버에 발행됩니다. 이 경우 테스트는 순차적이므로이 테스트는 항상 통과하므로 한 번에 하나의 요청 만 발생합니다. 라이브 서버를 대상으로 URL을 변경하면로드가 과중한 문제가 있음을 나타내는 요청이 실패합니다.

내 로컬 서버로 부하를 복제 할 수 있도록이 테스트를 어떻게 수정할 수 있는지 궁금합니다. 이렇게하면 라이브 사이트를 망칠 필요없이 다양한 문제를 해결할 수 있습니다. 독서 후 this 실. 나는 다음에 와서 관리되는 :

[TestMethod] 
public void Test1() { 
    var isValid = true; 
    var threads = new Thread[100]; 

    for (var i = 0; i < threads.Count(); i++) { 
     threads[i] = new Thread(() => { 
      for (var j = 0; j < 10; j++) { 
       // Send the request 
       var request = Http.WebRequest("http://localhost/SomePage"); 

       var document = new HtmlDocument(); 
       document.LoadHtml(request.Data); 

       // Get the required info 
       var title = document.DocumentNode.SelectSingleNode("//title").InnerText.Trim(); 

       // Test if the info is valid 
       if (title != "Some Page") { 
        isValid = false; 
        break; 
       } 
      } 
     }); 
    } 

    foreach (var thread in threads) { 
     thread.Start(); 
    } 

    foreach (var thread in threads) { 
     thread.Join(); 
    } 

    Assert.IsTrue(isValid); 
} 

을 그러나 나는 그것이 오류가 발생했습니다이 테스트를 실행했을 때 "테스트가 실행되는 동안 에이전트 프로세스는 중단되었다.". 누군가 내가 잘못하고있는 것을 보여 주거나 다른 해결책을 제안 할 수 있다면 고맙겠습니다. 감사합니다

+0

케이 당신은 [AB] (HTTP와 같은 도구를 사용합니다. org/docs/2.0/programs/ab.html) 또는 [JMeter] (http://en.wikipedia.org/wiki/JMeter)? – gagabu

답변

0

"테스트가 실행되는 동안 에이전트 프로세스가 중지되었습니다."라는 오류는 백그라운드 스레드에 의해 발생한 예외 때문에 발생할 수 있습니다.

백그라운드 스레드가 실행되는 코드 주위에 try/catch를 추가하고 catch 블록이 예외를 추적하도록하면이 경우인지 확인할 수 있습니다. 새 스레드를 만들 때이 시점에서 당신은 개인 방법이 람다을 촉진 할 수도 있지만 예를 들어, 당신은 ... ...

threads[i] = new Thread(() => { 
    try { 
     for (var j = 0; j < 10; j++) { 
      // Send the request 
      var request = Http.WebRequest("http://localhost/SomePage"); 
      var document = new HtmlDocument(); 
      document.LoadHtml(request.Data); 

      // Get the required info 
      var title = document.DocumentNode.SelectSingleNode("//title").InnerText.Trim(); 

      // Test if the info is valid 
      if (title != "Some Page") { 
       isValid = false; 
       break; 
      } 
     } 
    } 
    catch (Exception ex) { 
     Trace.WriteLine(ex); 
    } 
}); 

을의 라인을 따라 뭔가를 할 수 있습니다.

이 문제는 파이널 라이저가 예외를 throw하여 발생할 수도 있지만, 코드가 잘 알려진 유형을 사용하여 웹 요청을 단순히 실행하므로이 경우가 의심 스럽습니다. 당신은 여전히 ​​작동시킬 수없는 경우

, 당신은 다음과 같은 연결 버그에서 살펴 봐야 할 수 있습니다 : //httpd.apache : http://connect.microsoft.com/VisualStudio/feedback/details/556702/unit-testing-the-agent-process-was-stopped-while-the-test-was-running

+0

완벽한 감사합니다. 약간의 예외 처리가 트릭을 만들었습니다. – nfplee