This presentation shows how to be a pragmatic Android programmer by showing real examples of applications/products developed in BQ attending to three important topics:
- Why and how to implement a pragmatic CLEAN architecture with a custom dependency injection framework and ReactiveX features.
- Why and how to implement unit, integration, view and smoke tests in every CLEAN layer and what tools should be used.
- Why and how to implement pragmatic Continuous
Development/Testing/Integration/Delivery by showing several tricks, plugins and snippets that you could use as a daily basis.
Today’s cutting edge companies have software release cycles measured in days instead of months. This agility is enabled by the DevOps practice of continuous delivery, which automates building, testing, and deploying all code changes. This automation helps you catch bugs sooner and accelerates developer productivity. In this session, we’ll share best practices (including ones followed internally at Amazon) and how you can bring them to your company by using open source and AWS services.
Speaker: Raghuraman Balachandran, Solutions Architect, Amazon India
JavaOne 2015 - Swimming upstream in the container revolutionBert Jan Schrijver
Bert Jan Schrijver discusses Malmberg's transition from traditional operations to a containerless continuous delivery model using DevOps principles. Some key challenges included cultural resistance to change, infrastructure limits with Amazon, and ensuring proper testing environments. The approach established expert teams, defined clear principles like infrastructure as code and no downtime, and benefited the business through increased agility, availability, and cost reductions. Areas of ongoing focus include monitoring, performance and security testing, and automated resilience testing.
Introduction to Continuous Delivery (BBWorld/DevCon 2013)Mike McGarr
This document provides an introduction and overview of continuous delivery. It discusses why releases are difficult, and proposes continuous delivery as an alternative approach where software is always in a releasable state and deployments can occur frequently through automation. It covers principles like automating everything and keeping the build and release process fast and reliable. Specific practices discussed include configuration management, continuous integration, testing, deployment pipelines, and deployment automation using tools like version control systems, build servers, and configuration management tools.
The document discusses continuous delivery practices including defining goals and features through examples and stories, automating acceptance criteria tests, and implementing application code to pass those tests. It emphasizes that quality must be built into the process through techniques like test automation to enable continuous delivery of value to the business. Automating acceptance criteria keeps projects on track, provides better visibility, allows faster release cycles, and reduces risk and costs.
Comparing Agile QA Approaches to End-to-End TestingKatie Chin
The document compares agile QA approaches like end-to-end testing and discusses how Quid uses both Selenium and RainforestQA for testing. It notes that while Selenium allows for fast automated testing, it is tied to the frontend implementation. RainforestQA uses human testers which is easier to maintain but slower. For complex products like Quid, RainforestQA has scaled testing better and freed up engineer time for more exploratory testing.
Matt Callanan takes the 15 chapters of the famous "Continuous Delivery" book by Jez Humble & Dave Farey and distills it down into 1 hour of convincing arguments, walking through the pieces involved to make it happen including cultural challenges, automated testing, automated deployment & deployment pipelines. Not sure how to get started with DevOps? Finding it hard to convince colleagues & managers that CD is the way forward? Matt has used this presentation to help facilitate enterprise-wide adoption of Continuous Delivery. Slides from a presentation given at DevOps Brisbane March 2014.
Effective Android Development. UA Mobile 2016.UA Mobile
This document contains tips for effective Android development. It discusses tools like Android Studio, techniques for testing on emulators and devices, improving app performance, developing in an efficient environment, and optimizing the Gradle build process. Specific tips include using two Android Studio instances for code reviews, testing on different OS versions, measuring execution times, checking the frame rate, using annotations and Stetho for inspection, and building faster by targeting API 21 for debug builds.
Today’s cutting edge companies have software release cycles measured in days instead of months. This agility is enabled by the DevOps practice of continuous delivery, which automates building, testing, and deploying all code changes. This automation helps you catch bugs sooner and accelerates developer productivity. In this session, we’ll share best practices (including ones followed internally at Amazon) and how you can bring them to your company by using open source and AWS services.
Speaker: Raghuraman Balachandran, Solutions Architect, Amazon India
JavaOne 2015 - Swimming upstream in the container revolutionBert Jan Schrijver
Bert Jan Schrijver discusses Malmberg's transition from traditional operations to a containerless continuous delivery model using DevOps principles. Some key challenges included cultural resistance to change, infrastructure limits with Amazon, and ensuring proper testing environments. The approach established expert teams, defined clear principles like infrastructure as code and no downtime, and benefited the business through increased agility, availability, and cost reductions. Areas of ongoing focus include monitoring, performance and security testing, and automated resilience testing.
Introduction to Continuous Delivery (BBWorld/DevCon 2013)Mike McGarr
This document provides an introduction and overview of continuous delivery. It discusses why releases are difficult, and proposes continuous delivery as an alternative approach where software is always in a releasable state and deployments can occur frequently through automation. It covers principles like automating everything and keeping the build and release process fast and reliable. Specific practices discussed include configuration management, continuous integration, testing, deployment pipelines, and deployment automation using tools like version control systems, build servers, and configuration management tools.
The document discusses continuous delivery practices including defining goals and features through examples and stories, automating acceptance criteria tests, and implementing application code to pass those tests. It emphasizes that quality must be built into the process through techniques like test automation to enable continuous delivery of value to the business. Automating acceptance criteria keeps projects on track, provides better visibility, allows faster release cycles, and reduces risk and costs.
Comparing Agile QA Approaches to End-to-End TestingKatie Chin
The document compares agile QA approaches like end-to-end testing and discusses how Quid uses both Selenium and RainforestQA for testing. It notes that while Selenium allows for fast automated testing, it is tied to the frontend implementation. RainforestQA uses human testers which is easier to maintain but slower. For complex products like Quid, RainforestQA has scaled testing better and freed up engineer time for more exploratory testing.
Matt Callanan takes the 15 chapters of the famous "Continuous Delivery" book by Jez Humble & Dave Farey and distills it down into 1 hour of convincing arguments, walking through the pieces involved to make it happen including cultural challenges, automated testing, automated deployment & deployment pipelines. Not sure how to get started with DevOps? Finding it hard to convince colleagues & managers that CD is the way forward? Matt has used this presentation to help facilitate enterprise-wide adoption of Continuous Delivery. Slides from a presentation given at DevOps Brisbane March 2014.
Effective Android Development. UA Mobile 2016.UA Mobile
This document contains tips for effective Android development. It discusses tools like Android Studio, techniques for testing on emulators and devices, improving app performance, developing in an efficient environment, and optimizing the Gradle build process. Specific tips include using two Android Studio instances for code reviews, testing on different OS versions, measuring execution times, checking the frame rate, using annotations and Stetho for inspection, and building faster by targeting API 21 for debug builds.
This document discusses continuous delivery, which aims to build, test, and release software faster through frequent integration and deployment. The goals are quality, speed, and reducing the time it takes to deploy changes from development to production through practices like test-driven development, continuous integration, automated testing, and deployment pipelines. It provides an overview of tools to support continuous delivery processes.
How to Upgrade to the Newest Shiniest Django VersionSusan Tan
This document summarizes Susan's presentation on upgrading Django projects. The presentation covered:
- Why upgrades are important for getting new features, fixes and security updates.
- The steps involved in upgrading include running tests, fixing broken tests one by one, checking that fewer tests fail with each new version, verifying the UI still works, and editing deployment files.
- Challenges include dependencies breaking, release notes documenting changes that require code updates, and the repetitive nature of fixing tests across multiple versions.
- The key takeaways are to upgrade one version at a time, run and fix tests with each version, read release notes, break tasks into small steps, and use checklists to track progress
AgileDC15 I'm Using Chef So I'm DevOps Right?Rob Brown
This document provides an overview of DevOps principles and practices. It discusses the rise of DevOps as a movement to improve collaboration between development and operations teams. Common DevOps misconceptions are addressed. The CALMS framework of culture, automation, lean, measurement, and sharing is introduced as guiding principles. A roadmap for DevOps adoption is presented, along with take-home activities. The document aims to educate about DevOps in 3 sentences or less.
Matt O'Keefe discusses DevOps terminology and roles. While "DevOps" should not appear in team names, it may be appropriate in some job titles. Job descriptions should definitely mention DevOps. DevOps is difficult to precisely define, but you know it when you see it. Full stack developers are also discussed as they relate to DevOps and agile testing. O'Keefe welcomes any questions.
Критика "библиотечного" подхода в разработке под Android. UA Mobile 2016.UA Mobile
The document criticizes the "library" approach to Android development and advocates for a more minimal and performant approach. It discusses several common libraries used in Android development such as ORMs, EventBus, and RxAndroid. It argues that many libraries are not optimized for Android, can have performance issues, and promote coupling between components. The document recommends choosing libraries carefully based on your needs, testing library performance, and favoring simpler solutions over complex libraries when possible to follow Android development best practices around performance and resource usage.
Creative Branching Models for Multiple Release StreamsAtlassian
Nuance Communications is making the move from SVN to Git! Why? To take advantage of its strong branching and merging capabilities... and to keep their developers happy. With wild variations between each product's release model, they have multiple releases of one or more components in play at a given time. So they had to get creative with a branching model. This talk will discuss choosing the right Git branching model for each of your release streams, and managing multiple releases using Bitbucket (including Stash), JIRA, Bamboo, and Maven.
Continuous Integration using Cruise Controlelliando dias
The document discusses Continuous Integration using Cruise Control. It defines Continuous Integration as integrating source code and running tests after each commit to the source repository to provide near-immediate feedback. Cruise Control runs builds whenever code is committed, allows scheduling nightly builds, and notifies users of build results to simplify release management. While Cruise Control automates the build process, developers must still write the build scripts and unit tests.
Blazing Fast Feedback Loops in the Java UniverseMichał Kordas
We all know that fast feedback loops make a real difference and that they are the most important part of agile development in general. This is why I want to take you on a tour of a variety of ways to increase quality and optimize feedback loops that I’ve encountered in the JVM-based projects that I’ve worked on so far.
Continuous integration (CI) is a software development practice where developers integrate code into a shared repository frequently, preferably multiple times a day. Each integration is verified by an automated build and test process to detect errors early. CI utilizes source control, automated builds, and tests to minimize the time between code changes being integrated and identified issues being found. While CI focuses on frequent code integration and testing, it does not require constant production releases or infrastructure automation. CI helps reduce integration problems and allows development teams to work together more efficiently.
The devops approach to monitoring, Open Source and Infrastructure as Code StyleJulien Pivotto
Monitoring is critical for every decent application that runs on production. Many of the monitoring tools widely used show their limits at the age of Infrastructure as Code and Cloud computing. Let's investigate how monitoring can face the new challenges: scalability, reproducability and automation
Continuous Integration for Spark Apps by Sean McIntyreSpark Summit
The document discusses the challenges of continuous integration for Apache Spark applications and presents a solution developed by Uncharted Software. It describes squeezing Spark, tests, and other tools into Docker containers to enable building and testing Spark apps across branches in a shared environment. This approach allows automating testing of Spark code commits, detecting issues early, and providing visibility of test results.
Continuous Integration, Build Pipelines and Continuous DeploymentChristopher Read
This document discusses core concepts and best practices for continuous integration (CI), build pipelines, and deployment. It recommends having a single source code repository, automating builds and testing, publishing the latest build, committing code frequently, building every commit, testing in production environments, keeping builds fast, ensuring all team members can see build status, automating deployment, and making CI and continuous deployment a collaborative effort between developers and system administrators. The goal is to improve quality, time to market, and confidence through practices that provide fast feedback on code changes.
ContainerCon - Test Driven InfrastructureYury Tsarev
Great external coverage of this presentation can be found at https://www.cedric-meury.ch/2016/10/test-driven-infrastructure-with-puppet-docker-test-kitchen-and-serverspec-yury-tsarev-gooddata/
A super enjoyable and entertaining walk through API memory lane, then a primer on how to test API's from a unit, integration, and monitoring standpoint. Then a demo on a CI/CD implementation I created at Snagajob.
How to Build and Maintain Quality Drupal Sites with Automated TestingAcquia
Automated testing has greatly improved the Drupal core development process. With automated testing over 24,500 unique core patches have been reviewed, and almost 19,000 test assertions are now run against every core patch. The result has been faster development cycle, more stable releases, and the ability to add features more quickly to Drupal core.
The document discusses continuous integration (CI), including its history and goals. CI means building code for each commit, running tests, and publishing results. Trunk-based development is introduced where all developers work on a single branch called trunk to avoid merge issues. Helpful CI techniques include using feature toggles, short-lived feature branches, and branch by abstraction. The presentation aims to understand CI, see pipelines, and learn techniques to help with CI implementation.
La integración continua es una práctica de ingeniería de software que consiste en hacer integraciones automáticas de un proyecto lo más a menudo posible, para así poder detectar fallos cuanto antes.
Podríamos pensar que en 2020 todos lo equipos integran continuamente, pero conversando con diferentes profesionales podemos ver que no siempre es así.
En esta sesión revisitaremos esta importante práctica, clave en DevOps, que por ser una de las más básicas, damos demasiadas veces por superada.
This document discusses Test Driven Development (TDD), Continuous Integration (CI), and Continuous Delivery (CD) for mobile development. It defines TDD, CI, and CD and provides examples of implementing each for both Android and iOS development. For TDD, it demonstrates writing tests first and then code to pass the tests. For CI, it recommends automating the build and test process. And for CD, it suggests using services like TestFlight to automatically deliver new builds to testers.
The practical implementation of Continuous Delivery at Etsy, and how it enables the engineering team to build features quickly, refactor and change architecture, and respond to problems in production.
Presented at GOTO Aarhus 2012.
Like what you've read? We're frequently hiring for a variety of engineering roles at Etsy. If you're interested, drop me a line or send me your resume: mike@etsy.com.
http://www.etsy.com/careers
This document describes Cerberus, an open source test automation tool developed by La Redoute. Cerberus allows centralized management of test cases across multiple technologies like web, mobile, and APIs. It supports features like a step library, test automation, execution reporting, and integration with other tools. The document also provides examples of how Cerberus is used at La Redoute for regression testing websites in multiple languages and environments. It maintains over 3,500 regression tests that execute twice daily. Cerberus can also be used for functional monitoring of websites by regularly executing test cases and monitoring performance metrics.
This document discusses continuous delivery, which aims to build, test, and release software faster through frequent integration and deployment. The goals are quality, speed, and reducing the time it takes to deploy changes from development to production through practices like test-driven development, continuous integration, automated testing, and deployment pipelines. It provides an overview of tools to support continuous delivery processes.
How to Upgrade to the Newest Shiniest Django VersionSusan Tan
This document summarizes Susan's presentation on upgrading Django projects. The presentation covered:
- Why upgrades are important for getting new features, fixes and security updates.
- The steps involved in upgrading include running tests, fixing broken tests one by one, checking that fewer tests fail with each new version, verifying the UI still works, and editing deployment files.
- Challenges include dependencies breaking, release notes documenting changes that require code updates, and the repetitive nature of fixing tests across multiple versions.
- The key takeaways are to upgrade one version at a time, run and fix tests with each version, read release notes, break tasks into small steps, and use checklists to track progress
AgileDC15 I'm Using Chef So I'm DevOps Right?Rob Brown
This document provides an overview of DevOps principles and practices. It discusses the rise of DevOps as a movement to improve collaboration between development and operations teams. Common DevOps misconceptions are addressed. The CALMS framework of culture, automation, lean, measurement, and sharing is introduced as guiding principles. A roadmap for DevOps adoption is presented, along with take-home activities. The document aims to educate about DevOps in 3 sentences or less.
Matt O'Keefe discusses DevOps terminology and roles. While "DevOps" should not appear in team names, it may be appropriate in some job titles. Job descriptions should definitely mention DevOps. DevOps is difficult to precisely define, but you know it when you see it. Full stack developers are also discussed as they relate to DevOps and agile testing. O'Keefe welcomes any questions.
Критика "библиотечного" подхода в разработке под Android. UA Mobile 2016.UA Mobile
The document criticizes the "library" approach to Android development and advocates for a more minimal and performant approach. It discusses several common libraries used in Android development such as ORMs, EventBus, and RxAndroid. It argues that many libraries are not optimized for Android, can have performance issues, and promote coupling between components. The document recommends choosing libraries carefully based on your needs, testing library performance, and favoring simpler solutions over complex libraries when possible to follow Android development best practices around performance and resource usage.
Creative Branching Models for Multiple Release StreamsAtlassian
Nuance Communications is making the move from SVN to Git! Why? To take advantage of its strong branching and merging capabilities... and to keep their developers happy. With wild variations between each product's release model, they have multiple releases of one or more components in play at a given time. So they had to get creative with a branching model. This talk will discuss choosing the right Git branching model for each of your release streams, and managing multiple releases using Bitbucket (including Stash), JIRA, Bamboo, and Maven.
Continuous Integration using Cruise Controlelliando dias
The document discusses Continuous Integration using Cruise Control. It defines Continuous Integration as integrating source code and running tests after each commit to the source repository to provide near-immediate feedback. Cruise Control runs builds whenever code is committed, allows scheduling nightly builds, and notifies users of build results to simplify release management. While Cruise Control automates the build process, developers must still write the build scripts and unit tests.
Blazing Fast Feedback Loops in the Java UniverseMichał Kordas
We all know that fast feedback loops make a real difference and that they are the most important part of agile development in general. This is why I want to take you on a tour of a variety of ways to increase quality and optimize feedback loops that I’ve encountered in the JVM-based projects that I’ve worked on so far.
Continuous integration (CI) is a software development practice where developers integrate code into a shared repository frequently, preferably multiple times a day. Each integration is verified by an automated build and test process to detect errors early. CI utilizes source control, automated builds, and tests to minimize the time between code changes being integrated and identified issues being found. While CI focuses on frequent code integration and testing, it does not require constant production releases or infrastructure automation. CI helps reduce integration problems and allows development teams to work together more efficiently.
The devops approach to monitoring, Open Source and Infrastructure as Code StyleJulien Pivotto
Monitoring is critical for every decent application that runs on production. Many of the monitoring tools widely used show their limits at the age of Infrastructure as Code and Cloud computing. Let's investigate how monitoring can face the new challenges: scalability, reproducability and automation
Continuous Integration for Spark Apps by Sean McIntyreSpark Summit
The document discusses the challenges of continuous integration for Apache Spark applications and presents a solution developed by Uncharted Software. It describes squeezing Spark, tests, and other tools into Docker containers to enable building and testing Spark apps across branches in a shared environment. This approach allows automating testing of Spark code commits, detecting issues early, and providing visibility of test results.
Continuous Integration, Build Pipelines and Continuous DeploymentChristopher Read
This document discusses core concepts and best practices for continuous integration (CI), build pipelines, and deployment. It recommends having a single source code repository, automating builds and testing, publishing the latest build, committing code frequently, building every commit, testing in production environments, keeping builds fast, ensuring all team members can see build status, automating deployment, and making CI and continuous deployment a collaborative effort between developers and system administrators. The goal is to improve quality, time to market, and confidence through practices that provide fast feedback on code changes.
ContainerCon - Test Driven InfrastructureYury Tsarev
Great external coverage of this presentation can be found at https://www.cedric-meury.ch/2016/10/test-driven-infrastructure-with-puppet-docker-test-kitchen-and-serverspec-yury-tsarev-gooddata/
A super enjoyable and entertaining walk through API memory lane, then a primer on how to test API's from a unit, integration, and monitoring standpoint. Then a demo on a CI/CD implementation I created at Snagajob.
How to Build and Maintain Quality Drupal Sites with Automated TestingAcquia
Automated testing has greatly improved the Drupal core development process. With automated testing over 24,500 unique core patches have been reviewed, and almost 19,000 test assertions are now run against every core patch. The result has been faster development cycle, more stable releases, and the ability to add features more quickly to Drupal core.
The document discusses continuous integration (CI), including its history and goals. CI means building code for each commit, running tests, and publishing results. Trunk-based development is introduced where all developers work on a single branch called trunk to avoid merge issues. Helpful CI techniques include using feature toggles, short-lived feature branches, and branch by abstraction. The presentation aims to understand CI, see pipelines, and learn techniques to help with CI implementation.
La integración continua es una práctica de ingeniería de software que consiste en hacer integraciones automáticas de un proyecto lo más a menudo posible, para así poder detectar fallos cuanto antes.
Podríamos pensar que en 2020 todos lo equipos integran continuamente, pero conversando con diferentes profesionales podemos ver que no siempre es así.
En esta sesión revisitaremos esta importante práctica, clave en DevOps, que por ser una de las más básicas, damos demasiadas veces por superada.
This document discusses Test Driven Development (TDD), Continuous Integration (CI), and Continuous Delivery (CD) for mobile development. It defines TDD, CI, and CD and provides examples of implementing each for both Android and iOS development. For TDD, it demonstrates writing tests first and then code to pass the tests. For CI, it recommends automating the build and test process. And for CD, it suggests using services like TestFlight to automatically deliver new builds to testers.
The practical implementation of Continuous Delivery at Etsy, and how it enables the engineering team to build features quickly, refactor and change architecture, and respond to problems in production.
Presented at GOTO Aarhus 2012.
Like what you've read? We're frequently hiring for a variety of engineering roles at Etsy. If you're interested, drop me a line or send me your resume: mike@etsy.com.
http://www.etsy.com/careers
This document describes Cerberus, an open source test automation tool developed by La Redoute. Cerberus allows centralized management of test cases across multiple technologies like web, mobile, and APIs. It supports features like a step library, test automation, execution reporting, and integration with other tools. The document also provides examples of how Cerberus is used at La Redoute for regression testing websites in multiple languages and environments. It maintains over 3,500 regression tests that execute twice daily. Cerberus can also be used for functional monitoring of websites by regularly executing test cases and monitoring performance metrics.
Slides from my last presentation at the Cape Town Meteor meetup, on optimising the UI, specifically for Hybrid apps and for Meteor JS hybrid apps.
The main thrust is really more about design patterns, and carefully controlling data management in your mobile app, with great examples of these patterns out in the real world.
see the mobile patterns video here : https://www.youtube.com/watch?v=e6WWX4TF3UI
From 0 to DevOps in 80 Days [Webinar Replay]Dynatrace
From 0 to DevOps in 80 Days
Link to the webinar replay: https://info.dynatrace.com/apm_dtm_ops_17q3_wc_from_enterprise_tocloud_native_na_registration.html
“Innovate or die” may sound extreme, but it’s the only way to thrive in today’s ever competitive market. Bernd Greifeneder, CTO of Dynatrace, wanted to ensure that the company was relevant 5 years from now so he formed an internal incubator with one goal: transform Dynatrace into a Cloud Native DevOps organization.
The incubator focused on what the company needed to do in order to integrate nascent cloud technologies so that they wouldn’t be left in the dust when the inevitable tipping point to cloud arrives. Transforming into a cloud native company would allow for rapid release cycles and provide an embedded feedback loop.
The Results: Dynatrace now has a 99.998% availability of SaaS Service and can deploy changes within an hour if necessary. In parallel, a new SaaS and managed offering is released every 2 weeks with 170 production updates per day.
Watch this recorded webinar as Bernd Greifeneder shares the lessons learned moving Dynatrace from an on-prem company to one that is cloud native.
Bernd discusses:
• The driving factors that led to the transformation
• The goals that were set back in 2011 towards the engineering team
• How to sell such a transformation project in a large enterprise organization
• How to support this multi-year project from top down without impacting regular operations
• What's next on the innovator's mind
This document provides an overview of test driven development (TDD), continuous integration (CI), continuous delivery (CD) and continuous deployment. It defines TDD as writing tests before code to guide development. CI involves integrating code into a shared repository daily and automating builds and testing. CD allows software to be released to production at any time if all tests pass. Continuous deployment automatically deploys software to production whenever changes are merged into the main branch. The document discusses benefits like higher quality, faster delivery and flexibility, and recommends automating everything and having developers and operations work together.
This deck represents our current thinking about the best way to build enterprise SaaS software in 2015 - using a variety of techniques from several disciplines.
Since I wrote this I have also become very interested in resilience engineering and the notion that web developers are primarily engaged in the construction of socio-technical systems. When I rewrite this I plan to talk about how we should try to minimize mean-time-to-recover (MTTR) instead of mean-time-between-failures (MTBF), and how continuous deployment grows a safety culture around your operations.
I redacted most of the examples that illustrate these points because they use sensitive code examples or URLs. If you want to see the rest of slides, join us!
Unlocking the Power of ChatGPT and AI in Testing - NextSteps, presented by Ap...Applitools
The document discusses AI tools for software testing such as ChatGPT, Github Copilot, and Applitools Visual AI. It provides an overview of each tool and how they can help with testing tasks like test automation, debugging, and handling dynamic content. The document also covers potential challenges with AI like data privacy issues and tools having superficial knowledge. It emphasizes that AI should be used as an assistance to humans rather than replacing them and that finding the right balance and application of tools is important.
Join Perfecto & CloudBees for a presentation on how to drive mobile app quality feedback in every build, on real devices. Watch a demo featuring the CloudBees Jenkins Workflow showcasing automated testing with Perfecto's Continuous Quality Lab.
Testing for Logic App Solutions | Integration MondayBizTalk360
In this Integration Monday session, Mike discussed the challenges and approaches for some of the common testing scenarios when delivering integration solutions with Microsoft Azure.
This document describes a performance automation solution using load testing scripts to continuously monitor application performance. The solution uses scripts to test functionality, availability, response times, and end-to-end workflows. Load testing engines run the scripts on a periodic schedule and store results. An alerting system analyzes results and sends alerts if response times exceed thresholds or tests fail to run. The system is containerized using Docker for scalability. Potential customers include project managers who need regression testing, monitoring of production applications, and emergency alerts about degradations or failures.
Level Up Your Integration Testing With TestcontainersVMware Tanzu
The document discusses Testcontainers, a Java library that makes it easy to create lightweight, disposable Docker containers to support integration testing. Testcontainers allows developers to start containers for databases, browsers, and other services via simple annotations and eliminates the need to manage complex Docker configurations and container lifecycles manually. It integrates with JUnit and handles starting a new container before each test and cleaning it up afterwards, improving testing fidelity by mimicking production environments.
Continuous delivery requires more that DevOps. It also requires one to think differently about product design, development & testing, and the overall structure of the organization. This presentation will help you understand what it takes and why one would want to deliver value to your customers multiple times each day. #CIC
Jeff "Cheezy" Morgan Ardita Karaj
Infrastructure as Code represents treating infrastructure components like software that can be version controlled, tested, and deployed. The document discusses tools and techniques for implementing Infrastructure as Code including using version control, continuous integration/delivery, configuration automation, and virtual labs for testing changes. It provides examples of workflows using these techniques and recommends starting small and evolving Infrastructure as Code practices over time.
This document proposes an automated test architecture for the UI Builder application using REST API testing, UI testing, and integration testing. It recommends the Rest Assured library for API testing due to its ability to integrate with Jenkins and remove the need for manual HTTP calls. Protractor is proposed for UI testing as it allows testing Angular applications in JavaScript and integrates well with Selenium. Both test frameworks would be set up with their own Git repositories linked to Jenkins jobs. Integration testing would link the API and UI test repos. The test automation aims to provide faster feedback and reduce regressions as the application grows.
Pragmatic Monolith-First, easy to decompose, clean architecturePiotr Pelczar
Designing systems architecture corresponding to business needs in long future is like a reading tea leaves. There is no common way to design systems. Making decision to start project with microservices may make refactoring much harder and introduce too much complexity in the infrastructure layer and finally slow down development. However maintaining a monolith is a tough nut to crack.
Let’s see how to build a system starting from well organized monolith with well marked technical and business scopes that enables to make a decision in with way it should be decomposed and how to deliver it. Strategic and tactical techniques from Domain-Driven Design and Hexagonal Architecture will be used. I will show you how to monitor accidential complexity using different tools during CI.
I invite you if you are interested in building systems with complex business domains.
Встреча "QA: в каких направлениях может найти себя тестировщик?"GoIT
19.12.2014 в креативном пространстве "Часопыс" состоялась очередная встреча от проекта GoIT, посвященная "вечному". Наши любимые преподаватели и менторы доносили следующее:
• Виды QA и специфика работы в каждом из этих направлений;
• Необходимые вспомогательные навыки, которыми должен обладать тестировщик;
• Новинки мира QA.
Наши спикеры:
Николай Ковш - QA Engineer в Ciklum, которому успешно удалось перейти в сферу IT из маркетинга. Расскажет о необходимости тестировщикам уметь программировать.
Алла Пенальба - QA Lead в компании invisibleCRM, работала в компании ПИКСУС, 4 года проживала в Бельгии, где работала Mobile QA Engineer.
Марина Шевченко - Mobile QA Engineer в Ciklum. QA с опытом тестирования веб, десктопных и мобильных приложений. Расскажет о специфике тестирования мобильных приложений.
Александр Майданюк - Head of Quality Assurance Solution в компании Ciklum. Занимал должности QA Lead, Manager, QA Consultant и Trainer. Эксперт и судья QA секции чемпионата UA Web Challenge. Соучредитель Киевского клуба тестировщиков QA Club.
DevOps Fest 2020. Kohsuke Kawaguchi. GitOps, Jenkins X & the Future of CI/CDDevOps_Fest
CI/CD process has been something your DevOps engineer purpose-built for your team. But with Kubernetes & cloud-native, that’s becoming “legacy.” The rising level of platform abstraction allows all the good practices that the industry has developed over time to be integrated, hidden, and simplified behind just one practice called “GitOps.” That simplified world is what Jenkins X enables.
We will discuss GitOps, Jenkins X, and how that combination drastically simplifies cloud-native web app development. You’ll understand why traditional DevOps is not suitable in a Kubernetes and cloud-native world, explore GitOps principles and discover how they facilitate high-velocity app development.
And finally, Kohsuke will make a fool of himself by talking about the future — now that Jenkins X simplifies the CD process, where is the next frontier?
This document provides information about a Global Office 365 Bootcamp 2018 event being held in Iselin, New Jersey. It introduces the organizers Tom Daly, Paul Galvin, and Adnan Rafique. It then provides an overview of topics that will be covered, including setting up an Office 365 tenant and development environment, an introduction to SharePoint client-side web parts and extensions, building "Hello World" examples, connecting to SharePoint APIs, an introduction to React, and other important React concepts like components, props, state, and lifecycle methods. Links are provided to Microsoft documentation for many of the code examples and tutorials that will be shown.
5 Steps to Jump Start Your Test AutomationSauce Labs
With the acceleration of software creation and delivery, test activities must align to the new tempo. Developers need immediate feedback to be efficient and correct defects as those are introduced. The path to achieving this vision is to build a reliable and scalable continuous test solution.
All beginnings are hard. Having a well-defined plan outlining the approach for your organization to create test automation is key to ensure long term success. Join Diego Molina, Senior Software Engineer at Sauce Labs as he discusses:
The importance of setting up the team correctly from the start
Choosing the right Testing Framework for your organization
Identifying the right scenarios and workflows to test
Learning to avoid common pitfalls at the beginning of the transformation journey
Similar to Droidcon Spain 2016 - The Pragmatic Android Programmer: from hype to reality (20)
Neo4j - Product Vision and Knowledge Graphs - GraphSummit ParisNeo4j
Dr. Jesús Barrasa, Head of Solutions Architecture for EMEA, Neo4j
Découvrez les dernières innovations de Neo4j, et notamment les dernières intégrations cloud et les améliorations produits qui font de Neo4j un choix essentiel pour les développeurs qui créent des applications avec des données interconnectées et de l’IA générative.
Do you want Software for your Business? Visit Deuglo
Deuglo has top Software Developers in India. They are experts in software development and help design and create custom Software solutions.
Deuglo follows seven steps methods for delivering their services to their customers. They called it the Software development life cycle process (SDLC).
Requirement — Collecting the Requirements is the first Phase in the SSLC process.
Feasibility Study — after completing the requirement process they move to the design phase.
Design — in this phase, they start designing the software.
Coding — when designing is completed, the developers start coding for the software.
Testing — in this phase when the coding of the software is done the testing team will start testing.
Installation — after completion of testing, the application opens to the live server and launches!
Maintenance — after completing the software development, customers start using the software.
SOCRadar's Aviation Industry Q1 Incident Report is out now!
The aviation industry has always been a prime target for cybercriminals due to its critical infrastructure and high stakes. In the first quarter of 2024, the sector faced an alarming surge in cybersecurity threats, revealing its vulnerabilities and the relentless sophistication of cyber attackers.
SOCRadar’s Aviation Industry, Quarterly Incident Report, provides an in-depth analysis of these threats, detected and examined through our extensive monitoring of hacker forums, Telegram channels, and dark web platforms.
Essentials of Automations: The Art of Triggers and Actions in FMESafe Software
In this second installment of our Essentials of Automations webinar series, we’ll explore the landscape of triggers and actions, guiding you through the nuances of authoring and adapting workspaces for seamless automations. Gain an understanding of the full spectrum of triggers and actions available in FME, empowering you to enhance your workspaces for efficient automation.
We’ll kick things off by showcasing the most commonly used event-based triggers, introducing you to various automation workflows like manual triggers, schedules, directory watchers, and more. Plus, see how these elements play out in real scenarios.
Whether you’re tweaking your current setup or building from the ground up, this session will arm you with the tools and insights needed to transform your FME usage into a powerhouse of productivity. Join us to discover effective strategies that simplify complex processes, enhancing your productivity and transforming your data management practices with FME. Let’s turn complexity into clarity and make your workspaces work wonders!
Graspan: A Big Data System for Big Code AnalysisAftab Hussain
We built a disk-based parallel graph system, Graspan, that uses a novel edge-pair centric computation model to compute dynamic transitive closures on very large program graphs.
We implement context-sensitive pointer/alias and dataflow analyses on Graspan. An evaluation of these analyses on large codebases such as Linux shows that their Graspan implementations scale to millions of lines of code and are much simpler than their original implementations.
These analyses were used to augment the existing checkers; these augmented checkers found 132 new NULL pointer bugs and 1308 unnecessary NULL tests in Linux 4.4.0-rc5, PostgreSQL 8.3.9, and Apache httpd 2.2.18.
- Accepted in ASPLOS ‘17, Xi’an, China.
- Featured in the tutorial, Systemized Program Analyses: A Big Data Perspective on Static Analysis Scalability, ASPLOS ‘17.
- Invited for presentation at SoCal PLS ‘16.
- Invited for poster presentation at PLDI SRC ‘16.
Software Engineering, Software Consulting, Tech Lead, Spring Boot, Spring Cloud, Spring Core, Spring JDBC, Spring Transaction, Spring MVC, OpenShift Cloud Platform, Kafka, REST, SOAP, LLD & HLD.
Most important New features of Oracle 23c for DBAs and Developers. You can get more idea from my youtube channel video from https://youtu.be/XvL5WtaC20A
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI AppGoogle
AI Fusion Buddy Review: Brand New, Groundbreaking Gemini-Powered AI App
👉👉 Click Here To Get More Info 👇👇
https://sumonreview.com/ai-fusion-buddy-review
AI Fusion Buddy Review: Key Features
✅Create Stunning AI App Suite Fully Powered By Google's Latest AI technology, Gemini
✅Use Gemini to Build high-converting Converting Sales Video Scripts, ad copies, Trending Articles, blogs, etc.100% unique!
✅Create Ultra-HD graphics with a single keyword or phrase that commands 10x eyeballs!
✅Fully automated AI articles bulk generation!
✅Auto-post or schedule stunning AI content across all your accounts at once—WordPress, Facebook, LinkedIn, Blogger, and more.
✅With one keyword or URL, generate complete websites, landing pages, and more…
✅Automatically create & sell AI content, graphics, websites, landing pages, & all that gets you paid non-stop 24*7.
✅Pre-built High-Converting 100+ website Templates and 2000+ graphic templates logos, banners, and thumbnail images in Trending Niches.
✅Say goodbye to wasting time logging into multiple Chat GPT & AI Apps once & for all!
✅Save over $5000 per year and kick out dependency on third parties completely!
✅Brand New App: Not available anywhere else!
✅ Beginner-friendly!
✅ZERO upfront cost or any extra expenses
✅Risk-Free: 30-Day Money-Back Guarantee!
✅Commercial License included!
See My Other Reviews Article:
(1) AI Genie Review: https://sumonreview.com/ai-genie-review
(2) SocioWave Review: https://sumonreview.com/sociowave-review
(3) AI Partner & Profit Review: https://sumonreview.com/ai-partner-profit-review
(4) AI Ebook Suite Review: https://sumonreview.com/ai-ebook-suite-review
#AIFusionBuddyReview,
#AIFusionBuddyFeatures,
#AIFusionBuddyPricing,
#AIFusionBuddyProsandCons,
#AIFusionBuddyTutorial,
#AIFusionBuddyUserExperience
#AIFusionBuddyforBeginners,
#AIFusionBuddyBenefits,
#AIFusionBuddyComparison,
#AIFusionBuddyInstallation,
#AIFusionBuddyRefundPolicy,
#AIFusionBuddyDemo,
#AIFusionBuddyMaintenanceFees,
#AIFusionBuddyNewbieFriendly,
#WhatIsAIFusionBuddy?,
#HowDoesAIFusionBuddyWorks
SMS API Integration in Saudi Arabia| Best SMS API ServiceYara Milbes
Discover the benefits and implementation of SMS API integration in the UAE and Middle East. This comprehensive guide covers the importance of SMS messaging APIs, the advantages of bulk SMS APIs, and real-world case studies. Learn how CEQUENS, a leader in communication solutions, can help your business enhance customer engagement and streamline operations with innovative CPaaS, reliable SMS APIs, and omnichannel solutions, including WhatsApp Business. Perfect for businesses seeking to optimize their communication strategies in the digital age.
Neo4j - Product Vision and Knowledge Graphs - GraphSummit ParisNeo4j
Dr. Jesús Barrasa, Head of Solutions Architecture for EMEA, Neo4j
Découvrez les dernières innovations de Neo4j, et notamment les dernières intégrations cloud et les améliorations produits qui font de Neo4j un choix essentiel pour les développeurs qui créent des applications avec des données interconnectées et de l’IA générative.
Flutter is a popular open source, cross-platform framework developed by Google. In this webinar we'll explore Flutter and its architecture, delve into the Flutter Embedder and Flutter’s Dart language, discover how to leverage Flutter for embedded device development, learn about Automotive Grade Linux (AGL) and its consortium and understand the rationale behind AGL's choice of Flutter for next-gen IVI systems. Don’t miss this opportunity to discover whether Flutter is right for your project.
What is Master Data Management by PiLog Groupaymanquadri279
PiLog Group's Master Data Record Manager (MDRM) is a sophisticated enterprise solution designed to ensure data accuracy, consistency, and governance across various business functions. MDRM integrates advanced data management technologies to cleanse, classify, and standardize master data, thereby enhancing data quality and operational efficiency.
Transform Your Communication with Cloud-Based IVR SolutionsTheSMSPoint
Discover the power of Cloud-Based IVR Solutions to streamline communication processes. Embrace scalability and cost-efficiency while enhancing customer experiences with features like automated call routing and voice recognition. Accessible from anywhere, these solutions integrate seamlessly with existing systems, providing real-time analytics for continuous improvement. Revolutionize your communication strategy today with Cloud-Based IVR Solutions. Learn more at: https://thesmspoint.com/channel/cloud-telephony
A Study of Variable-Role-based Feature Enrichment in Neural Models of CodeAftab Hussain
Understanding variable roles in code has been found to be helpful by students
in learning programming -- could variable roles help deep neural models in
performing coding tasks? We do an exploratory study.
- These are slides of the talk given at InteNSE'23: The 1st International Workshop on Interpretability and Robustness in Neural Software Engineering, co-located with the 45th International Conference on Software Engineering, ICSE 2023, Melbourne Australia
E-commerce Application Development Company.pdfHornet Dynamics
Your business can reach new heights with our assistance as we design solutions that are specifically appropriate for your goals and vision. Our eCommerce application solutions can digitally coordinate all retail operations processes to meet the demands of the marketplace while maintaining business continuity.
5. My goal here: understand why before how
• Do not apply concepts you do not understand/need
• I will explain why during 2015 we decided to apply
most of the previous concepts and how we did it:
1. Pragmatic CLEAN architecture
2. Pragmatic testing
3. Pragmatic continuous Development/Testing/Integration/
Delivery
7. Why
• Several projects in one year
• All of them from scratch
• We need maintainable/testable/decoupled/
easy to evolve projects
• Small team (6 developers)
• Impossible to work only in one project
• MUST change between projects smoothly
10. Trick: bind Views & Wireframes to Presenters
public interface BasePresenter<V, W> {
/** Called when the bound view is created. getView() will return a valid, active view from this point,
* point, so it is safe to start subscriptions or any other code depending on getView() */
void onCreateView();
/** Called when the bound view is about to be destroyed and unbound.
* getView() will return null from this point, so every subscription
* or any other code depending on getView() should be unsubscribed/managed. */
void onDestroyView();
/**
* Needed to create the relation between View-Presenter-Wireframe.
* @param view an active view of the needed type.
* @param wireframe an initialized wireframe of the needed type.
*/
void bindViewAndWireframe(V view, W wireframe);
/** Called after onDestroyView. Should perform clean-up of variables pointing to the view. */
void unBindViewAndWireframe();
/** @return the bound view. May be null if the view was unbound. */
V getView();
/** @return the bound Wireframe. */
W getWireframe();
/** Attach the subscription to the view lifecycle, and unsubscribe when it goes out of scope. /*
void track(Subscription subscription);
/** Unsubscribe all tracked subscriptions. */
void cancelSubscriptions();
}
11. Trick: bind Views & Wireframes to Presenters
public abstract class BaseCleanActivity<T extends BasePresenter<?, ?>> extends BaseActivity {
private T presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Retrieve presenter instance
this.presenter = resolvePresenter();
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
this.presenter.onCreateView();
}
protected abstract T resolvePresenter();
@Override
protected void onDestroy() {
super.onDestroy();
getPresenter().onDestroyView();
getPresenter().unBindViewAndWireframe();
}
protected T getPresenter() {
if (presenter.getView() != this) throw new IllegalArgumentException("Not bound!");
return presenter;
}
}
12. Trick: solving orientation changes
• Views use onSaveInstanceState
• Stateless Presenters are recreated
• State is recovered from network cache + database
• Single data retrieving flow
• High simplification of code vs Resource consumption
13. How: dependency injection
• Homemade solution
• Dagger 1 was too complicated (still no Dagger 2 release)
• The team needed to understand the benefits and how to use it
• Easier than expected
• Implementation:
• Shared: DependencyInjector + DependencyCache
• App: AndroidDependencyInjector
14. How: dependency injection
public abstract class DependencyInjector {
...
public abstract Scheduler provideUiScheduler();
public CalibrationPresenter provideCalibrationPresenter() {
return new CalibrationPresenterImpl(
provideConnectToZowiInteractor(),
provideMeasureZowiBatteryLevelInteractor(),
provideCheckInstalledZowiAppInteractor(),
provideSendAppToZowiInteractor(),
provideSendCommandToZowiInteractor(),
provideFactoryFirmwarePath(),
provideUiScheduler());
}
public MeasureZowiBatteryLevelInteractor provideMeasureZowiBatteryLevelInteractor() {
return new MeasureZowiBatteryLevelInteractorImpl(
provideSendCommandToZowiInteractor(),
provideZowiDataController());
}
public abstract BTConnectionController provideBTConnectionController();
...
}
15. How: dependency injection
public class AndroidDependencyInjector extends DependencyInjector {
...
@Override
public Scheduler provideUiScheduler() {
return AndroidSchedulers.mainThread();
}
@Override
public BTConnectionController provideBTConnectionController() {
return getCache().get(BTConnectionControllerImpl.class,
new DependencyCache.Provider<BTConnectionControllerImpl>() {
@NotNull
@Override
public BTConnectionControllerImpl get() {
return new BTConnectionControllerImpl(
application.getApplicationContext(),
BluetoothAdapter.getDefaultAdapter(),
provideSessionController(),
provideUiScheduler());
}
});
}
...
}
16. Why: Rx Java
• Easy to manage complex communications
• Great for projects involving HW
• Make thread management easier
• Beware of concurrency problems: they do not disappear!
• Improve team development speed…
• … once the initial learning curve is overcome
• RxAndroid only for AndroidSchedulers.mainThread();
18. Future steps
• Package structure refactoring
• Order by feature, not CLEAN layer (avoid useless classes/interfaces)
• Improves maintainability and decouple features
• Shared (pure Java) module will disappear
• But will remain in every feature-package
• Dagger 2
• Too much boilerplate to maintain a homemade solution nowadays
• Improves visibility: we do not need everything public
• Helps testing
20. Why
• Small QA team:
• With a great functional framework
• But still very dependent of manual testing
• Unit and integration tests were needed to:
• Automate everything that can be automatically tested
• Spend QA team time in engineering tasks -> mental health
• Ensure quality before testing the app as a user will do
• Avoid the “Great certification” phenomenon (aka Ping-Pong)
• Keep crash rate under 1%
21. How: use case
• For “device storage is full” feature, we will show
• What is tested
• How it is done
• In every CLEAN layer
Click on
book
cover
Manage
click to
download
book
Tries to
download
or return
typed error
Computes
available
space
against file
size
Asks
system
about
storage
available
View Presenter Interactor
Storage
Controller
Device
Controller
22. How we tested this before
• QA people fill a device storage using adb
• Create a user with suitable context properties
• Able to download a book
• With a heavy book in the library
• Etc.
• Try to download the book manually
• Check that “No space message” error is shown
23. How: unit tests
• Interactor:
• Tests method in charge of returning NO_SPACE error when the device
does not have enough space for download
• Mocking controllers
• Controller:
• Tests method in charge of deciding whether or not the device has
enough space to download a file
• Mocking system
• Using JUnit & Mockito
24. How: integration tests
• Controller
• Tests usage of Android APIs responsible of informing about
device free storage in bytes
• Using Robolectric
• Shadow storage API
25. How: view tests
• View + Presenter
• Tests that a Dialog is shown to the user in case the device
does not have enough space to download a file
• Validates the interaction between view and presenter
• Do not test them separately!
• Using Mockito & Espresso
• Mocking interactors
26. How: smoke tests
• Backend API
• Tests request that informs the app about the file size to be
downloaded
• Using JUnit & Robolectric
• Working with Interactors/Controllers
• Useful for quick reporting of backend errors &
breaking changes
27. Future steps
• Improve current testing frameworks
• E.g. Analytics -> tests screen tracking
• Saves 2 hours of manually testing per certification
• Increase coverage
• Apply robot pattern
• To encode high level actions that takes place on a view in
order to use them in many tests
29. • The repository must be a sanctuary
• Git-flow to avoid errors and allow hooks
• Everything is automated
• The less human intervention, the better
• Ensure that every pull-request passes the tests
• Otherwise, fail fast
• Easy daily distribution of APKs
• Real-time awareness of project state
Why
KEEP CALM
AND
AUTOMATE
30. How: automatic localization
• POeditor Android Gradle Plugin
• Allows single multi-platform string definition
• Download all strings files (every available lang) from PoEditor
• Process incoming strings to fix some PoEditor
incompatibilities with Android strings system
• Create strings.xml files to /values-<lang>
• or /values in case of the default lang
• Available on GitHub!
32. How: assets automation
• Automatic graphic resources integration
• Designers push resources to a suitable branch
• The branch is merged periodically
• Forget about Dropbox, Drive…
33. How: automate version code & name
/**
* Gets the version name from the latest Git tag. E.g. tag v.3.0.1.2 -> versionName 3.0.1.2
*/
def computeVersionName() {
def stdout = new ByteArrayOutputStream()
exec {
commandLine 'git', 'describe', '--abbrev=0', '--tags'
standardOutput = stdout
}
return stdout.toString().trim().replaceAll('v', '')
}
/**
* Gets the commit number from the current Git commit. E.g. 538
*/
def computeVersionCode() {
def stdout = new ByteArrayOutputStream()
exec {
commandLine 'git', 'rev-list', '--count', 'HEAD'
standardOutput = stdout
}
return stdout.toString().trim().toInteger()
}
defaultConfig {
versionName computeVersionName()
versionCode computeVersionCode()
...
}
Uses tag-flow
Increases snapshot version
only when HEAD is not tagged
37. How: app delivery
• Daily snapshots of all necessary product flavors
• Homemade RepoApp allows coworkers to download the latest
version with one click
• Maven repository is hidden to make things easier
• Weekly delivery to Google Play alpha users
• Provides real feedback from real users = free manual testing
• Don’t worry about crashes!
• Google Play beta used to test RCs
• A promote to production!
38. How: project dashboard
• By monitoring Jenkins reports we know when
• A test has failed
• A build is broken
• And enjoy the pleasure of blaming
46. Future steps
• SonarQube for static code analysis
• Performance analysis
• Update ticket status with build number after
successful pull requests
• Ready for QA
• Google Play REST API to automate publication
48. Common sense
• Do not be afraid of improving when your context and
necessities demands it
• But please, do not be reckless when more people are
affected by your decisions
• And remember: hype is the enemy of reality
49. BQ Open Source
• https://github.com/bq/poeditor-android-gradle-plugin/
• https://github.com/bq/tag-flow
• Dashboard widgets based on Dashing.io
• Bugsnag Error: http://bit.ly/29LnMw2
• Google Play Reviews: http://bit.ly/2a0wNmG
• Google Play Rating: http://bit.ly/29z8aJO