2011-08-04 18 views
1

負荷のかかる状態でサイトをテストしようとしています。私は、間違ったタイトルがいくつかの機会に現れていることを知っています。これは、スレッド問題が発生している可能性があることを示しています。私は、ローカルサーバーにこのWeb要求を発行しています単体テスト:重いサーバー負荷をローカルサーバーに複製する

[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); 
} 

注意:これを解決するために、私は、セットアップ、次のテストをしました。この場合、テストは順次実行されるため、このテストは常に成功するため、一度に1つのリクエストしか発生しません。ライブサーバーをターゲットにする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); 
    } 
}); 

の線に沿って何かを行うことができ、新しいスレッドを作成します。

この問題は、ファイナライザが例外をスローすることによっても発生する可能性がありますが、コードではよく知られているタイプを使用してWebリクエストが実行されるため、そうは思われません。あなたはまだそれが仕事を得ることができない場合

は、次の接続のバグを見てみたいことがあります。//httpd.apache:http://connect.microsoft.com/VisualStudio/feedback/details/556702/unit-testing-the-agent-process-was-stopped-while-the-test-was-running

+0

完全に感謝します。少しの例外処理がこのトリックでした。 – nfplee

関連する問題