0

---+ 概要

Q: 複数の個別の独立した ert 呼び出しがある場合、これらのテストの出力を同じバッファーに連結するように手配できますか? 異なる時間に ert の呼び出しが行われていますか?

(これらの独立したテストについて知っている中央集権的なものはありません。)

たとえば、.emacs ファイルに 2 つ (またはそれ以上) のテストがある場合

 (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*バッファーには最後のテスト実行の出力のみが含まれます。

---+詳細

---++ モチベーション

Q: なぜこれをやりたいのですか?

A: 「インライン テスト」です。特に、私の .emacs ファイル (およびそれがロードおよび/または必要とするファイル) 内のもののインライン テスト。

.emacs または同様のファイルがロードされるたびに実行されるテスト。(バッチモードで実行する他のテストがあるかもしれませんが、ここでは、.emacs が読み込まれるたびにすぐに実行したいテストについて話しています (.emacs の変更中に編集/デバッグするのに便利です)。

つまり、インライン テストのイディオムを探しています。

次のようなコードを .emacs および ~/lib/gnu-emacs/**.el ファイルに入れています。

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

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

つまり、関数とテストを定義し、テストを実行します。

... 私はしばしば「prog」をラップすることを認めます。

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

これにより、関数 foo またはテストを編集し、progn の最後にジャンプして eval-last-sexp を実行することが容易になるためです (これは Cj にバインドされています)。また、開発中の機能を簡単に無効にするために、if または and and and and around をラップすることもよくあります。機能に変数がある場合は、let* を使用してミックスすることもあります。

(私はert -run-tests-batchert-run-tests-interactively のような他のert-ファミリー ランナーを使用しました。しかし、単純な古いertで十分なようです。)

( defundeftestをprognやその他の内部に置くと、 defun が常に最上位にあることを期待するいくつかのツールが機能しなくなります。また、複数行の docstring がさらに醜くなります。しかし、これは非常に便利であり、プログラミング言語ファイルを操作する IMHO ツールは、プログラミングを解析する必要があります。言語。)

そのため、後で、別のモジュールに対して同じことを行います。遠く。おそらく別のファイル、おそらくライブラリファイルにあります。

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

どちらのモジュールも、他のモジュールを認識してはなりません。

最後に実行される、そのようなすべてのテストのリストを持つ集中型モジュールも存在しないでください。

ファイルのロードの途中で失敗する可能性があるという理由だけで。そして、その時点までのどのテストが成功したか失敗したかがわかると便利です。

(一方、最後にすべてのテストを収集して実行すると、増分テスト実行能力が失われます。)

---++ マクロである必要があります

私は繰り返しが嫌いです。たとえば、以下の例では、BAR を 3 回入力する必要がありません。

(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

.
4

1 に答える 1