Client side testing
About myself
- Jolt's CTO (www.jolt.us)
- Former software engineer at Wix.com
- Client side & server side developer
- Love Javascript, Java and Scala
This talk is NOT about
- TDD
- Angular / React / Any specific framework
- QA
- Everything about testing
What this talk is about
- Better architecture
- Good testing = better night sleep
- Easier to work together as a group
- Faster context switching
- Self documenting code
- Shorter feedback loop - faster detection of code smells
Domain
Application
Framework
Adapters
How
to
test?
Unit tests
Integration
tests
End-to-end
test
Domain
Application
Framework
Adapters
End 2 end
tests
automating
​user stories
browser
.signup({email, password})
.logout()
.assert.visible('.login')
.login({email, password:'wrong pass'})
.waitForElementVisible('.error', 5000)
.assert.containsText('.error', 'Wrong password')
.login({email, password})
.waitForUrlChange({timeout: 5000})
.assert.urlContains('/dashboard')
.assert.visible('.logout')
.end();
Tools
Selenium
Phantom Js
Nightwatch
docker
About E2E tests
- S-l-o-w...
- Breaks easily
- Should only test common user stories
- Test a complete interaction
- Requires to setup a whole system to test against
Unit
tests
describe("camel case",()=>{
it("convert 'camel case' to 'camelCase'", ()=>{
/* given */
var caser = new Caser();
/* when */
var answer = caser.toCamelCase('hello world');
/* then */
assertThat(answer, equalTo('helloWorld'))
})
})
describe("camel case",()=>{
it("convert `camel case` to `camelCase`", ...)
it("convert `Camel Case` to `camelCase`", ...)
it("convert `CamelCase` to `camelCase`", ...)
it("convert `camel-case` to `camelCase`", ...)
it("convert `camel_case` to `camelCase`", ...)
})
/* returns `undefined` */
messageSender.sendMessage("foo bar");
Dependents
Data providers
Action dispatchers
Mocks
Stubs
fakes a response from a dependent instance
tests if an expected call was made to a dependent instance
"given" phase
"then" phase
describe("MessagesSender",()=>{
it("should send a message", ()=>{
var server = Mock(ServerApi);
/* given */
var ms = new MessagesSender(server);
/* when */
ms.sendMessage("foo bar");
/* then */
assertThat(server.postMsg, wasCalledWith("foo%20bar"))
})
})
describe("MessagesSender",()=>{
it("should fail if server returns 404", ()=>{
var server = Stub(ServerApi);
/* given */
whenCalled(server.get).returns({statusCode:404});
var ms = new MessagesSender(server);
/* when */
var res = ms.sendMessage("foo bar");
/* then */
assertThat(res, hasProperty('error',"404 NOT FOUND"))
})
})
Data providers?
Action dispatchers
Stub
Mock
testing
YOUR
application
it("should render todo items", () => {
/* given */
var provider = Stub(TodoListProvider);
provider.getTodos.returns(Promise.resolve([t1,t2,t3])
/* when */
var instance = shallow(
<TodoList provider={provider} />
);
/* then */
assertThat(instance.find(TodoItem), hasSize(3));
});
About unit tests
- Test one unit a time
- Run super fast
- Most of the tests should be unit tests
- Tests functionality and code branching
- Uses mocks and stubs
Tools
Mocha
Sinon
Hamjest
Chai
Integration
tests
var messagesStore =
new MessagesStore("http://localhost:8080");
// how to test this?!
messagesStore.postMessage("hello world")
Adapters
My
system
Not my
system
making sure the contract is intact
Integration with the server
Integration with the DOM
3rd party components
other libraries
it("should save messages", () => {
// given
var messagesStore =
new MessagesStore("http://localhost:8080");
// when
return messagesStore.postMessage("hello world")
.then(()=> messagesStore.getMessage())
.then(messages=> {
assertThat(messages, hasSize(1));
assertThat(messages[0], equalsTo("hello world");
})
});
About integration tests
- Testing integration with an outside system
- test against a real system
- Can be slow
- May break when your dependencies changes
- Will find bugs between difference products
Tools
Karma
Request
JQuery
enzyme
Jasmine
RECAP
Unit tests
Integration
E2E
Q's?
A's!
Client side testing
By nadav
Client side testing
- 1,281