0

我有一个为烟雾测试程序编写的 DSL。在程序运行结束时,另一个程序会拾取它并生成 PDF 报告。(选择DSL主要是为了在不同格式之间切换)

在标题页之后,将显示测试套件结果的摘要。所以,我在那里放了一个占位符。

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

然后,在每个测试用例的末尾,我在该表中插入一行,如下所示:

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

由于表声明和行是分散的,我想在 DSL 解析器运行它之前将它们全部分组,DSL 解析器会立即对每一行执行操作。

有没有更好的方法将行与表分组并按照程序编写的顺序(时间)。

我已经打破了几天的头,但找不到比这些蹩脚的想法更好的方法:

(如果我想在报告中引入更多表格,我所有的解决方案都很糟糕)

  1. 将文件作为字符串列表加载到内存中。将指针放在第一个表索引上,进一步循环(通过整个列表)并在表声明的下一个索引中插入行,将列表的其余部分向下推 - 每行 0(n) :-( 在整个列表之后已经遍历完,寻找下一个表指针,重复这个过程,如果列表已经到了末尾,没有碰到另一个表,我们就完成了。我想平衡树比这里的列表更好。

  2. 在“添加表”之前添加一个前缀,例如“t1”,行为“t1r1”、“t1r2”,并在解析器运行之前对 DSL 进行预处理。

  3. 选择所有以“添加表”和“添加行”开头的行,将其存储在有序列表中。对于每个表,过滤表的相关行,做固定顺序比较。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]

我用这个数据文件测试了它,它有两个表:

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) 空间方法的 O(n) 方式

创建一个空列表来保存排序值(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 回答