ISO ert内联测试习惯用法(从多个ert调用添加TEST_OUTPUT)

时间:2017-07-07 22:21:21

标签: emacs automated-tests ert

--- +简介

问:如果我对ert进行多次独立的独立调用,我可以安排在同一个缓冲区中连接这些测试的输出吗?在不同的时间调用ert?

(没有知道这些独立测试的集中化的事情。)

E.g。如果我有两个(或更多)测试,例如在.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)

即。我定义了函数,测试和运行测试,紧挨着彼此。

......我不妨承认我经常把'预测'包裹起来,

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

因为这样可以很容易地对foo或测试进行编辑,然后跳到预测结束并执行eval-last-sexp(我已经绑定到C-j)。而且我经常还会包装一个if或者and和around,以便轻松禁用正在开发的功能。有时使用let * in混合,如果要素有变量。

(我已经使用了其他 ert - 家庭跑步者,比如 ert-run-tests-batch ert-run-tests-interactively 但是普通的 ert 似乎已经足够了。)

(将 defun deftest 置于 progn 或其他内容中打破一些期望defun始终处于最高级别的工具。 multiline docstrings even uglier。但它很方便,对编程语言文件进行操作的IMHO工具应该解析编程语言。)

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

(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)

它将擦除*ert*缓冲区中test1的输出,并将其替换为

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

.

1 个答案:

答案 0 :(得分:0)

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

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

恕我直言,丑陋的方式:

当我这样做时

(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.

迄今为止,Perfunctory调查收效甚微。

我希望有一种更好的方式,只是因为它可能已经解决了是否以批处理模式执行此操作的详细信息等。

或者,如果有人管理的不只是从独立测试中连接 ert 缓冲区,而是设法创建一个简洁地报告所有内容的融合缓冲区。

相关问题