Initial commit
This commit is contained in:
142
skills/ert/README.md
Normal file
142
skills/ert/README.md
Normal file
@@ -0,0 +1,142 @@
|
||||
# ERT (Emacs Lisp Regression Testing)
|
||||
|
||||
Built-in testing framework for Emacs Lisp, providing comprehensive test definition, execution, and debugging capabilities.
|
||||
|
||||
## Quick Start
|
||||
|
||||
### Basic Test
|
||||
|
||||
```elisp
|
||||
(require 'ert)
|
||||
|
||||
(ert-deftest test-addition ()
|
||||
"Test that addition works correctly."
|
||||
(should (= 4 (+ 2 2)))
|
||||
(should (= 0 (+ -5 5))))
|
||||
```
|
||||
|
||||
### Run Tests
|
||||
|
||||
**Interactively:**
|
||||
```elisp
|
||||
M-x ert RET t RET
|
||||
```
|
||||
|
||||
**From Command Line:**
|
||||
```bash
|
||||
emacs -batch -l ert -l my-tests.el -f ert-run-tests-batch-and-exit
|
||||
```
|
||||
|
||||
### Assertions
|
||||
|
||||
```elisp
|
||||
;; Assert true
|
||||
(should (= 2 (+ 1 1)))
|
||||
|
||||
;; Assert false
|
||||
(should-not (= 3 (+ 1 1)))
|
||||
|
||||
;; Assert error
|
||||
(should-error (/ 1 0) :type 'arith-error)
|
||||
```
|
||||
|
||||
## Key Features
|
||||
|
||||
- **Built-in:** No installation required (Emacs 24+)
|
||||
- **Interactive debugging:** Backtrace inspection, test reruns
|
||||
- **Flexible selectors:** Run specific tests by name, tag, or status
|
||||
- **Batch mode:** CI/CD integration with exit codes
|
||||
- **Mocking support:** Easy mocking via dynamic binding
|
||||
- **Rich assertions:** Detailed failure reporting with subexpression values
|
||||
|
||||
## Common Patterns
|
||||
|
||||
### Temporary Buffers
|
||||
|
||||
```elisp
|
||||
(ert-deftest test-buffer-operation ()
|
||||
(with-temp-buffer
|
||||
(insert "test content")
|
||||
(my-function)
|
||||
(should (string= (buffer-string) "expected"))))
|
||||
```
|
||||
|
||||
### Cleanup with unwind-protect
|
||||
|
||||
```elisp
|
||||
(ert-deftest test-with-cleanup ()
|
||||
(let ((temp-file (make-temp-file "test-")))
|
||||
(unwind-protect
|
||||
(progn
|
||||
(write-region "data" nil temp-file)
|
||||
(should (file-exists-p temp-file)))
|
||||
(delete-file temp-file))))
|
||||
```
|
||||
|
||||
### Mocking Functions
|
||||
|
||||
```elisp
|
||||
(ert-deftest test-with-mock ()
|
||||
(cl-letf (((symbol-function 'external-call)
|
||||
(lambda () "mocked result")))
|
||||
(should (string= "mocked result" (my-function)))))
|
||||
```
|
||||
|
||||
### Test Organization with Tags
|
||||
|
||||
```elisp
|
||||
(ert-deftest test-quick-operation ()
|
||||
:tags '(quick unit)
|
||||
(should (fast-function)))
|
||||
|
||||
;; Run only quick tests
|
||||
M-x ert RET :tag quick RET
|
||||
```
|
||||
|
||||
## Interactive Debugging Commands
|
||||
|
||||
When viewing test results (after `M-x ert`):
|
||||
|
||||
- `.` - Jump to test definition
|
||||
- `d` - Re-run test with debugger
|
||||
- `b` - Show backtrace
|
||||
- `r` - Re-run test
|
||||
- `R` - Re-run all tests
|
||||
- `l` - Show executed assertions
|
||||
- `m` - Show messages
|
||||
|
||||
## Best Practices
|
||||
|
||||
1. **Name tests descriptively:** `package-test-feature` format
|
||||
2. **One assertion focus per test:** Makes failures clear
|
||||
3. **Isolate test environment:** Use `let`, temporary buffers
|
||||
4. **Always cleanup:** Use `unwind-protect` for resources
|
||||
5. **Tag tests:** Organize by speed and type
|
||||
6. **Test error cases:** Use `should-error` for edge cases
|
||||
7. **Mock external dependencies:** Avoid filesystem/network I/O
|
||||
|
||||
## Using the Skill
|
||||
|
||||
This skill provides:
|
||||
- Complete API reference for all ERT functions
|
||||
- Comprehensive best practices and patterns
|
||||
- Detailed examples for common testing scenarios
|
||||
- Debugging techniques and workflow integration
|
||||
- CI/CD integration examples
|
||||
|
||||
Consult `SKILL.md` for in-depth documentation.
|
||||
|
||||
## Learning Path
|
||||
|
||||
1. **Basics:** `ert-deftest`, `should`, running tests interactively
|
||||
2. **Assertions:** `should-not`, `should-error` with error types
|
||||
3. **Environment:** `with-temp-buffer`, `let`, `unwind-protect`
|
||||
4. **Organization:** Tags, test naming, selectors
|
||||
5. **Advanced:** Mocking, fixtures, custom assertions
|
||||
6. **Integration:** Batch mode, CI/CD, Makefiles
|
||||
|
||||
## External Resources
|
||||
|
||||
- [Official ERT Manual](https://www.gnu.org/software/emacs/manual/html_mono/ert.html)
|
||||
- [ERT in Emacs Info](info:ert) or `C-h i m ert RET`
|
||||
- [ERT Reference Card](https://github.com/fniessen/refcard-ERT)
|
||||
Reference in New Issue
Block a user