Tests in Javascript using Jasmine and Testacular

36
Dev in Bahia 1º First Technical Meeting

description

How and why to write tests in javascript. Jasmine, Testacular.

Transcript of Tests in Javascript using Jasmine and Testacular

Page 1: Tests in Javascript using Jasmine and Testacular

Dev in Bahia 1º First Technical Meeting

Page 2: Tests in Javascript using Jasmine and Testacular

What is Dev In Bahia ?• Borned in 2012 through the #horaextra.

• Has the vision to transform our local IT Market in a better place to work and to develop ourselves as IT Professionals.

• What we do ?• Promote Events, Discussions, User groups and so on.

Page 3: Tests in Javascript using Jasmine and Testacular

Technical Meetings• We are trying to promete one since last year.

• Prevented by:• Place• People• Schedule

• We want to promote a technical meeting once or twice a month.

• Tech Talk + Coding Dojo

• Before each meeting, people will send talk suggestions and we are going to vote to choose.

Page 4: Tests in Javascript using Jasmine and Testacular

Who is Paulo Ortins ?• Developer at Inteligência Digital• Masters Student at UFBA ( Software Engineering)• Blogger at www.pauloortins.com• Newsletter Curater at dotnetpills.apphb.com

• Joined in the community in 2011• Polyglot Programmer• Founded Dev In Bahia and #horaextra

Twitter: @pauloortinsGithub: pauloortins

Page 5: Tests in Javascript using Jasmine and Testacular

1º Technical Meeting• How create tests using Javascript ?

Page 6: Tests in Javascript using Jasmine and Testacular

A test overview

• Monkey Tests

• Unit Tests

• End-to-End Tests

Page 7: Tests in Javascript using Jasmine and Testacular

Monkey Tests

Page 8: Tests in Javascript using Jasmine and Testacular

But Requirements Change

Page 9: Tests in Javascript using Jasmine and Testacular

You do it again

Page 10: Tests in Javascript using Jasmine and Testacular

Monkey Test [2]

Page 11: Tests in Javascript using Jasmine and Testacular

But Requirements Change[2]

Page 12: Tests in Javascript using Jasmine and Testacular

Monkey Test Division

Page 13: Tests in Javascript using Jasmine and Testacular

Problems with Monkey Tests• Low Reliability, people aren’t machines, they work has

variance.

• Expensive, people have to test the software everytime something changes.

Page 14: Tests in Javascript using Jasmine and Testacular

Super Kent Beck

Page 15: Tests in Javascript using Jasmine and Testacular

Automated Tests

• Tests should be automated.

• Functionality are done if, and only if, there are automated tests covering them.

Page 16: Tests in Javascript using Jasmine and Testacular

Unit Tests• Tests only a piece of code.

• Provide instantly feedback about our software.

• Help to improve code design.

Page 17: Tests in Javascript using Jasmine and Testacular

Example

function isBetweenFiveAndTen(number) {var isGreaterThanFive = number > 5;var isLesserThanTen = number < 10;

return isGreaterThanFive && isLesserThanTen;}

Input Output

5 False

6 True

7 True

10 False

Page 18: Tests in Javascript using Jasmine and Testacular

End-to-end Tests• Tests simulate a monkey test, covering browser interaction,

database access, business rules.

• Slower than unit tests.

• Let me show a example using Selenium WebDriver

Page 19: Tests in Javascript using Jasmine and Testacular

Javascript• Javascript is rising.

• Web more interactive and responsive.

• Applications like Facebook and Gmail.

• Web Apps ( PhoneGap, Ext.js, jquery mobile)

Page 20: Tests in Javascript using Jasmine and Testacular

Unit tests in Javascript• There are several options to create unit tests in Javascript:• Qunit• Mocha• Jasmine

Page 21: Tests in Javascript using Jasmine and Testacular

Jasmine• Created due the dissatisfaction existing framworks by

PivotalLabs.

• Small library

• Easy to use

Page 22: Tests in Javascript using Jasmine and Testacular

Suitesdescribe("A suite", function() {

it("contains spec with an expectation", function() { expect(true).toBe(true);

}); });

• Describe, name a test suite ou a set test.

• It, describe the test name.

Page 23: Tests in Javascript using Jasmine and Testacular

Expectations

