0

プロパティとその値をsoapUIから読み取り、Excelに書き込みます。

一意のプロパティ名をExcelに書き込むことができます

def oExcel = new ActiveXObject('Excel.Application')
Thread.sleep(1000)
assert oExcel != null, "Excel object not initalized"

def openWb = oExcel.Workbooks.Open(excelPath) //excelPath complete path to the excel
def dtUsedRange = openWb.Sheets(dataSheetName).UsedRange //dataSheetName is the name of teh sheet which will ultimately hold the data

//add property names to xlMapSheet under col d or col# 4
for(int r = 1;r<=uniqPropName.size().toInteger();r++){ //uniqPropName is a list that holds all the unique property names in a test suite
    openWb.Sheets(xlMapSheet).Cells(r,4).Value = uniqPropName[r-1]
}

oExcel.DisplayAlerts = false
openWb.Save
oExcel.DisplayAlerts = true

openWb.Close(false,null,false)
oExcel.Quit()
Scriptom.releaseApartment()

ただし、すべてのプロパティを同じ Excel に書き込む必要があります。Excel の列名と soapUI プロパティのマップを既に作成しているので、マップから一致する Excel の列名を見つけて、その Excel の下にプロパティ値を書き込むだけです。

私はこのようなことをするために関数を使用しています。この関数は、テスト ケース内のすべてのプロパティをループする for ループ内から呼び出されます。この関数に渡します

sheetName //sheet where data has to be written
sheet //path of the excel file
pName //property name
pValue //property value
xMap //excel col name/heading map
tName //test case name
tsNum //step number

この関数に関連するコードは次のとおりです。

def write2Excel(sheetName,sheet,pName,pValue,xMap,tName,tsNum){

    //find the xl Col Name from the map


    def xl = new ActiveXObject('Excel.Application')
    assert xl != null, "Excel object not initalized"

    //open excel
    def wb = xl.Workbooks.Open(sheet)

    def rng = wb.Sheets(sheetName).UsedRange

    //get row count
    int iColumn = rng.Columns.Count.toInteger()
    int iRow = rng.Rows.Count.toInteger()

    //find column number using the col name

    //find the row with matching testcase name and step#

    //write data to excel
    if(rFound){ //if a row matching test case name and step number is found
          rng.Cells(r,colId).Value = pValue
    }else{
          rng = rng.Resize(r+1,iColumn) //if the testcase and step# row doesn't exist then the current range has to be extended to add one more row of data.
          rng.Cells(r+1,colId).Value = pValue
    }

    //save and close
    xl.DisplayAlerts = false
    wb.Save
    xl.DisplayAlerts = true

    wb.Close(false,null,false)
    xl.Quit()
    Scriptom.releaseApartment()
}

コードは現在実行中です。昨日の夕方 (東部標準時の午後 2 時) から実行されているため、コードが機能しても最適ではありません。データを書き込むのにこれほど長く待つことはできません。

興味深いのは、Excel のサイズが大きくなり続けていることです。これは、データが Excel に書き込まれていることを意味しますが、Excel を確認したところ、新しいデータはありません..何もありません..zilch!!

ファイルのサイズが増加している証拠。

20/02/2014  04:23 PM           466,432 my_excel_file.xls
20/02/2014  04:23 PM           466,944 my_excel_file.xls
20/02/2014  04:38 PM           470,016 my_excel_file.xls
20/02/2014  04:45 PM           471,552 my_excel_file.xls
20/02/2014  04:47 PM           472,064 my_excel_file.xls
20/02/2014  05:01 PM           474,112 my_excel_file.xls
20/02/2014  05:01 PM           474,112 my_excel_file.xls
21/02/2014  07:23 AM           607,232 my_excel_file.xls
21/02/2014  07:32 AM           608,768 my_excel_file.xls
21/02/2014  07:50 AM           611,328 my_excel_file.xls

私の質問は次のとおり
です。1. for ループ内から関数を呼び出しているときにデータが書き込まれないのに、線形的に呼び出すと書き込まれるのはなぜですか?
2. コードの最初の部分では、書き込みが完了すると Excel プロセスが消えますが、関数が実行されると、メモリ使用率が上下しても Excel プロセスは残ります。

Excelプロセスを強制終了し、ループする代わりに、関数を使用して1つまたは2つのデータセットのみを書き込み、それに応じてこの質問を更新します.

4

1 に答える 1

0

Excel を開くプロセス、セルに書き込むプロセス、Excel を保存するプロセス、Excel を閉じるプロセスは時間のかかる作業であり、これに 300 のテスト ケースとテストごとに最大 15 のプロパティを掛け合わせると、かなりの時間がかかる可能性があります。それが私の場合に起こっていることであり、したがって、プロセスが完了するまでに永遠に時間がかかりました.

Excelのサイズが増加し、何も書き込まれなかった理由については100%ではありませんが、データがメモリに保持されており、最後のセルが書き込まれ、ワークブックが保存され、Excelが閉じられると書き込まれたと思います。私はそれを完了させず、非常に長い間実行されていることに気付いたときにそれを殺したので、これは決して起こりませんでした.

これを機能させるために、アプローチを次のように変更しました。

  1. col 名と prop 名のマップを生成する
  2. テスト ケースごとに prop 名と prop 値のマップを生成します。1 つのテスト ケースに複数のプロパティ テスト ステップを含めることができるため、次のようなマルチ マップを作成します...
    [Step#:[propname:propvalue,....propname:propvalue]]
  3. col 名と col id で別のマップを作成します。
  4. col id と prop 値で新しいマップを作成します。上記で作成したマップを使用してこれを作成しました。
  5. エクセルにデータを書き込みます。私はすでにcol idとそれに入る値を持っているからです。私はチェックをせず、データをExcelに書き込むだけです。

これらの手順は、テスト スイート内のすべてのテスト ケースに対して繰り返されます。このプロセスを使用して、数分でタスクを完了することができました。

かなりの数のマップを使用していることは知っていますが、これが私が思いつくアプローチです。誰かがより良いアプローチを持っているなら、私もそれを試してみたい.

于 2014-02-25T15:39:44.397 に答える