为什么在尝试从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;
}
我怀疑的问题是,你没有正确关闭(退出)你的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;
希望它能够解决您的问题。
如果我将ref从方法和相应的调用中取出,它会连续成功运行多次,然后再次失败,并出现与原始问题相同的错误。 – ssakl 2009-07-08 21:06:15
您是否自动连接到QC?已知这些东西有泄漏,或产生其他不稳定性。我们只是在证明:( – TheBlastOne 2011-05-29 18:47:43