Best Practices
@be_mannBrian Mann
• Organizing Tests
• Writing Tests
• Logging In
• Controlling State
What is Cypress?
First Commit
June 5th, 2014
Today
Public Beta
Oct 9th, 2017
gothinkster/realworld
https://demo.realworld.io
“…a medium.com clone”
Organizing Tests
header_spec.jsƭ
Not Logged In
Logged In
login_spec.jsƭ
Login
http://BASE_URL/#/login
register_spec.jsƭ
Register
http://BASE_URL/#/register
settings_spec.jsƭ
Settings
http://BASE_URL/#/settings
Log out
articles_spec.jsƭ
Articles
Tags
http://BASE_URL/#/
article_spec.jsƭ
Article
http://BASE_URL/#/article/:slug
Comments
author_spec.jsƭ
Author
http://BASE_URL/#/@:author
?
new_article_spec.jsƭ
New Article
http://BASE_URL/#/editor
• View Articles
• View Article
• View Author
• View Comments
• Log In
• Register
Logged InNot Logged In
• Settings
• Log Out
• Create Article
• Edit Article
• Delete Article
• Favorite Articles
• Create Comments
• Delete Comments
Logging In
Edit Article
Delete Article
Favorite Article
Settings
Log Out Create Comment
Delete Comment
Create Article
View Article
View Comment
Register Log InServer
Database
Strategies
1
Stub Requests Control the network
- cy.server()
- cy.route()
- Set status codes
- Set response bodies
- Test edge cases (empty views / 500)
Fast, Easy, Flexible
No Server / DB
Not True E2E
Requires Fixtures
Strategies
1
Stub Requests
Fast, Easy, Flexible
No Server / DB
Not True E2E
Requires Fixtures
2
Static User
Shared User + Credentials
- OAuth Login (Github / Google)
- Pre-seeded Databases
- joe@example.com / joe
Strategies
1
Stub Requests
Fast, Easy, Flexible
No Server / DB
Not True E2E
Requires Fixtures
2
Static User
Real Session E2E
Shares Test State
Seed the DB
Requires Server
Strategies
1
Stub Requests
Fast, Easy, Flexible
No Server / DB
Not True E2E
Requires Fixtures
2
Static User
Real Session E2E
Shares Test State
Seed the DB
Requires Server
3
Dynamic User
New User for each Test
- Modify DB within Tests
- Query DB within Tests
Strategies
1
Stub Requests
Fast, Easy, Flexible
No Server / DB
Not True E2E
Requires Fixtures
2
Static User
Real Session E2E
Shares Test State
Seed the DB
Requires Server
3
Dynamic User
No State Mutations
Slow / Complex
DB Setup / Teardown
Flexible / Powerful
Organizing
Tests
cypress
integration
ƭ login_spec.js 100% Confidence
Login Steps
Settings
Settings
Brittle Selectors
Abstraction
Reusable
Decoupled
What’s needed?
Duplicated Code
Settings
cypress
integration
ƭ login_spec.js
ƭ settings_spec.js
support
ƭ index.js
ƭ commands.js
settings_spec.js
login_spec.js
support/index.js
support/commands.js
Settings
Commands (7 of 9)
Failed at testing in isolation
Settings
Commands (7 of 9)
Failed at testing in isolation
Added 0% more confidence
ƭ login_spec.js 100% Confidence
Settings
Commands (7 of 9)
Accounted for 75% of the duration
Failed at testing in isolation
Added 0% more confidence
1. onFormSubmit
2. Reads form values
1. onFormSubmit
2. Reads form values
3. POST /api/users/login
Request
1. onFormSubmit
2. Reads form values
3. POST /api/users/login
4. Success: Save Token
Response
1. onFormSubmit
2. Reads form values
3. POST /api/users/login
4. Success: Save Token
5. On load, check for token
Best Practices
Don’t use the UI to build up state
Set state directly / programmatically
Don’t use page objects to share UI knowledge
Write specs in isolation, avoid coupling
Don’t limit yourself trying to act like a user
You have native access to everything
No Constraints
•Control Time: cy.clock()
•Stub Objects: cy.stub()
•Modify Stores: cy.window()
Redux Store
docs.cypress.io
www.cypress.io

Cypress - Best Practices