| .. | ||
| asserts.ts | ||
| asserts_test.ts | ||
| bench.ts | ||
| bench_example.ts | ||
| bench_test.ts | ||
| diff.ts | ||
| diff_test.ts | ||
| README.md | ||
Testing
This module provides a few basic utilities to make testing easier and consistent in Deno.
Usage
testing/asserts.ts module provides range of assertion helpers. If the
assertion is false an AssertionError will be thrown which will result in
pretty-printed diff of failing assertion.
equal()- Deep comparison function, whereactualandexpectedare compared deeply, and if they vary,equalreturnsfalse.assert()- Expects a boolean value, throws if the value isfalse.assertEquals()- Uses theequalcomparison and throws if theactualandexpectedare not equal.assertNotEquals()- Uses theequalcomparison and throws if theactualandexpectedare equal.assertStrictEquals()- Comparesactualandexpectedstrictly, therefore for non-primitives the values must reference the same instance.assertStringContains()- Make an assertion thatactualcontainsexpected.assertMatch()- Make an assertion thatactualmatch RegExpexpected.assertArrayContains()- Make an assertion thatactualarray contains theexpectedvalues.assertThrows()- Expects the passedfnto throw. Iffndoes not throw, this function does. Also compares any errors thrown to an optional expectedErrorclass and checks that the error.messageincludes an optional string.assertThrowsAsync()- Expects the passedfnto be async and throw (or return aPromisethat rejects). If thefndoes not throw or reject, this function will throw asynchronously. Also compares any errors thrown to an optional expectedErrorclass and checks that the error.messageincludes an optional string.unimplemented()- Use this to stub out methods that will throw when invokedunreachable()- Used to assert unreachable code
Basic usage:
import { assertEquals } from "https://deno.land/std/testing/asserts.ts";
Deno.test({
name: "testing example",
fn(): void {
assertEquals("world", "world");
assertEquals({ hello: "world" }, { hello: "world" });
},
});
Short syntax (named function instead of object):
Deno.test("example", function (): void {
assertEquals("world", "world");
assertEquals({ hello: "world" }, { hello: "world" });
});
Using assertStrictEquals():
Deno.test("isStrictlyEqual", function (): void {
const a = {};
const b = a;
assertStrictEquals(a, b);
});
// This test fails
Deno.test("isNotStrictlyEqual", function (): void {
const a = {};
const b = {};
assertStrictEquals(a, b);
});
Using assertThrows():
Deno.test("doesThrow", function (): void {
assertThrows((): void => {
throw new TypeError("hello world!");
});
assertThrows((): void => {
throw new TypeError("hello world!");
}, TypeError);
assertThrows(
(): void => {
throw new TypeError("hello world!");
},
TypeError,
"hello"
);
});
// This test will not pass
Deno.test("fails", function (): void {
assertThrows((): void => {
console.log("Hello world");
});
});
Using assertThrowsAsync():
Deno.test("doesThrow", async function (): Promise<void> {
await assertThrowsAsync(
async (): Promise<void> => {
throw new TypeError("hello world!");
}
);
await assertThrowsAsync(async (): Promise<void> => {
throw new TypeError("hello world!");
}, TypeError);
await assertThrowsAsync(
async (): Promise<void> => {
throw new TypeError("hello world!");
},
TypeError,
"hello"
);
await assertThrowsAsync(
async (): Promise<void> => {
return Promise.reject(new Error());
}
);
});
// This test will not pass
Deno.test("fails", async function (): Promise<void> {
await assertThrowsAsync(
async (): Promise<void> => {
console.log("Hello world");
}
);
});
Benching
With this module you can benchmark your code and get information on how is it performing.
Basic usage:
Benchmarks can be registered using the bench function, where you can define a
code, that should be benchmarked. b.start() has to be called at the start of
the part you want to benchmark and b.stop() at the end of it, otherwise an
error will be thrown.
After that simply calling runBenchmarks() will benchmark all registered
benchmarks and log the results in the commandline.
import { runBenchmarks, bench } from "https://deno.land/std/testing/bench.ts";
bench(function forIncrementX1e9(b): void {
b.start();
for (let i = 0; i < 1e9; i++);
b.stop();
});
runBenchmarks();
Averaging execution time over multiple runs:
bench({
name: "runs100ForIncrementX1e6",
runs: 100,
func(b): void {
b.start();
for (let i = 0; i < 1e6; i++);
b.stop();
},
});
Running specific benchmarks using regular expressions:
runBenchmarks({ only: /desired/, skip: /exceptions/ });
Processing benchmark results
runBenchmarks() returns a Promise<BenchmarkRunResult>, so you can process
the benchmarking results yourself. It contains detailed results of each
benchmark's run as BenchmarkResult s.
runBenchmarks()
.then((results: BenchmarkRunResult) => {
console.log(results);
})
.catch((error: Error) => {
// ... errors if benchmark was badly constructed
});
Processing benchmarking progress
runBenchmarks() accepts an optional progress handler callback function, so you
can get information on the progress of the running benchmarking.
Using { silent: true } means you wont see the default progression logs in the
commandline.
runBenchmarks({ silent: true }, (p: BenchmarkRunProgress) => {
// initial progress data
if (p.state === ProgressState.BenchmarkingStart) {
console.log(
`Starting benchmarking. Queued: ${p.queued.length}, filtered: ${p.filtered}`
);
}
// ...
});
Benching API
bench(benchmark: BenchmarkDefinition | BenchmarkFunction): void
Registers a benchmark that will be run once runBenchmarks is called.
runBenchmarks(opts?: BenchmarkRunOptions, progressCb?: (p: BenchmarkRunProgress) => void | Promise<void>): Promise<BenchmarkRunResult>
Runs all registered benchmarks serially. Filtering can be applied by setting
BenchmarkRunOptions.only and/or BenchmarkRunOptions.skip to regular
expressions matching benchmark names. Default progression logs can be turned off
with the BenchmarkRunOptions.silent flag.
clearBenchmarks(opts?: BenchmarkClearOptions): void
Clears all registered benchmarks, so calling runBenchmarks() after it wont run
them. Filtering can be applied by setting BenchmarkRunOptions.only and/or
BenchmarkRunOptions.skip to regular expressions matching benchmark names.