スモークテストプログラム用に書かれた DSL があります。プログラムの実行の最後に、別のプログラムがこれを取得して PDF レポートを生成します。(DSL は、主に異なる形式を切り替えるために選択されます)
タイトル ページの後に、テスト スイートの結果の概要が表示されます。そこで、プレースホルダーを置きました。
add table:summary header="Summary" columns: 2
そして、各テスト ケースの最後に、次のようにこのテーブルに行を挿入します。
add row table:summary values: "Entitlements Test, PASS"
テーブル宣言と行が散らばっているので、行ごとにすぐにアクションを実行する DSL パーサーによって実行する前に、それらをすべてグループ化したいと思います。
テーブルで行をグループ化し、プログラムによって書き込まれた順序で行をグループ化するより良い方法はありますか (時間)。
私は数日以上頭を悩ませてきましたが、これらの不十分なアイデアよりも良い方法を見つけることができませんでした:
(レポートにさらに多くのテーブルを導入したい場合、私のソリューションはすべてひどいものです)
ファイルを文字列のリストとしてメモリにロードします。最初のテーブル インデックスのポインターを保持し、さらに (リスト全体を介して) ループし、テーブル宣言の次のインデックスに行を挿入して、リストの残りを押し下げます - 各行に対して 0(n) :-( リスト全体の後トラバースされたら、次のテーブル ポインタを検索し、プロセスを繰り返します. リストが別のテーブルにヒットせずに最後に到達した場合, 完了です. ここでのリストよりもバランスの取れたツリーの方が良いオプションだと思います.
「add table」の前に「t1」、行を「t1r1」、「t1r2」のようにプレフィックスを付け、パーサーで実行する前に DSL を前処理します。
「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 を可能な限り人間が読めるようにすることができれば素晴らしいことです)