2011-08-04 3 views
1

J'essaie de tester mon site sous une charge importante. J'ai trouvé que le titre incorrect apparaît à certaines occasions, ce qui m'indique que j'ai un problème de threading possible. Pour aider à résoudre ce que je configuration AVONS le test suivant:Test de l'unité: réplication de la charge du serveur lourd avec le serveur local

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

Avis Je publie cette demande Web au serveur local. Dans ce cas, ce test passe toujours car le test est séquentiel et par conséquent, une seule requête se produit à la fois. Si je change l'URL pour cibler le serveur live, la requête échoue, ce qui indique qu'un problème existe sous une charge importante. Je me demandais comment je pouvais modifier ce test afin que je puisse reproduire la charge lourde avec mon serveur local. De cette façon, je peux expérimenter avec diverses corrections sans avoir à jouer avec le site en direct. Après avoir lu le fil this. Je parvins viens avec ce qui suit:

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

Cependant quand je courais ce test, il a jeté l'erreur « Le processus de l'agent a été arrêté alors que le test était en cours d'exécution. ». J'apprécierais que quelqu'un puisse me montrer ce que je fais mal ou suggérer une autre solution. Merci

+0

Cay vous utilisez des outils tels que [ab] (http: //httpd.apache. org/docs/2.0/programs/ab.html) ou [JMeter] (http://en.wikipedia.org/wiki/JMeter)? – gagabu

Répondre

0

L'erreur «Le processus d'agent a été arrêté pendant l'exécution du test» peut être provoqué par des exceptions émises par les threads d'arrière-plan.

Je voudrais essayer d'ajouter un try/catch autour du code que le thread d'arrière-plan exécute, et faire en sorte que le bloc catch trace toutes les exceptions afin que vous puissiez vérifier si c'est le cas. Par exemple, lorsque vous créez un nouveau thread que vous pouvez faire quelque chose le long des lignes de ...

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

... mais à ce stade, vous pourriez vouloir promouvoir cette lambda à une méthode privée.

Ce problème peut également être provoqué par les finaliseurs lançant des exceptions, mais comme votre code n'exige qu'une simple requête Web utilisant des types bien connus, je doute que ce soit le cas.

Si vous ne pouvez toujours pas à travailler, vous pouvez jeter un coup d'oeil au bug de connexion suivant: http://connect.microsoft.com/VisualStudio/feedback/details/556702/unit-testing-the-agent-process-was-stopped-while-the-test-was-running

+0

Parfait merci. Une petite manipulation d'exception a fait l'affaire. – nfplee

Questions connexes