Testing and Continuous Integration
Cory House
@housecor bitnative.com
Here’s the Plan JavaScript testing styles
6 key testing decisions
Configure testing and write test
Continuous integration
JavaScript Testing Styles
Style Focus
Unit Single function or module
Integration Interactions between modules
UI Automate interactions with UI
Unit Testing Decisions
1 2 3
Framework Assertion Library Helper Libraries
4 5 6
Where to run tests Where to place tests When to run tests
Decision #1:
Testing Framework
Testing Frameworks
Mocha Jasmine Tape
QUnit AVA Jest
It’s Like Choosing a Gym
The important part is showing up.
Right Answer Wrong Answer
Woah, decision fatigue!
I’ll just keep coding
and praying.
Any of these!
Decision #2:
Assertion Library
What’s An Assertion?
Declare what you expect
expect(2+2).to.equal(4)
assert(2+2).equals(4)
Assertion Libraries
Decision #3:
Helper Library
JSDOM
Simulate the browser’s DOM
Run DOM-related tests without a browser
Cheerio
jQuery for the server
Query virtual DOM using jQuery selectors
Decision #4:
Where to Run Tests
Where to Run Tests
Browser
- Karma, Testem
Headless Browser
- PhantomJS
In-memory DOM
- JSDOM
Decision #5:
Where do test files belong?
Where Do Test Files Belong?
Centralized Alongside
Less “noise” in src folder Easy imports
Deployment confusion Clear visibility
Inertia Convenient to open
No recreating folder structure
Easy file moves
Path to file under test is always ./filename
// file.test.js // file.test.js
import file from '../../src/long/path' import file from './file'
Naming Test Files
Decision #6:
When should tests run?
Unit Tests Should Run When You Hit Save
Rapid feedback
Facilitates TDD
Automatic = Low friction
Increases test visibility
But Cory, my tests
are too slow!
- You, my viewer with slow tests
Unit Tests Integration Tests
Test a small unit Test multiple units
Often single function Often involves clicking and waiting
Fast Slow
Run upon save Often run on demand, or in QA
Here’s the Plan
1 2 3
Framework Assertion Library Helper Libraries
Mocha Chai JSDOM
4 5 6
Where to run tests Where to place tests When to run tests
Node Alongside Upon save
Demo
Configure automated testing
Continuous Integration
Weird.
Works on my
- Developer without a CI server
machine.
Why CI?
Forgot to commit new file
Forgot to update package.json
Commit doesn’t run cross-platform
Node version conflicts
Bad merge
Didn’t run tests
Catch mistakes quickly
What Does a CI Server Do?
Run Automated build
Run your tests
Check code coverage
Automate deployment
Continuous Integration
Travis Appveyor Jenkins
Demo
Set up Continuous Integration
Testing frameworks
- Mocha, Jasmine, AVA, Tape, Jest…
Assertion libraries
- Chai, Expect
Wrap Up
Helper libraries
- JSDOM, Cheerio
Where to run tests
- Browser, Headless, In memory
Where to place tests, and when to run
Continuous Integration
- Travis CI, Appveyor, Jenkins
Next up: HTTP and Mock APIs