尝试从C#启动QTP时,为什么会出现InteropServices.COMException?

时间:2009-06-16 15:51:05

标签: c# .net com qtp

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

今天早上,我试图在没有开发环境的测试机器上执行程序(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相当新,所以希望有更多经验的人可能以前见过这个。我可能错过了一些简单的东西。

更新:我今天早上发现,重新启动后, Debug版本在测试计算机上运行正常(没有开发环境),但发布版本不。我将尝试重建和重新部署。有人建议使用构建选项来检查Release版本吗?

UPDATE2 :重新启动后,两个版本(Debug和Release)似乎都能正常工作。如果我第二次尝试启动,我会收到错误。我在下面添加了部分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;
}

2 个答案:

答案 0 :(得分:1)

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

有一篇不错的博客文章,Grant Holliday将自动化QT在Team Build下运行。许多相同的原则都适用。

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

如果这不是问题,您需要提供有关如何使用QT应用程序对象的更多详细信息。

答案 1 :(得分:0)

使用以下内容:

Object oQTPapp;

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

Application qtpApp = (Application) oQTPapp;

希望它能解决您的问题。