YOU ARE DOWNLOADING DOCUMENT

Please tick the box to continue:

Transcript
Page 1: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Desenvolvimento de aplicativos híbridos

Page 2: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Wennder dos Santos• Software developer

• Microsoft MVP

• Escreve no blog http://wenndersantos.net

• Publica vídeos em https://youtube.com/wenndersantos

• Slides em http://slideshare.net/wenndersantos

• Github https://github.com/wenndersantos

• @wenndersantos

Page 3: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Agenda dia 21. Automatize tudo• Gulp• Escrevendo as primeiras tasks

2. Testes automatizados (Testes de unidade)• Por quê você não escreve testes?• Jasmine• Escrevendo um teste• Karma• Por quê é importante escrever testes?

https://github.com/WennderSantos/curso-apps-hibridos

Page 4: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Agenda dia 23. Testes de unidade não são os únicos• Testes de UI• Xamarin UI Test• Escrevendo testes de UI

4. Xamarin test cloud• O problema da quantidade de devices • Teste seu app em 2000 dispositivos reais

https://github.com/WennderSantos/curso-apps-hibridos

Page 5: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Agenda dia 25. Continous integration• Git• Visual Studio Team Services (VSTS)• Criando um build automatizado

6. Continous distribution• HockeyApp• VSTS, HockeyApp e o release contínuo• Configurando um release contínuo

https://github.com/WennderSantos/curso-apps-hibridos

Page 6: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Agenda dia 27. Do desenvolvimento à store• Assinando o app• Publicando na play store

https://github.com/WennderSantos/curso-apps-hibridos

Page 7: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

1 – Automatize tudo

Page 9: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Gulp

npm i -g gulp

Page 10: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Gulp – Dentro da pasta do projeto

npm i --save-dev gulp

Page 11: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Gulp – Gulpfile

Crie um arquivo com nome gulpfile.js na raiz do projeto

Page 12: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Gulp – Primeira task: Compilar sass

npm i --save-dev gulp-sass

Page 13: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Gulp – Primeira task: Compilar sass

var gulp = require('gulp');var sass = require('gulp-sass');

Page 14: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Gulp – Primeira task: Compilar sassgulp.task('sass', function () { gulp.src('./scss/ionic.app.scss') .pipe(sass()) .pipe(gulp.dest('./www/css/'))});

Page 15: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Gulp – Executando a task

Digite o seguinte comando em seu terminal:

gulp sass

Page 16: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Gulp – Task default

gulp.task('default', ['sass']);

Page 17: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Gulp – Executando a task default

Digite o seguinte comando em seu terminal:

gulp

Page 18: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

2 – Testes automatizados(Testes de unidade)

Page 19: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Por quê você não escreve testes?

•Não dá tempo•Não vejo vantagem•Não sei como fazer

Page 20: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

• Testes de unidade• Feedback rápido• Garantem que uma regra de negócio funciona como esperado• Segurança para evoluir o código

Por quê é importante escrever testes?

