Download - Tests in Javascript using Jasmine and Testacular

Transcript
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!