Flank is a massively parallel Android and iOS test runner for Firebase Test Lab.
Flank is YAML compatible with the gcloud CLI. Flank provides extra features to accelerate velocity and increase quality.
Integrate with popular CI tools to collect software project metrics like performance, build stability, and codebase quality.
License: Apache License 2.0
Flank is a massively parallel Android and iOS test runner for Firebase Test Lab.
Flank is YAML compatible with the gcloud CLI. Flank provides extra features to accelerate velocity and increase quality.
Setup Firebase Auth so that users login via Google before seeing the dashboard. The production dashboard should not be publicly visible without Google Auth.
See https://github.com/gskinnerTeam/flutter_vignettes/tree/master/vignettes/spending_tracker#budgettracker-graphs for an open source example graph.
When Flaky test is detected we want to be able to notify team about the problem, the quick way would be to send Slack message with URL.
https://app.bitrise.io/app/484e6ac68e24cada#/builds Dart | Metrics
Setup the Dart | Metrics
build job. The metrics build job should be updated to only build the metrics project + related tests.
Develop a program that uses the Jenkins API to import all builds for a given job to Firebase. This should be idempotent. The program will run on a schedule and constantly update Firestore with the latest builds.
Name | Description |
---|---|
buildId | unique identifier of the build |
buildDate | date the build was started |
buildQueued | the amount of time the build spent waiting to execute |
buildDuration | the amount of time the build took to execute (does not include queue time) |
buildSuccessful | boolean for if the build was successful or not |
Use testing approach created in #44 to create Jira Integration tests.
Use a testing approach created in #44 to create Slack Integration tests.
A company should be able to change the theme so that colors in the app reflect the brand colors for that company.
Screenshot testing to verify widgets visually look the same may be helpful. This feature is in development. After the PR merges, we may investigate this technique for the metrics project.
https://medium.com/@martin.kamleithner/test-your-flutter-widgets-using-golden-files-b533ac0de469
Ebay posted about a better way of doing golden image testing.
We need to make sure that basic integration with Firestore from CLI works well:
No auth needed for now.
See if it's possible to save the internal flutter driver results to a JSON file. If successful, we'd be able to transform this format into JUnit XML in the future.
Currently there's no machine readable output for test results.
/// A subclass of [LiveTestWidgetsFlutterBinding] that reports tests results
/// on a channel to adapt them to native instrumentation test format.
class E2EWidgetsFlutterBinding extends LiveTestWidgetsFlutterBinding {
/// Sets up a listener to report that the tests are finished when everything is
/// torn down.
context['\$flutterDriverResult'] = json.encode(result);
Flutter itself uses a JSON reporter and stores results in BigQuery.
https://github.com/flutter/flutter/blob/master/dev/bots/test.dart
https://github.com/flutter/flutter/blob/master/dev/bots/flutter_compact_formatter.dart
To get test results data we need to be able to read JUnit XML files from different test runners. For that, we need to be able to build a utility that can parse JUnit XML, support different JUnit XML variations and return data in the object model.
Here are sample JUnit XML files:
android_fail.xml
android_pass.xml
ios_pass.xml
Ios_fail.xml
Example JUnit parsing test written in Kotlin for the files above
JUnit parsing test
Review relevant information presented in shared word file.
Prepare a detailed plan on how Flaky test detection will work, what components will be used.
Current high-level understanding (can be changed after investigation):
As we get detailed Flaky Test detection algorithm in #41 we want to implement a Flaky Test detection algorithm according to specification.
Currently flutter_web_driver.dart
doesn't stream the results to stdout and the path to the log files are not printed.
./metrics/test/driver_test.dart
to run Flutter Web Driver test.On Flaky test detection trigger (if configured):
Develop a program that uses the Circle CI API to import all builds for a given job to Firebase. This should be idempotent. The program will run on a schedule and constantly update Firestore with the latest builds.
Name | Description |
---|---|
buildId | unique identifier of the build |
buildDate | date the build was started |
buildQueued | the amount of time the build spent waiting to execute |
buildDuration | the amount of time the build took to execute (does not include queue time) |
buildSuccessful | boolean for if the build was successful or not |
The task is to create a standalone Dart port of the shellwords library from Buildkite. Shellwords is useful for parsing strings in the same way as the UNIX Bourne shell.
A golang library for splitting command-line strings into words like a Posix or Windows shell would.
https://github.com/buildkite/shellwords
Develop a program that uses the Bitrise API to import all builds for a given job to Firebase. This should be idempotent. The program will run on a schedule and constantly update Firestore with the latest builds.
Name | Description |
---|---|
buildId | unique identifier of the build |
buildDate | date the build was started |
buildQueued | the amount of time the build spent waiting to execute |
buildDuration | the amount of time the build took to execute (does not include queue time) |
buildSuccessful | boolean for if the build was successful or not |
Research how to setup a public Jenkins and Buildkite service that can be used to validate the integration logic. The build import scripts will point to these test services and ensure the data is imported to Firebase successfully.
Google publicly shares their internal rules as package:pedantic in open-source. It represents what Google is enforcing internally throughout all Dart code. For a lint rule to be added to pedantic, Google has to change all code which doesn't follow the style.
This strict practice results in only 27/150+ rules to be enabled. While some are contradictory to each other and can not enabled together, a big chunk of rules isn't enabled because it requires too much work to update all of Googles existing code.
For developers outside Google, it is the norm to have separate lint rules per project. One project might enable more rules then others.
lint enables a majority of lint rules, leaving out contradictory and very opinionated rules.
Create an optimized deployment process that uploads the project to Firebase hosting.
Commit research doc with info from:
Use testing approach created in #44 to create Firestore Integration tests.
Create a simple skeleton for the web UI.
Develop a program that uses the Buildkite GraphQL API to import all builds for a given job to Firebase. This should be idempotent. The program will run on a schedule and constantly update Firestore with the latest builds from Buildkite.
Name | Description |
---|---|
buildId | unique identifier of the build |
buildDate | date the build was started |
buildQueued | the amount of time the build spent waiting to execute |
buildDuration | the amount of time the build took to execute (does not include queue time) |
buildSuccessful | boolean for if the build was successful or not |
https://gist.github.com/bootstraponline/f2f76d746233a3281e2d86e93d7508e1
FAQ
How many bars should we render?
Let's start with 14 based on the design, but make it configurable.
Is the graph interactive?
Yes, the user should be able to click onto an individual bar and that will open a new URL. See https://buildkite.com/bazel
Should we use real data?
For now, mock out all the data.
Graph should resize based on screen size. See Google example:
https://google.github.io/charts/flutter/example/bar_charts/spark_bar
Routing be decoupled from the buildContext.
Research routing packages and make a recommendation.
Auto deploy metrics web app to Firebase hosting free plan via the bitrise build.
After JUnit XML parsing we want to store test data in Firebase so this data can be used for Flaky Test detection algorithm.
Note: for now we'll skip Auth as it can be handled later on once all pieces work together well.
Research how to setup a public Buildkite service that can be used to validate the integration logic. The build import scripts will point to these test services and ensure the data is imported to Firebase successfully.
Setup data model the Web UI will use to render the widgets.
Development workflow:
To act on detected Flaky test we want to be able to integrate with Jira so the new ticket can be created (or existing updated).
For current Jira integration implementation, we assume that Simple workflow is used. Ticket type = "Task".
Jira integration should allow:
We need to add more information to readme about Guardian & Metrics projects: description, purpose, etc..
As we integrate with 3rd party services like Jira & Slack we want to make sure that our integration is reliable.
As a result of this ticket completion, we want to have documented 3rd party API testing approach we plan to use for Jira & Slack integration testing.
Create folder in the repo with the Adobe XD design.
https://app.bitrise.io/app/94d3963118a1f4fe#/builds Dart | Guardian
Setup the Dart | Guardian
build job. The guardian build job should be updated to only build the guardian project + related tests.
See https://github.com/gskinnerTeam/flutter_vignettes/tree/master/vignettes/spending_tracker#budgettracker-graphs for an open source example graph.
https://github.com/aeyrium/bezier-chart also looks interesting
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.