An emacs package that integrates ivy/counsel with different testing frameworks.
This package is inspired by helm-ctest, huge thanks to the author.
Disclaimer: This package is still rather small and simple. It may contain bugs and other errors. I have been using it for a half of a year already at my work and it proved to be useful. Now I have decided that counsel-test can be useful for someone else too. The idea is to have core generic functionality for test discovery and execution in compilation buffer with a collection of framework integrations on top of that. I plan to enhance this package with support for other frameworks and add some helpful features in the future. Feedback is highly appreciated!
M-x package-install [RET] counsel-test [RET] or
(use-package counsel-test
:ensure t)
First, clone this repo. Then, load the package with the method of your
choice (e.g. load-path
/require
, use-package
etc). An example with
use-package
:
(use-package counsel-test
:load-path "~/.emacs.local/counsel-test")
Currently, there is a basic support only for two testing frameworks: ctest
and pytest. There are two separate commands for them: counsel-test-ctest
and counsel-test-pytest
respectively.
In your project it is sufficient to invoke one of them, say M-x counsel-test-ctest
. You will be prompted for the directory with ctest
tests. After this, you will see a list of the available tests. You can pick any
test or even a group of tests (with the help of ivy-mark
). Note that the
directory you have selected won't be cached, so each subsequent call to
counsel-test-ctest
will ask you for the directory again.
An alternative solution is to add counsel-test-dir
variable to the project
dir-locals.el
. This will remove the need to select the test directory manually
again and again or after emacs restarts or during switching between different
projects.
Manual test directory selection will still be available with the help of prefix
argument: C-u M-x counsel-test-ctest
.
If something goes wrong during test discovery, an error message will be shown in
the echo area and you may view the discover function output in a dedicated
buffer: *counsel-test-<program>-log*
.
This package contains several variables that allow certain customization on the
per-project basis. They have sensible defaults but it is strongly recommended to
set some of them in dir-locals.el
for each project separately.
counsel-test-dir
- directory from where to run the test discovery and test execution commands. Default value isnil
. Whennil
the user is asked for the directory interactively. This is the primary candidate for being a dir-local variable. Note that currently, when setting this indir-locals.el
you have to provide the absolute path. Relative paths do not work for now.
-
counsel-test-ctest-env
- environment variable settings for the ctest tests execution. The default value is'("CLICOLOR_FORCE=1" "CTEST_OUTPUT_ON_FAILURE=1")
to enable colors and test output only in case of failures. More variables can be found in ctest docs. -
counsel-test-ctest-cmd
- command that is used to run ctest, defaults to "ctest". If you wish to use the custom ctest binary, point this variable to it, e.g.(setq counsel-ctest-cmd "path/to/custom/ctest-bin)
. Keep in mind that this variable value is forwarded tocall-process
asprogram
argument, so it should be available on your system.
counsel-test-pytest-env
- environment variable settings for pytest tests discovery. The default value isnil
. This should be a list of"ENV=value"
strings (seeprocess-environment
). This may be particularly handy if you need to update yourPYTHONPATH
before runningpytest
.counsel-test-pytest-cmd
- command that is used to run pytest, defaults to "pytest". Can be altered similar tocounsel-test-ctest-cmd
.
I plan to add support for other frameworks, but if you can't find what you need, it is easy to implement the integration yourself. Don't forget to submit pull-request with your implementation!
To add custom integration, you have to implement two functions:
discover-func
- test discovery function. It does not accept any arguments and has to return a list of strings, representing possible tests (selections). These will be shown in minibuffer withivy
, so you may need to make them look user-friendly.create-cmd-func (selections)
- function that creates a test execution command from the provided selections. It has one argumentselections
which is a list of strings you pick in minibuffer withivy
(a subset from thediscover-func
results). This function should return a string representing a shell command that will be run in compilation buffer.
After providing these two implementations, say
counsel-test-framework--discover
and counsel-test-framework--create-cmd
, you
need to define your entry-point through call to counsel-test
function:
(defun counsel-test-framework (arg)
"Browse and execute framework tests.
With a prefix argument ARG also force prompt user for this directory."
(interactive "P")
(counsel-test 'counsel-test-framework--discover
'counsel-test-framework--create-cmd
'counsel-test-framework
arg))
And then you are ready to go!
For concrete examples, refer to implementations in counsel-test-ctest.el and counsel-test-pytest.el.
Please, feel free to ask any questions and submit bugs, issues or pull requests. All contributions are welcome!