2017-07-07 17 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緩衝區從獨立測試,但設法創建融合緩衝區,報告所有簡潔。