0

スモークテストプログラム用に書かれた DSL があります。プログラムの実行の最後に、別のプログラムがこれを取得して PDF レポートを生成します。(DSL は、主に異なる形式を切り替えるために選択されます)

タイトル ページの後に、テスト スイートの結果の概要が表示されます。そこで、プレースホルダーを置きました。

add table:summary header="Summary" columns: 2

そして、各テスト ケースの最後に、次のようにこのテーブルに行を挿入します。

add row table:summary values: "Entitlements Test, PASS"

テーブル宣言と行が散らばっているので、行ごとにすぐにアクションを実行する DSL パーサーによって実行する前に、それらをすべてグループ化したいと思います。

テーブルで行をグループ化し、プログラムによって書き込まれた順序で行をグループ化するより良い方法はありますか (時間)。

私は数日以上頭を悩ませてきましたが、これらの不十分なアイデアよりも良い方法を見つけることができませんでした:

(レポートにさらに多くのテーブルを導入したい場合、私のソリューションはすべてひどいものです)

  1. ファイルを文字列のリストとしてメモリにロードします。最初のテーブル インデックスのポインターを保持し、さらに (リスト全体を介して) ループし、テーブル宣言の次のインデックスに行を挿入して、リストの残りを押し下げます - 各行に対して 0(n) :-( リスト全体の後トラバースされたら、次のテーブル ポインタを検索し、プロセスを繰り返します. リストが別のテーブルにヒットせずに最後に到達した場合, 完了です. ここでのリストよりもバランスの取れたツリーの方が良いオプションだと思います.

  2. 「add table」の前に「t1」、行を「t1r1」、「t1r2」のようにプレフィックスを付け、パーサーで実行する前に DSL を前処理します。

  3. 「add table」と「add row」で始まるすべての行を選択し、番号付きリストに格納します。テーブルごとに、テーブルの関連する行をフィルター処理し、固定順序の比較を行います。https://discursive.atlassian.net/wiki/display/CJCOOK/Fixed+Order+Comparison (これが内部で何をするのかはまだわかりません)。

ファイル全体が最大で数千行を超えることはなく、レポート プロセスはそれ自体が専用のプロセスです。したがって、スペースは制約であってはなりません。

DSL 全体は次のようになります。

add header: "Smoke Testing Report for ..... (app name)"
add subheader: "on .... (date)"
add table:summary header="Summary" columns: 2
add title : "Login page"
add screenshot : "C:/projects/SmokingCPOII/geb-reports/Into_Login_page.png"
newpage
...
...
add title : "Entitlements Before Submit"
add screenshot : "C:/projects/SmokingCPOII/geb-reports/Entitlements Before Submit.png"
newpage
add title : "End"
add screenshot : "C:/projects/SmokingCPOII/geb-reports/end.png"
newpage
...
...
add row table:summary values: "Entitlements Test, Pass" 
...
...
add row table:summary values: "Another Test, Pass"
...
...
add row table:summary values: "Yet Another Test, Fail"
...

(プログラムはまだ誰にも見せられていないので、DSL を好きなように自由に変更できます。ただし、DSL を可能な限り人間が読めるようにすることができれば素晴らしいことです)

4

2 に答える 2

1

あなたの要件を正しく理解しているかどうかはわかりませんが、この単純な概念実証を思いつきました。これはかなり高速に思えます。注意してください、それはJavaで書かれていません:(

 awk '/^add row table:/{printf "%06d|%s\n", hash[$3], $0; next}
      /^add table:/{hash[$2]=NR}
                   {printf "%06d|%s\n", NR, $0}' data |
 sort -sn |
 cut -f2 -d'|'

「アルゴリズム」は単純です。テーブル名から行番号までのハッシュ テーブルを保持します。新しいテーブル定義が表示されるたびに、現在の行番号をハッシュ テーブルに挿入します。行以外のadd row行ごとに、行番号を行のプレフィックスとして出力します。行の場合add rowは、ハッシュ テーブルでテーブル名を検索し、行番号の代わりにそれを使用します。次に、出力を安定した並べ替えで並べ替えます。[注1および2]

2 つのテーブルを持つ次のデータ ファイルでテストしました。

add header: "Smoke Testing Report for ..... (app name)"
add subheader: "on .... (date)"
add table:summary header="Summary" columns: 2
add title : "Login page"
add table:other header="Other" columns: 1
add screenshot : "C:/projects/SmokingCPOII/geb-reports/Into_Login_page.png"
newpage
... 1
... 2
add title : "Entitlements Before Submit"
add screenshot : "C:/projects/SmokingCPOII/geb-reports/Entitlements Before Submit.png"
newpage
add title : "End"
add screenshot : "C:/projects/SmokingCPOII/geb-reports/end.png"
newpage
... 3
add row table:other values: "Other 1"
... 4
add row table:summary values: "Entitlements Test, Pass" 
... 5
... 6
add row table:other values: "Other before 2"
add row table:other values: "Other 2"
add row table:other values: "Other after 2"
... 6a
add row table:summary values: "Another Test, Pass"
... 7
... 8
add row table:summary values: "Yet Another Test, Fail"

そしてそれは以下を生み出しました:

add header: "Smoke Testing Report for ..... (app name)"
add subheader: "on .... (date)"
add table:summary header="Summary" columns: 2
add row table:summary values: "Entitlements Test, Pass" 
add row table:summary values: "Another Test, Pass"
add row table:summary values: "Yet Another Test, Fail"
add title : "Login page"
add table:other header="Other" columns: 1
add row table:other values: "Other 1"
add row table:other values: "Other before 2"
add row table:other values: "Other 2"
add row table:other values: "Other after 2"
add screenshot : "C:/projects/SmokingCPOII/geb-reports/Into_Login_page.png"
newpage
... 1
... 2
add title : "Entitlements Before Submit"
add screenshot : "C:/projects/SmokingCPOII/geb-reports/Entitlements Before Submit.png"
newpage
add title : "End"
add screenshot : "C:/projects/SmokingCPOII/geb-reports/end.png"
newpage
... 3
... 4
... 5
... 6
... 6a
... 7
... 8

注 1: 行の追加が発生したときに、テーブル名が存在することを確認することをお勧めします。

注 2: ハッシュ テーブルに表示される行番号と行数の両方を保持しadd row、新しい行が表示されるたびにカウントを更新することが可能です。その場合、安定した並べ替えについて心配する必要はありません。ただし、安定した並べ替えを見つけるのは問題ではないと思うので、複雑さは避けたいと思います。

于 2012-10-07T19:21:12.773 に答える
0

最後に、O(n) space メソッドで O(n) way を見つけたと思います

ソートされた値 (sortedList) を保持するための空のリストと、テーブル宣言の位置を格納するための空のマップを作成します。

    1) Loop through each line of the file  
    2) If the line of the file is a table declaration, populate it into a tableMap with key as tablename and value as line number
    2a) Add the line to the sorted list
    3) If the line of the file is a row declaration, take the line number of the table (in the tableMap) and insert the row line in the next index (in the sorted list)
    3a) Increment the line number value for the table in the tableMap
    4) If this is any other line, just add it to the sorted list
于 2012-10-08T08:47:26.503 に答える