dart power tools

58
Dart Power Tools Brad Rydzewski & Matt Norris @bradrydzewski @mattnorrisme

Upload: matt-norris

Post on 11-May-2015

912 views

Category:

Technology


0 download

DESCRIPTION

Increase the speed of Dart software delivery with unit testing, code analysis, headless browser testing, cross-browser and mobile testing, continuous integration, and automated deployments.

TRANSCRIPT

Page 1: Dart Power Tools

Dart Power ToolsBrad Rydzewski & Matt Norris

@bradrydzewski @mattnorrisme

Page 2: Dart Power Tools

Dart 1.0!

Page 4: Dart Power Tools

What will we learn?Build Dart appDatabase persistence TestDeploy

Language featuresToolsContinuous Integration

Page 5: Dart Power Tools

Client

Page 6: Dart Power Tools

Including Dartindex.html<html> ... <script type="application/dart” src="index.dart"></script>

<script src="packages/browser/dart.js"></script> ...</html>

Page 7: Dart Power Tools

Including Dartindex.html<html> ... <script type="application/dart” src="index.dart"></script>

<script src="packages/browser/dart.js"></script> ...</html>

Page 8: Dart Power Tools

Formindex.html...<input type="text" id="long_url" /><button id="btn">Shorten</button><a id="short_url” class="hidden"></a>...

index.dartvoid main() { querySelector("#btn") .onClick.listen(onClick);}...

Page 9: Dart Power Tools

Formindex.html...<input type="text" id="long_url" /><button id="btn">Shorten</button><a id="short_url” class="hidden"></a>...

index.dartvoid main() { querySelector("#btn") .onClick.listen(onClick);}...

Page 10: Dart Power Tools

Formindex.html...<input type="text" id="long_url" /><button id="btn">Shorten</button><a id="short_url” class="hidden"></a>...

index.dartvoid main() { querySelector("#btn") .onClick.listen(onClick);}...

Page 11: Dart Power Tools

Dart mainindex.html...<input type="text" id="long_url" /><button id="btn">Shorten</button><a id="short_url” class="hidden"></a>...

index.dartvoid main() { querySelector("#btn") .onClick.listen(onClick);}...

Page 12: Dart Power Tools

Attach listener to buttonindex.html...<input type="text" id="long_url" /><button id="btn">Shorten</button><a id="short_url” class="hidden"></a>...

index.dartvoid main() { querySelector("#btn") .onClick.listen(onClick);}...

Page 13: Dart Power Tools

index.dartvoid onClick(MouseEvent event) { HttpRequest request = new HttpRequest(); request.onReadyStateChange.listen((_) {

showText(request.responseText); });

... ... request.send();}

Page 14: Dart Power Tools

index.dartvoid onClick(MouseEvent event) { HttpRequest request = new HttpRequest(); request.onReadyStateChange.listen((_) {

showText(request.responseText); });

... ... request.send();}

Page 15: Dart Power Tools

index.dartvoid onClick(MouseEvent event) { HttpRequest request = new HttpRequest(); request.onReadyStateChange.listen((_) {

showText(request.responseText); });

... ... request.send();}

Page 16: Dart Power Tools

index.dartvoid onClick(MouseEvent event) { HttpRequest request = new HttpRequest(); request.onReadyStateChange.listen((_) {

showText(request.responseText); });

... ... request.send();}

Page 17: Dart Power Tools

Some sugarvoid showText(String hash) { var loc = window.location var url = "${loc.protocol}//${loc.host}/${hash}"; var urlShort = querySelector("#url_short") ..attributes["href"] = url ..text = url ..classes.remove("hidden");}

Page 18: Dart Power Tools

More sugar, please!void showText(String hash) { var loc = window.location var url = "${loc.protocol}//${loc.host}/${hash}"; var urlShort = querySelector("#url_short") ..attributes["href"] = url ..text = url ..classes.remove("hidden");}

Page 20: Dart Power Tools

I must have put a decimal point in the wrong place.I always mess up some mundane detail!

Page 21: Dart Power Tools

Client tests

Page 22: Dart Power Tools

