C#からQTPを起動しようとすると、InteropServices.COMExceptionが発生するのはなぜですか?
質問
この質問は、 VBScript以外の言語を使用してプログラムでQTPテストを実行できますか。 QuickTest.Applicationのインスタンスを作成し、QuickTest Professional(バージョン10.0)を起動するC#(.Net 2.0)プログラムがあります。開発テストはすべてうまくいきました。
今朝、開発環境(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();
行は例外をスローしています。
何が間違っているのかについて、私は完全に迷っています。開発マシンでは正常に動作し、テストマシンでは一度正常に動作しました。試行間で再起動しても効果がないようです。私は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がチームビルドで実行するための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;
問題を解決できることを願っています。