2010-05-25 2 views
3

QuestionComment résoudre les problèmes de synchronisation dans les tests d'interface utilisateur automatisés avec C# et Visual Studio?

Quelle est l'approche standard pour résoudre les problèmes de synchronisation dans les tests d'interface utilisateur automatisés?

Exemple concret

J'utilise Visual Studio 2010 et Team Foundation Server 2010 pour créer des tests de l'interface utilisateur automatique et que vous voulez vérifier si ma demande a vraiment cessé de fonctionner:

[TestMethod] 
public void MyTestMethod() 
{ 
    Assert.IsTrue(!IsMyAppRunning(), "App shouldn't be running, but is."); 

    StartMyApp(); 
    Assert.IsTrue(IsMyAppRunning(), "App should have been started and should be running now."); 

    StopMyApp(); 
    //Pause(500); 
    Assert.IsTrue(!IsMyAppRunning(), "App was stopped and shouldn't be running anymore."); 
} 

private bool IsMyAppRunning() 
{ 
    foreach (Process runningProcesse in Process.GetProcesses()) 
    { 
     if (runningProcesse.ProcessName.Equals("Myapp")) 
     { 
      return true; 
     } 
    } 
    return false; 
} 

private void Pause(int pauseTimeInMilliseconds) 
{ 
    System.Threading.Thread.Sleep(pauseTimeInMilliseconds); 
} 

StartMyApp() et StopMyApp() ont été enregistrés avec MS Test Manager 2010 et résident dans UIMap.uitest.

La dernière assertion échoue car l'assertion est exécutée alors que mon application est toujours en cours de fermeture. Si je mets un délai après StopApp() le cas de test passe.

Ce qui précède est juste un exemple pour expliquer mon problème. Quelle est l'approche standard pour résoudre ces problèmes de synchronisation? Une idée serait d'attendre avec l'assertion jusqu'à ce que je reçois une notification d'événement que mon application a été arrêtée.

Répondre

3

Vous pouvez ajouter une synchronisation à StopMyApp. Si vous vous attachez à l'objet Process pour votre application, vous pouvez utiliser Process.WaitForExit() pour attendre la fin du programme.

+0

+1 C'est une solution plutôt sympa. Je ne le savais pas. Travaux. Merci. – Lernkurve

1

Il semble que vous essayez de tester une interface asynchrone. Cela ne fonctionne pas très bien avec les tests automatisés. Vous devriez le décomposer en deux tests. Chaque test devrait gérer un côté de l'interface avec le côté opposé étant raillé.

+0

Pouvez-vous élaborer un peu? Comment cela chercherait-il l'exemple MyTestMethod? Merci. – Lernkurve

+0

Puisque la fonction StopMyApp retourne avant de faire ce qu'elle est supposée faire, vous ne pouvez pas la tester. Vous ne pouvez tester le code qu'à l'intérieur de StopMyApp. Je ne peux pas vous dire comment faire ça parce que je ne sais pas ce qu'il y a dedans. – Dabowheel

+0

À l'intérieur, il s'agit d'un morceau de code généré par le constructeur de test de l'interface utilisateur codée. Il ouvre simplement le menu Fichier et clique sur l'élément de menu Quitter. StopMyApp public void() { #region Déclarations variables WpfMenuItem uIExitMenuItem = this.UIActusWindow1.UIRadMenuMenu.UIFileMenuItem.UIExitMenuItem; #endregion // Cliquez sur 'Fichier' -> 'Exit' item de menu Mouse.Click (uIExitMenuItem, new Point (92, 11)); } – Lernkurve

Questions connexes