describe("The 'toBe' matcher compares with ===", function() { it("and has a positive case ", function() { expect(true).toBe(true); }); it("and can have a negative case", function() { expect(false).not.toBe(true); });});• Comparisons made through matchers, who are predefined

functions who receives a value (actual) and compares with the expected value.

• A lot of matchers are included.

Page 24: Tests in Javascript using Jasmine and Testacular

Matchersdescribe("The 'toEqual' matcher", function() {

it("works for simple literals and variables", function() { var a = 12; expect(a).toEqual(12); });

it("should work for objects", function() { var foo = { a: 12, b: 34 }; var bar = { a: 12, b: 34 }; expect(foo).toEqual(bar); });});

Page 25: Tests in Javascript using Jasmine and Testacular

Matchers

it("The 'toMatch' matcher is for regular expressions", function() { var message = 'foo bar baz';

expect(message).toMatch(/bar/); expect(message).toMatch('bar'); expect(message).not.toMatch(/quux/);});

Page 26: Tests in Javascript using Jasmine and Testacular

Matchers

it("The 'toBeDefined' matcher compares against `undefined`", function() { var a = { foo: 'foo' };

expect(a.foo).toBeDefined(); expect(a.bar).not.toBeDefined();});

Page 27: Tests in Javascript using Jasmine and Testacular

Matchers

it("The 'toBeNull' matcher compares against null", function() { var a = null; var foo = 'foo';

expect(null).toBeNull(); expect(a).toBeNull(); expect(foo).not.toBeNull();});

Page 28: Tests in Javascript using Jasmine and Testacular

Matchersit("The 'toBeTruthy' matcher is for boolean casting testing", function() { var a, foo = 'foo';

expect(foo).toBeTruthy(); expect(a).not.toBeTruthy();});

it("The 'toBeFalsy' matcher is for boolean casting testing", function() { var a, foo = 'foo';

expect(a).toBeFalsy(); expect(foo).not.toBeFalsy();});

Page 29: Tests in Javascript using Jasmine and Testacular

Matchers

it("The 'toContain' matcher is for finding an item in an Array", function() { var a = ['foo', 'bar', 'baz'];

expect(a).toContain('bar'); expect(a).not.toContain('quux');});

Page 30: Tests in Javascript using Jasmine and Testacular

Matchers it("The 'toBeLessThan' matcher is for mathematical comparisons", function() { var pi = 3.1415926, e = 2.78;

expect(e).toBeLessThan(pi); expect(pi).not.toBeLessThan(e); });

it("The 'toBeGreaterThan' is for mathematical comparisons", function() { var pi = 3.1415926, e = 2.78;

expect(pi).toBeGreaterThan(e); expect(e).not.toBeGreaterThan(pi); });

it("The 'toBeCloseTo' matcher is for precision math comparison", function() { var pi = 3.1415926, e = 2.78;

expect(pi).not.toBeCloseTo(e, 2); expect(pi).toBeCloseTo(e, 0); });

Page 31: Tests in Javascript using Jasmine and Testacular

Matchers

it("The 'toThrow' matcher is for testing if a function throws an exception", function() { var foo = function() { return 1 + 2; }; var bar = function() { return a + 1; };

expect(foo).not.toThrow(); expect(bar).toThrow();});

Page 32: Tests in Javascript using Jasmine and Testacular

Custom Matchers

beforeEach(function() { this.addMatchers({ isEven: function(number) { return number % 2 === 0; } });});

Page 33: Tests in Javascript using Jasmine and Testacular

Setup/Teardowndescribe("A spec (with setup and tear-down)", function() { var foo;

beforeEach(function() { foo = 0; foo += 1; });

afterEach(function() { foo = 0; });

it("is just a function, so it can contain any code", function() { expect(foo).toEqual(1); });

it("can have more than one expectation", function() { expect(foo).toEqual(1); expect(true).toEqual(true); });});

Page 34: Tests in Javascript using Jasmine and Testacular

Let’s play with Jasmine• Site

• Tutorial

• Standalone Version

Page 35: Tests in Javascript using Jasmine and Testacular

Testacular/Karma• Created by Google to test Angular.js

• Runs on top of Node.js

• Watch our JS files to detect changes and rerun the tests

Page 36: Tests in Javascript using Jasmine and Testacular

Thank you!