Desafio técnico proposto pela XP Inc. (Tribo Bull) onde é simulada uma tela de histórico de ordens na bolsa de valores, renderizada para UWP e WPF utilizando Xamarin.Forms.
Ver problemas abertos
·
Reportar um problema
- Sobre este projeto
- Configurações do ambiente de desenvolvimento
- Estrutura da aplicação
- Execução da aplicação
- Teste de aumento de carga
- Testes unitários
- Análise de cobertura de código
- Análise de performance
- Licença
- Contato
Desafio composto pelas etapas abaixo:
- Criação da tela de histórico.
- A tela deve ser renderizada tanto em
UWP (Universal Windows Platform)
quanto emWPF (Windows Presentation Foundation)
, utilizandoXamarin.Forms
.
- A tela deve sofrer alterações constantes semelhante a execução de ordens na bolsa de valores.
- A cada
50 milissegundos
, incluir um item novo na lista e/ou modificar os itens existentes. - A tela deve refletir essa alteração.
- Simular momentos de aumento de carga, onde múltiplos itens da lista são alterados.
- A aplicação deve conter ao menos
80%
de cobertura de testes unitários.
- Gerar os relatórios de cobertura de código utilizando o
Coverlet
.
- Realizar uma análise de performance da aplicação, fazendo um comparativo entre
UWP
eWPF
, principalmente ao uso de processamento e memória.
Para obter uma cópia local atualizada e que possa ser executada corretamente, siga os passos abaixo.
- Visual Studio com os seguintes componentes inclusos na instalação:
- Desenvolvimento móvel com .NET
- Desenvolvimento com a Plataforma Universal do Windows
git clone https://github.com/ahcantarim/xpinc-xamarin-forms.git
A solução está dividida em quatro projetos, conforme imagem:
-
XPInc.Cantarim.UI.Mobile.CrossPlatform
: projeto cross-platform com alto nível de compartilhamento de código entre as plataformas alvo. -
XPInc.Cantarim.UI.Mobile.CrossPlatform.UWP
: projeto alvo para UWP (Universal Windows Platform). -
XPInc.Cantarim.UI.Mobile.CrossPlatform.WPF
: projeto alvo para WPF (Windows Presentation Foundation). -
XPInc.Cantarim.UI.Mobile.CrossPlatform.Test
: projeto para testes de unidade do código cross-platform.
Independente da plataforma alvo escolhida para execução, a aplicação terá o mesmo comportamento.
A cada 50 milissegundos é simulada uma alteração no histórico de ordens.
Nessa simulação, sorteia-se uma ação a ser realizada:
-
Incluir nova ordem: uma nova ordem aleatória é adicionada à listagem, com
Quantidade Executada
zerada. -
Alterar ordem existente: sorteia-se um número de ordens que serão alteradas e, para cada ordem sorteada, a
Quantidade Executada
é incrementada de forma aleatória. Ordens totalmente executadas (Quantidade Executada = Quantidade
) são removidas da listagem, enquanto ordens parcialmente executadas (Quantidade Executada < Quantidade
) continuam sendo exibidas, mas com valores atualizados em tela. -
Ambos: as ações anteriores são executadas mais vezes do que seriam comumente.
O método responsável por simular alterações no histórico de ordens, sorteia a quantidade de ordens que deverão ser modificadas na listagem.
Essa quantidade pode ser grande ou pequena e, para facilitar a análise, um log
foi escrito neste momento para exibir:
-
A quantidade atual de ordens no histórico;
-
A quantidade de ordens que deverão ser alteradas, com base no sorteio prévio;
-
A quantidade atualizada de ordens no histórico, desconsiderando ordens que após a alteração podem ter sido totalmente executadas;
Conforme imagem, nota-se que existem momentos em que a quantidade de ordens alteradas é relativamente grande quando comparada com a quantidade de ordens existentes, simulando assim um aumento na carga de processamento e na atualização da tela:
O projeto conta com testes unitários do MSTest
para garantir seu funcionamento em diversas situações.
Atualmente, todos os testes estão sendo executados com êxito, confirmando o resultado esperado:
Com base nos testes unitários escritos para validação do código, foi gerado o relatório de cobertura com o Coverlet
.
Atualmente, o projeto conta com uma cobertura de código de +92%:
É possível notar que, em ambos os projetos alvo, o desempenho é muito parecido.
No entanto, há diferenças perceptíveis quanto ao uso de memória e CPU:
O uso de memória teve um pico de 120 MB
, mantendo-se sempre constante após inicialização e carga inicial da aplicação.
O uso de CPU teve um pico de 42%
, sendo bem variável e mantendo-se em uma média abaixo de ~25%
.
O uso de memória teve um pico de 128 MB
, sendo bem variável e, na média, até melhor que a aplicação UWP
.
O uso de CPU teve um pico de 38%
, mantendo-se sempre constante e em uma média acima de ~25%
.
Distribuído através da licença MIT. Veja LICENSE
para mais informações.
André Cantarim