2009-06-16 12 views
1

この質問は、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; 
} 
+0

メソッドと対応する呼び出しからrefを取ると、元の質問と同じエラーで失敗する前に、複数回連続して正常に実行されます。 – ssakl

+0

QCに自動接続しますか?そのものは漏れがあるか、または他の不安定さを引き起こすことが知られています。私はちょうどそれを証明する過程にあります:( – TheBlastOne

答えて

1

、問題の原因となっている第三の方法があるかもしれないと思うが、それが何であるかを分離することができていませんインスタンス(あなたのタスクマネージャをチェックすると実行中であることがわかります)ので、その後の実行が正しく初期化されません。

Grant HollidayがQTをチームビルドで実行するように自動化する、まともなブログ投稿があります。同じ原則の多くが適用されます。

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

それはあなたがQTアプリケーションオブジェクトで何をすべきかについての詳細を提供する必要があります問題ではない場合。

+0

私は最初はそう思っていたので、完全にリブートを試みたのですが、再起動後に最初に例外をスローしています。 /プロセスがメモリにありました – ssakl

+0

私はこれを答えとして受け入れていますが、これは間違いなく正しく終了しないものがあるためですが、QTP自体ではないようです。 – ssakl

0

は、次を使用します。

Object oQTPapp; 

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

Application qtpApp = (Application) oQTPapp; 

うまくいけば、それはあなたの問題を解決します。

関連する問題