这个问题是我可以使用除 VBScript 以外的语言以编程方式执行 QTP 测试的问题的后续问题吗?. 我有一个 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:似乎两个版本(调试和发布)在重新启动后都能正常工作。如果我再次尝试启动,我会收到错误消息。我在下面添加了我的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;
}