Page 21: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Fazer isso é fácildescribe('Service: calculadoraService', function () { var calculadoraService;

beforeEach(module(app'));

beforeEach(inject(function (_calculadoraService_) { calculadoraService = _calculadoraService_; }));

it('deve retornar 2 quando calcular 2 + 2', function () { expect(calculadoraService.soma(2,2)).toBe(2); });});

Page 22: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Vamos escrever um teste para você ver que

é fácil mesmo.

Page 23: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

ionic create teste-unidade blank

cd ionic teste-unidade

Crie um projeto

Page 24: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Configure o ambiente para rodar os testes

Page 25: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

http://jasmine.github.io/

Page 26: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Jasmine

npm i --save-dev jasmine

Page 27: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Serviço que será testado – www/js/services/calculadoraService.js

(function () { angular .module('starter') .factory('calculadoraService', calculadoraService);

function calculadoraService() {

return { soma: soma };

function soma(numero1, numero2) { return numero1 + numero2; } }})();

Page 28: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

O Teste – www/js/services/calculadoraService.spe

c.js(function () { describe('Service: calculadoraService', function () {

var calculadoraService;

beforeEach(module('starter'));

beforeEach(inject(function (_calculadoraService_) { calculadoraService = _calculadoraService_; }));

it('soma deve retorna 2 quando somar 1 + 1', function () { expect(calculadoraService.soma(1, 1)).toBe(2); });

});})();

Page 29: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

https://karma-runner.github.io/1.0/index.html

Page 30: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Karma

npm -g karma-cli

npm i --save-dev karma

Page 31: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Karma – Criar o arquivo de configuração (karma.conf.js)

karma init

Page 32: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Karma – Arquivos necessários para executar os testes

• Ionic e suas denpedências• Angular mocks• Arquivos que serão testados• Arquivos de testes

Page 33: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Angular mocks

npm i --save-dev angular-mocks

https://docs.angularjs.org/api/ngMock

Page 34: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Karma – Arquivos necessários para executar os testes

files: [ 'www/lib/ionic/js/ionic.bundle.min.js', 'node_modules/angular-mocks/angular-mocks.js', 'www/js/**/*.js' ]

Dentro do arquivo karma.conf.js, adicione:

Page 35: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Karma – Executar os testes

karma start

Page 36: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Rodar os testes através do Gulp – Instalando o modulo gulp-karma

npm i --save-dev gulp-karma

Page 37: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Rodar os testes através do Gulp – Criando a task

var gulp = require('gulp');var Server = require('karma').Server;

gulp.task('run-test', function () { new Server({ configFile: __dirname + '/karma.conf.js', singleRun: true }).start();});

Page 38: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Rodar os testes através do Gulp

gulp run-test

Page 39: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

GitHub com o exemplo

https://github.com/WennderSantos/demo-teste-unidade-app-hibrido

Page 40: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Por quê é importante escrever testes?

Page 41: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

“Todo código escrito sem teste é um possível bug.”

Por quê é importante escrever testes?

Page 42: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Por quê é importante escrever testes?Multiplataforma

Page 43: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Maiores frustrações de usuários

Maiores frustrações0%

10%

20%

30%

40%

50%

60%

70%

80% 76%71%

59%

Maiores frustrações de usuários com aplicativos mobileTravamentos Crashes Lento/não-responsivo

http://apigee.com/about/press-release/apigee-survey-users-reveal-top-frustrations-lead-bad-mobile-app-reviews

Page 44: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

O que os usuários fazem

Ações tomadas0%

5%

10%

15%

20%

25%

30%

35%

40%

45%

50%44%

38%

32%

21%

Ação tomada a respeito de um aplicativo ruimDeletam o app imediatamente Deletam o app se ele trava por mais de 30 seg.Conta para amigos o quão ruim o app é Compartilha em redes sociais o quão ruim o app é

http://apigee.com/about/press-release/apigee-survey-users-reveal-top-frustrations-lead-bad-mobile-app-reviews

Page 45: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Desafios de apps multiplataforma com qualidade• 75% dos usuários não utilizam o app depois do primeiro

dia

https://www.appboy.com/blog/app-customer-retention-spring-2016-report/

Page 46: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Testes de unidade não são os únicos• Testes de unidade não garantem a cobertura de todas as partes do seu sistema

Quantidade de testes por tipo

Page 47: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

TESTES DE UI

Page 48: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Como escrever os testes de UI de maneira automatizada?

Page 49: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Xamarin UITest•Framework para escrita de testes de UI em C#•Acesso a recursos do dispositivo•Gestos e ações•Manipula elementos na tela

Page 50: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Como escrever testes de UI com o Xamarin UI Test?• Abra o Visual Studio• File >> New project >> Blank solution • Add project >> Javascript >> Apache Cordova Apps >>

Ionic Tabs Template• Add project >> Visual C# >> Test >> UI Test APP

(Xamarin.UITest | Android)

Page 51: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

No projeto de testes• Instale o pacote FluentAssertions

• Abra o arquivo Tests.cs

Page 52: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Informe aonde está o apk do app

[SetUp] public void BeforeEachTest() { app = ConfigureApp .Android .ApkFile("../../../DemoUiTest.Aplicativo/platforms/android/build/outputs/apk/android-debug.apk") .StartApp(); }

Page 53: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Escreveremos testes para os seguintes cenários• Usuário deve conseguir navegar para tela Chats• Usuário deve conseguir navegar para tela Accounts• Usuário deve conseguir desativar amigos• Usuário deve conseguir clicar no primeiro elemento

da lista

Page 54: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Usuário deve conseguir navegar para tela Chats

[Test] public void DeveNavegarParaTelaChats() { NavegarParaTelaChats(); var title = app.WaitForElement(x => x.WebView().Css("ion-header-bar .title")); title.FirstOrDefault().TextContent.Should().Be("Chats"); }

private void NavegarParaTelaChats() { app.Tap(x => x.WebView().Css(".tab-item").Index(1)); }

Page 55: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Usuário deve conseguir navegar para tela Accounts

[Test] public void DeveNavegarParaTelaAccounts() { NavegarParaTelaAccounts(); var title = app.WaitForElement(x => x.WebView().Css("ion-header-bar .title"));

title.FirstOrDefault().TextContent.Should().Be("Account"); }

private void NavegarParaTelaAccounts() { app.Tap(x => x.WebView().Css(".tab-item").Index(2)); }

Page 56: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Usuário deve desativar amigos [Test] public void DeveDesativarAmigos() { NavegarParaTelaAccounts();

app.Tap(x => x.WebView().Css(".toggle")); var labelFriends = app.WaitForElement(x => x.WebView() .Css(".enableFriends span.ng-binding")).FirstOrDefault().TextContent;

labelFriends.Should().Contain("Enable Friends"); }

Page 57: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Usuário deve conseguir clicar no primeiro elemento da lista

[Test] public void DeveClicarNoPrimeiroElementoDaLista() { NavegarParaTelaChats();

app.Tap(x => x.WebView().Css(".item:first-of-type"));

var title = app.WaitForElement(x => x.WebView().Css(".title.title-left.header-item")).FirstOrDefault().TextContent;

title.Should().Be("Ben Sparrow"); }

Page 58: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

GitHub com o exemplo

https://github.com/WennderSantos/demo-teste-ui-app-hibrido

Page 59: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

UI Tests em todos dispositivos?

Page 60: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

UI Tests em todos dispositivos?

http://www.idownloadblog.com/2013/07/30/the-terrible-state-of-android-fragmentation/

Page 61: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Xamarin Test Cloud

https://www.xamarin.com/test-cloud

Page 62: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Xamarin Test Cloud•Dispositivos reais•Testes automatizados em quantos dispositivos precisar•Dispositivos de várias marcas e modelos•Resultado com logs e fotos

Page 63: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

2000+ dispositivos reais

Page 64: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

CONTINUOUS INTEGRATION

http://martinfowler.com/articles/continuousIntegration.html

Page 65: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

https://git-scm.com/

Page 66: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

https://www.visualstudio.com/pt-br/products/visual-studio-team-services-vs.aspx

Page 67: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Criando uma build de Continuous Integration

Page 68: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Criando uma build de Continuous Integration

• Abra seu Visual Studio Team Services (VSTS)• Crie um novo projeto com o templa Agile usando

o Git com controle de versão• Envie seu repositório local para o VSTS• Entre na Build e vamos começar uma nova

definição de build

Page 69: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Criando uma build de Continuous Integration

• Clique no botão “New definition” e escolha o template “Empty”• Check o flag de “Contiuous integration”

Page 70: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Adicionando os steps que serão executados na build

• Npm (install)• Gulp (task bower)• Gulp (task run-test)• Cordova build (https://

marketplace.visualstudio.com/items?itemName=ms-vsclient.cordova-extension)

Page 71: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

CONTINUOUS DISTRIBUTION

Page 72: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

https://hockeyapp.net/

Page 73: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

VSTS + HockeyApphttps://marketplace.visualstudio.com/items?itemName=ms.hockeyapp

Page 74: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

HockeyApp – Integrando com VSTS• Acesse sua conta no HockeyApp• Account Settings e crie uma API Token com Full

Access• Entre no VSTS >> Team Settings e Adicione um

Service Endpoint do HockeyApp• Informe um nome e Api token que foi criada.

Page 75: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Continuous distribution• Na build de CI que criamos, adicione o step Copy

Publish Artifact

• No parâmetro “Content” use o minimach **\apk\android-debug.apk

Page 76: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Criando o release automático• Ainda no VSTS, entre na aba release• Crie uma nova empty definition• Selecione o nome da build que criamos há pouco e

check o flag de continuous deployment• Adicione uma task do HockeyApp

Page 77: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

DO DESENVOLVIMENTO À STORE

Page 78: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

ASSINANDO UM APP• Gerar uma keystore (%JAVA_HOME%\keytool -genkey -

v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000)

Page 79: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

ASSINANDO UM APP

https://github.com/WennderSantos/sign-android-windows

Faça o download dos arquivos desse repositório

Page 80: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

ASSINANDO UM APP• Coloque a Keystore e os aquivos .cmd em uma pasta

dentro da raiz do projeto.• Execute o arquivo droi-release.cmd• Informe a senha que foi colocada na criação do

Keystore

Page 81: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

COMO SUBMETER O APP PARA A PLAY STORE?

Page 82: Curso: Desenvolvimento de aplicativos híbridos (dia 2)

Wennder dos [email protected]

@wenndersantos


Related Documents