The primary reason for building Baretest was to get near-instant unit tests. We constantly hit CMD + B
on Sublime Text to test a function we are actively working on. We do this all the time, sometimes hundreds of times a day. If the test takes seconds to run our flow suffers and the frustration levels start to rise.
Here's the difference when running the same test file with Jest and Baretest.
Sometimes Jest took seven seconds to start on a regular laptop. This is not acceptable for our style of unit testing, where everything above 100ms is considered slow.
It's easy
We think a good test runner stays out of your way. We want to focus on the task at hand and not deal with the complexities of testing.
The test()
and assert.equals()
methods are typically 98% of what we use when writing tests. We've never needed automatic re-ordering, file watchers, “mocking” or “snapshotting”. We want our test runner to be as invisibe as possible. We don't want to commit to a massive framework that dictates our work.
Built for Minimalists
Baretest is built in minimalistic fashion. It has only 44 lines of code and only one dependency (with 12 LOC). In contrast, Jest is 57,540 lines of TypeScript and it has 76 dependencies. There are 1,745 files on the repository and a whopping 119,624 lines of code in total. These are big numbers for a test runner.
Baretest is stripped down to bare essentials so if you need advanced stuff like parallelization, coverage reports, or mock functions, then Baretest is a bad choice.
Install Baretest using npm
:
Let's start by creating a simple app called sum.js
:
Then, create tests for it in a file named test.js
Finally, run node test
and Baretest will print this:
Done. Your first test using Baretest.
Organizing multiple tests
With Baretest you can organize your tests programmatically with JavaScript giving you fine-grained control. For example:
Error handling
Errors are pretty printed with color:
> node test
Bareserver • • • • • • • • • •
FAIL: “Raw handlers”
ReferenceError: bareserver.raw is not defined
TypeError: Cannot set property ‘b’ of undefined
at Object.<anonymous> (tools/bareserver/test.js:101:11)
at Object.self.exec (tools/bareserver/lib/index.js:71:22)
at processTicksAndRejections (internal/process/task_queues.js:97:5)
at async Object.fn (tools/bareserver/test.js:108:15)
test(name, fn)
Runs a function that contains the expectations to test. The first argument is the test name, which is shown when the test function fails.
test.only(name, fn)
Run only these tests and ignore the rest
test.before(fn)
Run the given function before all the supplied tests.
test.after(fn)
Run the given function when there is a failure or after all the tests have passed.
test.skip(name?, fn?)
Skip the given function. Useful for omitting tests temporarily.
test.run()
Run all the supplied tests.
Why not make testing 🎉🎉😊🎉😍 fun?
This question probably stems from the fact that testing is typically the least enjoyable part of software development. Instead of striving for “fun” or “delightful”, we shoot for “tolerable”. Feels closer to reality.
Why care about the size?
We want to keep Baretest small because small things are easier to maintain and they have faster startup times, which is essential for our unit tests.
Why not use arrow functions?
We think old school function declarations are clearer, especially with the async
keyword. Explicit is good. Or maybe we are just old farts.
Where is this project heading?
Towards stability. We strive for zero issues and Long Term Support (LTS) release.
Who are you?
We use Baretest to develop Volument, which is a new take on website analytics and A/B testing. We think the current data model in analytics is broken and needs to be fixed.
Finally, you might also like Bareserver, which is an Express alternative for minimalists.
from Hacker News https://ift.tt/38fsX37
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.