-+简略
问:如果我对ert有多个单独的独立调用,我能安排在同一个缓冲区中连接这些测试的输出吗?在不同的时间打电话给ert?
(没有一个知道这些独立测试的集中式测试。)
例如,如果我有两个(或更多)测试,例如在一个.emacs文件中
(ert-deftest test1 ()(should t))
(ert 'test1)
... many miles away, quite likely in a separate file ...
(ert-deftest test2 ()(should t))
(ert 'test2)两人都会跑--我可以通过查看*Messages*来判断这一点。
...
Running 1 tests (2017-07-07 12:10:39-0700)
passed 1/1 test_ag_non-null_and_true
...
Running 1 tests (2017-07-07 12:10:39-0700)
passed 1/1 test-ag-code-disabling
...但是*ert*缓冲区将只包含最后一次测试运行的输出。
-+细节
-++动机
问:我为什么要这么做?
答:“内联测试”。特别是,对我的.emacs文件(以及它加载和/或需要的文件)中的内容进行内联测试。
每次加载.emacs或类似文件时都会运行的测试。(可能还有其他以批处理模式运行的测试-但这里我要讨论的是每次加载.emacs时都要立即运行的测试(以及在修改.emacs时方便编辑/调试)。
我在找一个用于内嵌测试的成语。
我在我的.emacs和~/lib/gnu-emacs/**..el文件中放置了如下代码:
;; some blob of code
(defun foo (arg) ... )
(ert-deftest test-foo () ... )
(ert 'test-foo)也就是说,我定义了函数,测试,并运行测试,就在彼此旁边。
..。我不妨承认,我经常把一个“宣言”围绕在一起,
(progn
;; some blob of code
(defun foo (arg) ... )
(ert-deftest test-foo () ... )
(ert 'test-foo)
)因为这样可以很容易地编辑函数foo或测试,然后跳到progn和do val-末后性(我已经绑定到C)的末尾。此外,我还经常包装if或和周围,使它很容易禁用一个正在开发的功能。有时使用let*,然后混合,如果特性有变量。
(我使用了其他ert家族跑步者,比如ert运行测试批处理和ert运行测试-交互测试)。但普通的旧ert似乎就足够了。)
(将讨厌和防御放入一个项目或其他一些工具中,这些工具总是处于顶层。)它使多行文档字符串甚至更丑
因此,稍后,我将对另一个模块执行相同的操作。很远。可能在单独的文件中,也可能在库文件中。
(progn
;; some blob of code
(defun bar (arg) ... )
(ert-deftest test-bar () ... )
(ert 'test-bar)
)两个模块都不应该知道另一个模块。
也不应该有一个集中式模块,其中包含所有此类测试的列表,这些测试将在最后运行。
如果仅仅是因为在加载文件的中途可能会出现故障。而且很方便地知道什么测试通过了或者失败了。
(而在最后收集和运行所有测试则失去了增量测试运行能力。)
-++应该是宏
我讨厌重复。在下面的东西里,我讨厌敲三次酒吧。
(progn
;; some blob of code
(defun BAR (arg) ... )
(ert-deftest test-BAR () ... )
(ert 'test-BAR)
)因此,我当然会创建一个宏来减少这种重复。尽管那样的话,寻找ert防御的人们会感到困惑.
-++-++
如果我有
(ert-deftest test1 ()(should t))
(ert 'test1)我会得到一个很好的*ert*缓冲区
Selector: test1
Passed: 1
Failed: 0
Skipped: 0
Total: 1/1
Started at: 2017-07-07 14:16:06-0700
Finished.
Finished at: 2017-07-07 14:16:07-0700
.如果以后我有
(ert-deftest test2 () (should t))
(ert 'test2)它将删除test1在*ert*缓冲区中的输出,并将其替换为
Selector: test2
Passed: 1
Failed: 0
Skipped: 0
Total: 1/1
Started at: 2017-07-07 14:15:47-0700
Finished.
Finished at: 2017-07-07 14:15:47-0700
.我想要的是将两个测试的输出连接起来:
Selector: test1
Passed: 1
Failed: 0
Skipped: 0
Total: 1/1
Started at: 2017-07-07 14:16:06-0700
Finished.
Finished at: 2017-07-07 14:16:07-0700
.
Selector: test2
Passed: 1
Failed: 0
Skipped: 0
Total: 1/1
Started at: 2017-07-07 14:15:47-0700
Finished.
Finished at: 2017-07-07 14:15:47-0700
.发布于 2017-07-07 22:34:13
正如经常发生的那样,发布问题的行为表明了答案。
虽然它有点丑陋,当然也不标准。因此,如果有人以简洁、标准的方式发表意见,我将接受这样的回答。
国际水文学组织丑恶的方式:
当我这么做
(progn
;; some blob of code
(defun foo (arg) ... )
(ert-deftest test-foo () ... )
(ert 'test-foo)
)我可以添加更多代码来操作ert输出缓冲区:
(progn
;; some blob of code
(defun foo (arg) ... )
(ert-deftest test-foo () ... )
(ert 'test-foo)
...append `*ert*' contents to `*ert-multiple-independent-tests*'
)(如果宏化,键入的次数较少)
这是显而易见的。我希望‘`ert’的“自动自我测试”的论点也能达到类似的效果。
ert is an alias for ‘ert-run-tests-interactively’ in ‘ert.el’.
(ert SELECTOR &optional OUTPUT-BUFFER-NAME MESSAGE-FN)
Run the tests specified by SELECTOR and display the results in a buffer.
SELECTOR works as described in ‘ert-select-tests’.
OUTPUT-BUFFER-NAME and MESSAGE-FN should normally be nil; they
are used for automated self-tests and specify which buffer to use
and how to display message.敷衍了事的调查迄今收效甚微。
我想要一个更好的方法,如果只是因为它可能已经解决了是否在批处理模式下这样做的细节,等等。
或者,如果有人成功地连接了来自独立测试的ert缓冲区,并且成功地创建了一个融合缓冲区,该缓冲区可以简洁地报告所有的情况。
https://stackoverflow.com/questions/44980464
复制相似问题