我有一个为烟雾测试程序编写的 DSL。在程序运行结束时,另一个程序会拾取它并生成 PDF 报告。(选择DSL主要是为了在不同格式之间切换)
在标题页之后,将显示测试套件结果的摘要。所以,我在那里放了一个占位符。
add table:summary header="Summary" columns: 2
然后,在每个测试用例的末尾,我在该表中插入一行,如下所示:
add row table:summary values: "Entitlements Test, PASS"
由于表声明和行是分散的,我想在 DSL 解析器运行它之前将它们全部分组,DSL 解析器会立即对每一行执行操作。
有没有更好的方法将行与表分组并按照程序编写的顺序(时间)。
我已经打破了几天的头,但找不到比这些蹩脚的想法更好的方法:
(如果我想在报告中引入更多表格,我所有的解决方案都很糟糕)
将文件作为字符串列表加载到内存中。将指针放在第一个表索引上,进一步循环(通过整个列表)并在表声明的下一个索引中插入行,将列表的其余部分向下推 - 每行 0(n) :-( 在整个列表之后已经遍历完,寻找下一个表指针,重复这个过程,如果列表已经到了末尾,没有碰到另一个表,我们就完成了。我想平衡树比这里的列表更好。
在“添加表”之前添加一个前缀,例如“t1”,行为“t1r1”、“t1r2”,并在解析器运行之前对 DSL 进行预处理。
选择所有以“添加表”和“添加行”开头的行,将其存储在有序列表中。对于每个表,过滤表的相关行,做固定顺序比较。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 尽可能具有人类可读性,那就太好了)