为什么在尝试从C#启动QTP时遇到InteropServices.COMException?

问题描述:

这个问题是Can I use a language other than VBScript to programmatically execute QTP Tests?的后续问题。我有一个C#(.Net 2.0)程序,它创建QuickTest.Application实例并启动QuickTest Professional(版本10.0)。我所有的开发测试都运行良好。为什么在尝试从C#启动QTP时遇到InteropServices.COMException?

今天早上,我试图从没有开发环境的测试机器上执行程序(SharpDevelop 2.2.1)。当我双击Windows图标时,我收到一个尝试执行程序的错误。控制台窗口闪烁得太快以至于看不到它,所以我放下了命令提示符并从那里执行程序。一切正常。在第二次尝试启动程序时,我收到了一个System.Runtime.InteropServices.COMException,这似乎是由COM对象抛出RPC_E_SERVERFAULT引起的。有问题的功能是

virtual public QuickTest.Application LaunchQuickTestPro() 
{ 
    QuickTest.Application qtpApp = new QuickTest.Application(); 
    qtpApp.Launch(); 
    qtpApp.Visible = false; 
    return qtpApp; 
} 

qtpApp.Launch();行引发异常。

我完全丧失了什么可能是错的。它可以在开发机器上正常工作,并在测试机器上正常工作。尝试之间重新启动似乎没有好处。我对C#,.NET和COM相当陌生,所以希望有人在这里更有经验可能会看到这一点。我可能错过了一些简单的东西。

更新:我今天上午发现,在重新启动后,该调试版本工程测试机(无开发环境)的罚款,但发布版本不。我将尝试重建和重新部署。任何人都有建议选项来检查版本构建?

UPDATE2:似乎两个版本(调试和版本)在全新重新启动后都能正常工作。如果我尝试再次启动,我会收到错误消息。我已经添加了部分我的Main()方法和我的ExitQTP()方法。

我想知道是否部分问题是我误解如何使用ref但是,代码在IDE(SharpDevelop 2.2.1)中运行时每次都有效。

确实似乎有些东西在第一次运行后没有被正确清理,但我不知道是什么。看着任务监视器,QTP *进程就像我期望的那样消失。我觉得有可能是导致该问题的第三处理,但一直没能分离出那是什么,

//Program starts here 
    [STAThread] 
    public static void Main(string[] args) 
    {  
     string configFileName = 
      ConfigurationManager.AppSettings.Get("TestPathsConfigFile"); 

     TextReader configFile = new StreamReader(configFileName); 
     QTPLauncher launcher = new QTPLauncher(); 
     string testName = null; 
     try 
     { 
      Debug.WriteLine("Creating QuickTest.Application object..."); 
      QuickTest.Application qtpApp = launcher.LaunchQuickTestPro(); 
      Debug.WriteLine("Successfully created QuickTest.Application object..."); 

      while((testName = configFile.ReadLine()) != null) 
      { 
       if((testName != string.Empty) && 
        (!(testName.TrimStart()).StartsWith(COMMENT_START))) 
       { 
        Debug.WriteLine(testName); 

        launcher.ExecuteQTPTest(testName, ref qtpApp); 

       } 
      } 

      configFile.Close(); 

      ... //code unrelated to problem removed. 

      configFile = null; 
      launcher.ExitQTP(ref qtpApp); 
     } 
     catch(System.Runtime.InteropServices.COMException ce) 
     { 
      Console.Error.WriteLine(ce.StackTrace); 
     } 
    } 

//Exits QTP 
virtual public void ExitQTP(ref QuickTest.Application qtpApp) 
{ 
    qtpApp.Quit(); 
    qtpApp = null; 
} 
+0

如果我将ref从方法和相应的调用中取出,它会连续成功运行多次,然后再次失败,并出现与原始问题相同的错误。 – ssakl 2009-07-08 21:06:15

+0

您是否自动连接到QC?已知这些东西有泄漏,或产生其他不稳定性。我们只是在证明:( – TheBlastOne 2011-05-29 18:47:43

我怀疑的问题是,你没有正确关闭(退出)你的QT应用实例(如果您检查任务管理器,您可能会看到它正在运行),以便后续运行无法正确初始化。

有一个体面的博客文章,Grant Holliday在Team Build下自动运行QT。许多相同的原则适用。

http://ozgrant.com/2008/02/28/running-hp-quicktest-professional-ui-tests-with-team-build/

如果这不是你需要提供有关您与QT应用程序对象做什么更多的细节问题。

使用以下命令:

Object oQTPapp; 

oQTPapp = Server.CreateObject("QuickTest.Application"); 

Application qtpApp = (Application) oQTPapp; 

希望它能够解决您的问题。