2

過去数か月にわたって開発してきた、非常に優れた柔軟な自動化アーキテクチャがあります。私の質問のステージングの一環として、システムがどのように設計されているかを概説しましょう。

そのため、一連の子スクリプトを呼び出して、Web サイトの各ページ/タブを実行するこれらのマスター ドライバー スクリプトがあります。各ページには独自の子スクリプト/アクションがあり、交換可能で、簡単にオンまたはオフにすることができます。これらの子スクリプト/アクションのそれぞれには、Excel ワークブックでそれを駆動する独自のデータ シートがあります。マスター ドライバー スクリプトでさえ、これらの子スクリプト/アクションを呼び出すときの動作を制御する独自のシートを持っています。

子スクリプトのすべてのシートとマスター ドライバーのシートは同じブックにあり、Excel ファイルにあり、Lambert.xls と呼びます。このファイルには、スクリプトを駆動するさまざまなデータ セットを含む複数のコピーがあります。

したがって、現在、ユーザーは Lambert.xls を削除し、他のファイルの 1 つをコピーして、コピーの名前を Lambert.xls に変更する必要があります。しかし、このアクティビティは、誤って間違ったファイルを削除したり、名前を変更する際にスペルを間違えたり、名前を変更する前に元のファイルをコピーするのを忘れたりするなど、ユーザー エラーが発生しやすくなります。

ファイルリストの例:

Lambert.xls
Lambert_Maximum.xls
Lambert_Minimum.xls
Lambert_Professional.xls
Lambert_Amateur.xls

複数のテスターが異なるマスター ドライバー スクリプトを同時に実行する必要がある場合があり、これらのマスター ドライバー スクリプトは多くの場合、同じスクリプトを同時に実行します。それらがすべて同じ Lambert.xls を参照している場合、それは問題になります。そこで、すべてのマスター ドライバー スクリプト名のすべての名前と、サーバー上の異なるパスに存在する Lambert.xls の対応するすべてのコピーへのパスをリストする Configuration.xls ファイルを作成することで、これを回避する方法を見つけました。

例:

MasterDriver1 \\LambertServer\Development\TestData\Test1\Lambert.xls
MasterDriver2 \\LambertServer\Development\TestData\Test2\Lambert.xls
etc...

ここで、MasterDriver1 は、LoadAndRunAction を呼び出してパスを渡すことにより、別のテスト スクリプト内の別のアクションを呼び出します。ただし、これを行う前に、マスター ドライバー スクリプトは次のことを行います。

Set oExcel = CreateObject("Excel.Application")
oExcel.DisplayAlerts = False

'...Code opens the Configuration.xls, passes the name of the current Master Driver, e.g. "MasterDriver1" and gets the path to the Lambert.xls that it should use.
'...Code closes the Configuration.xls file and sets the object pointer to nothing.

Set oMasterDriverWorkbook = oExcel.Workbooks.Open(strMasterWorkbookfileAndPath)
Set oMasterDriverSheet = oMasterDriverWorkbook.Worksheets(strMasterDriverSheetName)

