2017-07-07 18 views
0

--- +附图ISO ERT直列测试成语(追加来自多个ERT呼叫TEST_OUTPUT)

问:如果有多个,分离的,独立于ERT呼叫,我可以安排来连接这些输出在同一个缓冲区中测试?在不同时间拨打ert电话?

(如果没有知道这些独立的测试集中thingamajig。)

例如如果我有两个(或更多)测试,例如在.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*缓冲区将只包含最后一次测试运行输出。

--- + DETAIL

--- ++动机

问:为什么我要这么做?

答:“内联测试”。特别是,在我的.emacs文件(以及它加载和/或需要的文件)中进行内联测试。

加载每次运行.emacs或类似文件的测试。 (可能还有其他测试是以批处理模式运行的 - 但我在这里说的是我想要立即运行的测试,每次加载.emacs都会加载(并且便于在修改.emacs时进行编辑/调试)

即我找了在线测试成语

我已经把代码在我的.emacs和〜/ lib目录/ GNU-Emacs的/ ** EL文件看起来像这样:。

;; some blob of code 
(defun foo (arg) ...) 

(ert-deftest test-foo() ...) 
(ert 'test-foo) 

ie ie我定义了功能,测试,并运行测试,彼此相邻。

...我还不如承认,我经常换一个`progn这个”周围,

(progn  
    ;; some blob of code 
    (defun foo (arg) ...) 
    (ert-deftest test-foo() ...) 
    (ert 'test-foo) 
) 

,因为这可以很容易地进行编辑,以函数foo或测试,然后跳转到的结束预测和做eval-last-sexp(我已经绑定到Cj)。而且我还经常包装if或and和around,以便轻松禁用正在开发的功能。有时,如果特征有变量,则在*中混合。

(我使用过的其他ert-家庭跑步,像ERT-运行测试批叔 - 运行 - 测试 - 交互式。但普通的老式似乎不够。)

(把defun定义deftest一个progn这个里面或其他休息时间一些工具,希望defun定义始终处于顶级水平。这让multiline docstrings even uglier,但它是该死的方便,而且操作恕我直言工具对编程语言文件应该解析编程语言)。

所以,以后我会对另一个模块做同样的事情。远处。可能在一个单独的文件中,可能是一个库文件。

(progn  
    ;; some blob of code 
    (defun bar (arg) ...) 
    (ert-deftest test-bar() ...) 
    (ert 'test-bar) 
) 

这两个模块都不应该知道另一个。

也不应该有一个集中的模块,其中包含所有这些测试的列表,最终运行。

如果仅仅是因为在加载文件的过程中可能出现故障。并且知道到目前为止通过或失败的测试是很方便的。

(尽管收集和运行,在结束所有试验丢失了增量测试运行的能力。)

--- ++应该是一个宏观

我恨重复。例如。在下面的东西中,我讨厌三次输入BAR。

(progn  
    ;; some blob of code 
    (defun BAR (arg) ...) 
    (ert-deftest test-BAR() ...) 
    (ert 'test-BAR) 
) 

因此,当然我会创建一个宏来减少这种重复。虽然随后乡亲寻找ERT-deftest会感到困惑......

--- ++中等长度的简单的例子

如果我有

(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 

. 

回答

0

正如经常发生的那样,发布问题的行为表明了答案。

虽然有点难看,当然也不标准。所以如果有人发表简洁的标准方式,我会接受这样的答案。

的IMHO丑陋的方式:

当我

(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缓冲区从独立测试,但设法创建融合缓冲区,报告所有简洁。