[RFC]: Migrate from tape to in-house @stdlib/test/harness
- Lingua principale
- JavaScript
- Stelle
- 6k
- Fork
- 1.3k
- Merge medio
- 1g 3h
- PR unite (30g)
- 611
Descrizione
### Description
This RFC proposes
## Proposal: Migrate stdlib Tests to In-House `@stdlib/test/harness`
This proposal delivers a tape-equivalent in-house test runner as `@stdlib/test/harness`, directly porting its minimal TAP API while matching `@stdlib/bench/harness` patterns. It eliminates the tape dep, supports only stdlib's used assertions (equal, strictEqual, ok, deepEqual, pass, fail, plan, end, test), and adds `@stdlib/string/format` interpolation—no parallelism, grouping, or extras like mocha/jest.
### Before/After Test File
**Before (tape):**
```
'use strict';
var tape = require( 'tape' );
var foo = require( './../lib' );
tape( 'main export is a function', function test( t ) {
t.ok( true, 'should be true' );
t.strictEqual( typeof foo, 'function', 'main export is a function' );
t.end();
});
tape( 'computes correctly', function test( t ) {
t.plan( 2 );
t.equal( foo( 3 ), 9, 'returns 9' );
t.deepEqual( foo( ),, 'deep equal' );[1][2][3]
t.end();
```
### After (`@stdlib/test/harness`):
**After (`@stdlib/test/harness`):**
```
```javascript
'use strict';
var test = require( '@stdlib/test/harness' );
var foo = require( './../lib' );
test( 'main export is a function', function test( t ) {
t.ok( true, 'should be true' );
t.strictEqual( typeof foo, 'function', 'main export is %s', 'function' );
t.end();
});
test( 'computes correctly', function test( t ) {
t.plan( 2 );
t.equal( foo( 3 ), 9, 'returns %d', 9 );
t.deepEqual( foo( ),, 'deep equal' );[1][2][3]
t.end();
});
```
**Changes**: Swap `require('tape')` → `require('@stdlib/test/harness')`. Assertions identical—no renames/refactors. Interpolation optional (%s/%d/%j via `@stdlib/string/format`).
## Study of References
Reviewed tape source (tape-testing/tape): TAP stream via events, nested tests, async end(), assertion tracking. Compared to `@stdlib/bench/harness`: Similar `b.bench()`/`test()`, exports harness/stream factory, stdout TAP—no deps. Stdlib tests (e.g., Makefile/package.json scans): Use ~6 assertions max, plain TAP, no advanced tape features. Impl ports tape's core (test context, assert/incr count, TAP lines) to ~400 LOC Node streams.
## Automation Strategy
- Publish `@stdlib/test/harness` (bench mirror: libtests, Makefile).
- Global replace: `grep -rl "require('tape')" lib/ | xargs sed -i "s|require('tape')|require('@stdlib/test\/harness')|g"` (handles escapes).
- Glob run: Update stdlib Makefile: `$(QUIET) $(NODE) $(TOOLS_DIR)/harness.js $(shell find lib -name 'test.*.js')`.
- Validate: CI diff old/new TAP (tape | harness); fix interpolation mismatches via optional post-sed (regex scan t.equal/ok args).
- Coverage: Stick with istanbul (nyc/c8 drops Node 10-12 compat).
### Related Issues
[Idea]: develop a project test runner
### Questions
No.
### Other
No.
### Checklist
- [x] I have read and understood the [Code of Conduct](https://github.com/stdlib-js/stdlib/blob/develop/CODE_OF_CONDUCT.md).
- [x] Searched for existing issues and pull requests.
- [x] The issue name begins with `RFC:`.
Guida per i contributori
Apri la guida per i contributori
Direzione di ricerca
Start by reading the proposed @stdlib/test/harness alongside the existing @stdlib/bench/harness patterns, then inspect lib test files, package.json, the stdlib Makefile, and tools/harness.js. Compare the current tape-based test execution and TAP output with the proposed harness; completion means the migration scope, supported assertions, and CI validation are agreed and working across the affected tests.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- javascript, node.js
- Ambito
- build-system, testing-qa, tooling
- Tipo di issue
- Refactoring
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 20/100