test_index.dart import 'package:unittest/unittest.dart';import 'package:unittest/html_enhanced_config.dart';...main() { useHtmlEnhancedConfiguration();

test("url includes scheme", () { expect(isValidUrl(“www.yahoo.com”), false); expect(isValidUrl(“http://www.yahoo.com”), true); });

HTML unit test

Page 23: Dart Power Tools

test_index.dart import 'package:unittest/unittest.dart';import 'package:unittest/html_enhanced_config.dart';...main() { useHtmlEnhancedConfiguration();

test("url includes scheme", () { expect(isValidUrl(“www.yahoo.com”), false); expect(isValidUrl(“http://www.yahoo.com”), true); });

HTML unit test

Page 24: Dart Power Tools

test_index.dart import 'package:unittest/unittest.dart';import 'package:unittest/html_enhanced_config.dart';...main() { useHtmlEnhancedConfiguration();

test("url includes scheme", () { expect(isValidUrl(“www.yahoo.com”), false); expect(isValidUrl(“http://www.yahoo.com”), true); });

HTML unit test

Page 25: Dart Power Tools

HTML unit test

Page 26: Dart Power Tools
Page 27: Dart Power Tools

content_shell$ content_shell --dump-render-tree web/test_index.html

Content-Type: text/plainPASSAll 2 tests passedCollapse All

Page 28: Dart Power Tools

Server

Page 29: Dart Power Tools

Web frameworkserver.dartimport 'package:start/start.dart';

start(public: 'web', port: port).then((Server app) { app.post('/’).listen((request) { ... });});

Page 30: Dart Power Tools

Web frameworkserver.dartimport 'package:start/start.dart';

start(public: 'web', port: port).then((Server app) { app.post('/’).listen((request) { ... });});

Page 31: Dart Power Tools

server.dart void main() { ... app.post("/").listen((request) { String url = request.param('url'); String hash = toHash(url); client.set(hash, url).then((_)=>request.response.json(hash);); }); ...

Page 32: Dart Power Tools

server.dart void main() { ... app.post("/").listen((request) { String url = request.param('url'); String hash = toHash(url); client.set(hash, url).then((_)=>request.response.json(hash);); }); ...

Page 33: Dart Power Tools

server.dart void main() { ... app.post("/").listen((request) { String url = request.param('url'); String hash = toHash(url); client.set(hash, url).then((_)=>request.response.json(hash);); }); ...

Page 34: Dart Power Tools

server.dart void main() { ... app.post("/").listen((request) { String url = request.param('url'); String hash = toHash(url); client.set(hash, url).then((_)=>request.response.json(hash)); }); ...

Page 35: Dart Power Tools

server.dart void main() { ... app.get('/:hash').listen((request) { String hash = request.param('hash'); client.get(hash).then((val) => request.response.redirect(val)); }); ...

Page 36: Dart Power Tools

server.dart void main() { ... app.get('/:hash').listen((request) { String hash = request.param('hash'); client.get(hash).then((val) => request.response.redirect(val)); }); ...

Page 37: Dart Power Tools

server.dart void main() { ... app.get('/:hash').listen((request) { String hash = request.param('hash'); client.get(hash).then((val) => request.response.redirect(val)); }); ...

Page 38: Dart Power Tools

Server tests

Page 39: Dart Power Tools

server_tests.dartimport 'package:unittest/unittest.dart';import 'package:unittest/vm_config.dart';import 'server.dart' as server;

void main() { useVMConfiguration();

String URL = 'http://www.meetup.com/gdg-silicon-valley’;

test('HashURL', () { expect(server.toHash(URL), isNotNull); expect(server.toHash(URL), '287b6d95'); ...

Page 40: Dart Power Tools

server_tests.dartimport 'package:unittest/unittest.dart';import 'package:unittest/vm_config.dart';import 'server.dart' as server;

void main() { useVMConfiguration();

String URL = 'http://www.meetup.com/gdg-silicon-valley’;

test('HashURL', () { expect(server.toHash(URL), isNotNull); expect(server.toHash(URL), '287b6d95'); ...

Page 41: Dart Power Tools

server_tests.dartimport 'package:unittest/unittest.dart';import 'package:unittest/vm_config.dart';import 'server.dart' as server;

void main() { useVMConfiguration();

String URL = 'http://www.meetup.com/gdg-silicon-valley’;

test('HashURL', () { expect(server.toHash(URL), isNotNull); expect(server.toHash(URL), '287b6d95'); ...

Page 42: Dart Power Tools

Run the test$ dart server_tests.dart

PASS: HashURL

Page 43: Dart Power Tools

Deployment

Page 44: Dart Power Tools

Deployment$ heroku create

$ heroku addons:add redistogo

$ git push heroku

$ heroku config:add BUILDPACK_URL=...

Page 45: Dart Power Tools

How many OS/browser combos?

200+

Page 46: Dart Power Tools

Cross-browser testing

Page 47: Dart Power Tools

Dart + Seleniumbrowser_tests.dartvoid main() { ...

driver = WebDriver.createDriver( url: “http://localhost:4444/wd/hub”, desiredCapabilities: Capabilities.android);

...

Page 48: Dart Power Tools

Dart + Seleniumbrowser_tests.dartvoid main() {

...

test('integration test', (){ return driver.findElement(new By.id('url_long')) .then((elem)=>elem.sendKeys("https://www.dartlang.org/")) ...

.then((attr)=>expect(attr, "https://www.dartlang.org/")) ...

Page 50: Dart Power Tools

Continuous Integration

Page 51: Dart Power Tools

drone.iohttps://drone.io

Page 52: Dart Power Tools

Build Configurationimage: dartscript: - pub get - pub build - dart bin/server_test.dartdeploy: heroku: app: dart-demo

Page 53: Dart Power Tools

Build Configurationimage: dartscript: - pub get - pub build - dart bin/server_test.dartdeploy: heroku: app: dart-demo

Page 54: Dart Power Tools

Build Configurationimage: dartscript: - pub get - pub build - dart bin/server_test.dartdeploy: heroku: app: dart-demo

Page 55: Dart Power Tools

drone.iohttps://drone.io

Page 56: Dart Power Tools

What have we learned?✓ Built Dart app✓ Client & server✓ Database persistence ✓ Tested✓ Deployed

✓ Language features✓ Tools✓ Continuous Integration

Page 57: Dart Power Tools

What should you do?

Try DartTest thingsUse toolsDeploy!

Page 58: Dart Power Tools

Thank you!Questions?