XPath のパフォーマンス問題のトラブルシューティング

複雑な Web アプリケーションの場合など、オブジェクトの構造が複雑なアプリケーションをテストする場合、パフォーマンスの問題や、スクリプトの信頼性に関連する問題が発生することがあります。このトピックでは、Silk Test Workbench が記録中に自動的に生成したロケーターとは異なるロケーターを使用して、スクリプトのパフォーマンスを向上させる方法について説明します。

注: 一般に、複雑なロケーターを使用することは推奨しません。複雑なロケーターを使用すると、テストの信頼性を損なう恐れがあります。複雑なロケーターは、テスト アプリケーションの構造をほんの少し変更しただけで機能しなくなってしまう可能性があります。それにもかかわらず、スクリプトのパフォーマンスが要求を満たしていない場合には、より固有のロケーターを使用することによってテストのパフォーマンスを向上できる可能性があります。
例として、MyApplication アプリケーションの要素ツリーを以下に示します。
Root
  Node id=1
    Leaf id=2
    Leaf id=3
    Leaf id=4
    Leaf id=5
  Node id=6
    Node id=7
      Leaf id=8
      Leaf id=9
    Node id=9
      Leaf id=10
以下の最適化手法のいくつかを使用して、スクリプトのパフォーマンスを改善させることができます。
  • 複雑なオブジェクト構造内の要素を特定したい場合は、オブジェクト構造全体ではなく、その特定の部分だけを検索するようにします。たとえば、サンプル ツリーの識別子 7 を持つ要素を検索する場合に Root.Find("//Node[@id='7']") というクエリーを使用している場合、Root.Find("/Node[@id='6']/Node[@id='7']") というクエリーで置き換えます。最初のクエリは、識別子が 1 から 7 の要素に対して要素ツリーが検索されます。2 番目のクエリーでは、識別子 1 のノードと識別子 6 のノードがある最初のレベルのノードにある要素がまず検索された後で、識別子 6 のノードのサブツリー内から識別子 7 の最初のリーフが検索されます。
  • 同じ階層内にある複数の項目を特定したい場合は、まずは階層を特定してから共通のルート ノードを利用して項目を特定します。Root.FindAll("/Node[@id='1']/Leaf") というクエリーを使用している場合、次のようなクエリで置き換えます。
    Public Sub Main()
      Dim commonRootNode = _desktop.Find("//Node[@id='1']")
      commonRootNode.Find("/Leaf[@id='2']")
      commonRootNode.Find("/Leaf[@id='3']")
      commonRootNode.Find("/Leaf[@id='4']")
      commonRootNode.Find("/Leaf[@id='5']")             
    End Sub