この質問は、Can I use a language other than VBScript to programmatically execute QTP Tests?のフォローアップです。 QuickTest.Applicationのインスタンスを作成し、QuickTest Professional(バージョン10.0)を起動するC#(.Net 2.0)プログラムがあります。すべての開発テストはうまくいった。C#からQTPを起動しようとするとInteropServices.COMExceptionが発生するのはなぜですか?
今朝、私は開発環境(SharpDevelop 2.2.1)なしでテストマシンからプログラムを実行しようとしました。 Windowsアイコンをダブルクリックしたときにプログラムの実行中にエラーが発生しました。コンソールウィンドウは、それが何であるかを見るには速すぎましたので、私はコマンドプロンプトに落としてそこからプログラムを実行しました。すべてうまくいった。 2回目の試みられたプログラムの起動とそれ以降のすべてのプログラムでは、RPC_E_SERVERFAULT
を投げるCOMオブジェクトによって引き起こされると思われるSystem.Runtime.InteropServices.COMException
を受け取ります。問題の関数は
virtual public QuickTest.Application LaunchQuickTestPro()
{
QuickTest.Application qtpApp = new QuickTest.Application();
qtpApp.Launch();
qtpApp.Visible = false;
return qtpApp;
}
あるとqtpApp.Launch();
行が例外をスローしています。
私は何が間違っているのか完全に迷っています。これは、devのマシン上で正常に動作し、一度テストマシンで正常に動作します。試行の間にリブートするのは良いことではないようです。私はC#、.NET、COMにはかなり新しいので、ここで経験豊富な人がこれを見たことがあるかもしれないと思っていました。私はおそらく単純なものを見逃しているでしょう。
UPDATE:私はデバッグビルドは、試験機(無開発環境)上で正常に動作しますが、リリースビルドがないことを、再起動後に、今朝発見しました。私は再構築と再展開を試みるつもりです。誰でも、リリースビルドを調べるためのビルドオプションの提案がありますか?
UPDATE2:再起動後に両方のリリース(デバッグとリリース)が正しく動作するように見えます。 2回目を試して起動すると、エラーが発生します。 Main()
メソッドの一部と私のExitQTP()
メソッドを以下に追加しました。
私はこの問題の一部が私の誤解であるかどうかは疑問に思っています。ref
を使用する必要があります。しかし、コードはIDE(SharpDevelop 2.2.1)で実行されるたびに機能します。
最初の実行後に何かが適切にクリーンアップされていないように見えますが、わかりません。タスクモニターを見ると、QTP *のプロセスは、私が期待した通りに消えてしまいます。私はあなたのQTアプリ私は問題はあなたが適切に(終了)を閉鎖されていないということである疑いがある
//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;
}
メソッドと対応する呼び出しからrefを取ると、元の質問と同じエラーで失敗する前に、複数回連続して正常に実行されます。 – ssakl
QCに自動接続しますか?そのものは漏れがあるか、または他の不安定さを引き起こすことが知られています。私はちょうどそれを証明する過程にあります:( – TheBlastOne