# What is a test?

A test is code that throws an error when the actual result of something does not match the expected output.

``````const sum = (a, b) => a + b;
const subtract = (a, b) => a - b;

let result, expected;

result = sum(3, 7);
expected = 10;
if (result !== expected) {
throw new Error(`\${result} is not equal to \${expected}`);
}

result = subtract(7, 3);
expected = 4;
if (result !== expected) {
throw new Error(`\${result} is not equal to \${expected}`);
}
``````

The `actual !== expected` part is called an assertion. The above custom tests code could be rewritten as a real test that could be run with Jest.

File: tests/test-introdution/base.test.js

``````const sum = (a, b) => a + b;
const subtract = (a, b) => a - b;

test("Should sum", () => {
expect(sum(3, 7)).toEqual(10);
});
test("Should subtract", () => {
expect(subtract(7, 3)).toEqual(4);
});
``````

the output generated by Jest is the following:

`````` PASS  tests/test-introdution/base.test.js
✓ Should sum (1ms)
✓ Should subtract

Test Suites: 1 passed, 1 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        0.08s, estimated 1s
``````

If you'd like to run it on your local machine, follow the instructions of the guide.

Note that, usually, the testing frameworks allow you to write the test using the global `test()` or `it()` functions. The tests are usually grouped in `describe` (or `context`, again, it depends on the framework) functions

File: tests/test-introdution/describe.test.js

``````const sum = (a, b) => a + b;
const subtract = (a, b) => a - b;

describe("Math operations", () => {
test("Should sum", () => {
expect(sum(3, 7)).toEqual(10);
});
test("Should subtract", () => {
expect(subtract(7, 3)).toEqual(4);
});
});
``````
`````` PASS  tests/test-introdution/describe.test.js
Math operations
✓ Should sum (1ms)
✓ Should subtract

Test Suites: 1 passed, 1 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        0.072s, estimated 1s
``````

When you need to run only a particular test or skip some of them, you can call the `test.only()` of `test.skip()` utilities

File: tests/test-introdution/only.test.js

``````const sum = (a, b) => a + b;
const subtract = (a, b) => a - b;

describe("Math operations", () => {
test.only("Should sum", () => {
expect(sum(3, 7)).toEqual(10);
});
test("Should subtract", () => {
expect(subtract(7, 3)).toEqual(4);
});
});
``````
`````` PASS  tests/test-introdution/only.test.js
Math operations
✓ Should sum (2ms)
○ skipped Should subtract

Test Suites: 1 passed, 1 total
Tests:       1 skipped, 1 passed, 2 total
Snapshots:   0 total
Time:        0.066s, estimated 1s
``````

File: tests/test-introdution/skip.test.js

``````const sum = (a, b) => a + b;
const subtract = (a, b) => a - b;

describe("Math operations", () => {
test.skip("Should sum", () => {
expect(sum(3, 7)).toEqual(10);
});
test("Should subtract", () => {
expect(subtract(7, 3)).toEqual(4);
});
});
``````
`````` PASS  tests/test-introdution/skip.test.js
Math operations
✓ Should subtract (1ms)
○ skipped Should sum

Test Suites: 1 passed, 1 total
Tests:       1 skipped, 1 passed, 2 total
Snapshots:   0 total
Time:        0.066s, estimated 1s
``````

You can even run some common operations leveraging the `before`, `after`, `beforeEach`, and `afterEach` function hooks

File: tests/test-introdution/after-each.test.js

``````const sum = (a, b) => a + b;
const subtract = (a, b) => a - b;

describe("Math operations", () => {
let i = 0;
afterEach(() => {
i++;
console.log(`\${i} tests run`);
});
test("Should sum", () => {
expect(sum(3, 7)).toEqual(10);
});
test("Should subtract", () => {
expect(subtract(7, 3)).toEqual(4);
});
});
``````
``````PASS  tests/test-introdution/after-each.test.js
Math operations
✓ Should sum (1ms)
✓ Should subtract (1ms)

console.log tests/test-introdution/after-each.test.js:8
1 tests run

console.log tests/test-introdution/after-each.test.js:8
2 tests run

Test Suites: 1 passed, 1 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        0.311s, estimated 1s
``````

Author: Stefano Magni