If CInt(Environment("TestIteration")) = 1 And CInt(Environment("ActionIteration)) = 1 Then
     Call initGlobalDictionary()
     GlobalDictionary.Add "LambertAutomationDataObject", oMasterDriverWorkbook
End If

'...Code gets the master row count from the Master-driver sheet on the current version of Lambert.xls, and sets this up for the iteration loop.

For intCurrentRow = 2 To intMasterRowCount Step1
     GlobalDictionary.Add "CurrentRowNumber", intCurrentRow
     LoadAndRunAction "\\LambertServer\Development\Scripts\LambertChild1\", "LambertChild1", oneIteration
     LoadAndRunAction "\\LambertServer\Development\Scripts\LambertChild2\", "LambertChild2", oneIteration
     LoadAndRunAction "\\LambertServer\Development\Scripts\LambertChild3\", "LambertChild3", oneIteration
     GlobalDictionar.Remove "CurrentRowNumber"
Next 'intCurrentRow

「LambertChild2」の実行はその前に「LambertChild1」の実行に依存し、「LambertChild3」は前提条件として「LambertChild1」と「LambertChild2」の実行を必要とするため、上記が必要でした。コピーして貼り付けるとかなり複雑になるため、コードを少し単純化し、名前を変更しようとしています。そのため、子スクリプトと依存関係がさらに多くあることを理解してください。ただし、私の質問の目的にはこれで十分です。

次に、子スクリプトの例を示します。

Set oDataWorkbook = GlobalDictionary("LambertAutomationDataObject")
Set oDataSheet = oDataWorkbook.Worksheets(strDataSheet)

...Get a bunch of data from the sheet, which will be passed into the call to Lambert1Tab

intCurrentRow = GlobalDictionary("CurrentRowNumber")

Call Lambert1Tab(...)
Call WriteReporterEvent(...)

Set oDataSheet = Nothing
Set oDataWorkbook = Nothing

各シートからすべてのデータを取得するすべてのコードを保持することにしました。これはモジュール構造を維持し、マスター ドライバー スクリプトが不要なコードで過度に汚染されないようにするためです。マスター ドライバー スクリプト。

したがって、すべてのスクリプト、マスター ドライバー スクリプト、および子スクリプトはどちらも、Lambert.xls ファイルを Excel オブジェクトとしてロードできるかどうかに依存します。

Set oExcel = CreateObject("Excel.Application")

これらのスクリプトをすべて ALM に移動すると、関数ライブラリへの参照を ALM パスに変換したり、オブジェクト リポジトリへの参照を ALM パスに変換したりする際に問題がなくなりました。しかし、問題が発生し始めるのは、Lambert.xls パスを ALM パスに変換しようとしたときです。

Lambert.xls パスをそのままにしておくと、上記のように次のようになります。

\\LambertServer\Development\TestData\Test1\Lambert.xls

その後、すべてがうまく機能します。ただし、ALM にアップロードしたパスに変更すると、次のようになります。

[ALM] Resources\Lambert\TestData\Test1\Lambert.xls

ファイルが見つからないというエラーがスローされます。Lambert.xls ファイルをデータ テーブルとしてアップロードすると、UFT はそれが Excel.xls ファイルではなくデータ テーブルとして動作することを期待するため、オブジェクトにアクセスして子スクリプト間でオブジェクトを渡すことができません。さらに、子スクリプトごとにこのデータ テーブルを配置すると、LambertChild1 スクリプトがすべての反復を実行し、LambertChild2 がすべての反復を実行します...しかし、これは LambertChild2 の反復 1 として必要な動作ではないことを思い出してください。前提条件として LambertChild1 iteration1 を実行することに依存します。したがって、LambertChild1 が反復 1 ~ 30 を実行した場合、LambertChild2 が実行され、LambertChild1 の反復 1 に依存していましたが、最後に実行されたのは LambertChild1 の反復 30 であり、まったく役に立ちません。

Lambert.xls ファイルをテスト リソースとしてアップロードすると、もちろん、ファイルが見つからないというエラーがスローされる上記の状況が発生します。

実際のエラー メッセージは次のとおりです。

'[ALM] Resources\Lambert\TestData\Test1\Lambert.xls' could not be found. Check the spelling of the file name, and verify that the file location is correct.

私の質問は、Excel ファイルを ALM パスからオブジェクトとして読み取るための ALM/UFT 問題のこの封鎖を回避する方法を知っている人はいますか? そして、リソースの名前はファイルの名前と一致する必要があると思ったので、それも試しましたが、役に立ちませんでした。

おそらく、DataTable ALM リソースから Excel ファイルをロードする方法はありますか? もしそうなら、これを行うためのコードはどのようになり、どのように機能させますか? 詳細をお願いします。私が問題を説明してきたのと同じくらい正確に答えてください。よくわからない用語やプロセスに関するあいまいな回答は理解できない場合があります。

システムとバージョン情報: Windows7; IE8 (ビジネス要件); UFT 12.0 ビルド 0511; ALM OTA クライアント 11.52.444.0; ALM UI 11.52.444.0; ALM WebGateClient 11.52.444.0; ALM テスト実行スケジューラ 11.52.444.00; ALM スプリンター 11.50.444; ALM 分析拡張機能 11.50.444; ALM QC v11.50.444; 機能およびパフォーマンス テスト用の ALM ラボ拡張機能 11.50.1178

長くなって申し訳ありませんが、問題を過度に複雑にしたとしても、あいまいで多くの質問に答えなければならないのではなく、質問を明確にしたかったのです。

この小説を読んでくれた人に、前もって感謝します! この問題で数週間立ち往生しているため、私が得ることができるあらゆる助けに感謝します. 私はこれを調査してきましたが、この特定の問題について率直な答えを得るために質問の混乱を切り抜けるのは困難です.

4

3 に答える 3

2

いい解決策。ここで重要なのは、QTP/UFT ではなく Excel を使用してスプレッドシートをロードしていることです。Excel は、ALM とそのファイル システムについて何も知りません。ファイルをローカルに (おそらく一時フォルダーに) ダウンロードし、ローカル ファイル パスを Excel に渡してファイルを読み込む必要があります。

QTP/UFT 内から、「QCConnection」オブジェクトを使用して、テストの実行中に ALM へのアクティブな接続と対話できます。Resources モジュールからファイルをダウンロードする方法については、OTA API ドキュメントを参照してください。

于 2014-07-24T12:12:33.417 に答える
1

以下のように、ALM からテーブルを直接インポートできます。

テスト 1 が ResourceName であり、Lambert がシート名 (Excel ファイル名ではない) であることを考慮します。

Dim Filename : Filename = "[ALM] Resources\Lambert\TestData\Test1"
Dim SheetSource : SheetSource = "Lambert"
Dim SheetDest : SheetDest = "Global"

Datatable.ImportSheet Filename, SheetSource, SheetDest
于 2015-06-10T19:26:48.773 に答える
1

受け入れられた答えには何も問題はありませんが、ドキュメントに記載されているように、このPathFinder.Locateメソッドを使用して相対パスを絶対パスに解決するだけでなく、ALM パスをローカル パスに解決することもできることを強調します。

常にローカル パス (ローカルの TEMP ディレクトリへ) を返すため、これを使用して、ファイル システム、またはさらに重要なこととして ALM システムに保存されているものの作業コピーをダウンロードできます。ここでのダウンロードプロセスは、一種の副作用です。

これには、リソース、添付ファイル、テスト、コンポーネントなど、すべてが含まれます。非常に便利。alm の「タブ」には適切な接頭辞を使用して対処し、添付ファイルには別のファイルのように対処して対処します (「[QualityCenter] Subject\Folder\Test\MyAttachment.docx」のように)。

では、1 行で十分な場合に、何百もの行を使用して ALM API に直接アプローチする必要はありません。;)

于 2016-01-11T06:45:04.393 に答える