{"id":13549983,"url":"https://github.com/bmw-tech/ozzie.flutter","last_synced_at":"2026-01-11T04:46:53.333Z","repository":{"id":97694323,"uuid":"152331133","full_name":"bmw-tech/ozzie.flutter","owner":"bmw-tech","description":"Ozzie is your testing friend. Ozzie will take an screenshot during integration tests whenever you need. Ozzie will capture performance reports for you.","archived":false,"fork":false,"pushed_at":"2020-09-14T21:35:55.000Z","size":8777,"stargazers_count":279,"open_issues_count":15,"forks_count":20,"subscribers_count":9,"default_branch":"master","last_synced_at":"2025-07-06T18:09:40.147Z","etag":null,"topics":["flutter","flutter-package"],"latest_commit_sha":null,"homepage":"https://pub.dartlang.org/packages/ozzie","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bmw-tech.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null}},"created_at":"2018-10-09T22:42:43.000Z","updated_at":"2025-06-23T20:06:54.000Z","dependencies_parsed_at":"2023-04-03T21:31:57.271Z","dependency_job_id":null,"html_url":"https://github.com/bmw-tech/ozzie.flutter","commit_stats":null,"previous_names":["jorgecoca/ozzie.flutter"],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/bmw-tech/ozzie.flutter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bmw-tech%2Fozzie.flutter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bmw-tech%2Fozzie.flutter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bmw-tech%2Fozzie.flutter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bmw-tech%2Fozzie.flutter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bmw-tech","download_url":"https://codeload.github.com/bmw-tech/ozzie.flutter/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bmw-tech%2Fozzie.flutter/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":271442003,"owners_count":24760352,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-21T02:00:08.990Z","response_time":74,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["flutter","flutter-package"],"created_at":"2024-08-01T12:01:27.727Z","updated_at":"2026-01-11T04:46:53.308Z","avatar_url":"https://github.com/bmw-tech.png","language":"Dart","funding_links":[],"categories":["Dart"],"sub_categories":[],"readme":"# ozzie.flutter\n\n[![Pub](https://img.shields.io/pub/v/ozzie.svg)](https://pub.dartlang.org/packages/ozzie)\n[![CircleCI](https://circleci.com/gh/bmw-tech/ozzie.flutter.svg?style=svg)](https://circleci.com/gh/bmw-tech/ozzie.flutter)\n[![codecov](https://codecov.io/gh/bmw-tech/ozzie.flutter/branch/master/graph/badge.svg)](https://codecov.io/gh/bmw-tech/ozzie.flutter)\n\n![ozzie icon art](./art/ozzie.png)\n\nOzzie is your testing friend. Ozzie will take an screenshot during integration tests whenever you need. Ozzie will capture performance reports for you.\n\n## How it works\n\nAdd `ozzie` to your `pubspec.yaml` as a **dev_dependency**:\n\n```yaml\ndev_dependencies:\n  ozzie: \u003clatest_version_here\u003e\n```\n\nIn your Flutter integration tests, create an instance of `Ozzie`, pass the `FlutterDriver`, give it a `groupName` and ask it to `takeScreenshot`. That simple! And whenever you have finished with tests, you can create an HTML report by asking `Ozzie` to `generateHtmlReport`.\n\nIf you want to measure the performance of your app, simple wrap your integration tests in `profilePerformance` and it will be added to the HTML report.\n\nHere's an example:\n\n```dart\nimport 'package:flutter_driver/flutter_driver.dart';\nimport 'package:test/test.dart';\nimport 'package:ozzie/ozzie.dart';\n\nvoid main() {\n  FlutterDriver driver;\n  Ozzie ozzie;\n\n  setUpAll(() async {\n    driver = await FlutterDriver.connect();\n    ozzie = Ozzie.initWith(driver, groupName: 'counter');\n  });\n\n  tearDownAll(() async {\n    if (driver != null) driver.close();\n    ozzie.generateHtmlReport();\n  });\n\n  test('initial counter is 0', () async {\n    await ozzie.profilePerformance('counter0', () async {\n      await driver.waitFor(find.text('0'));\n      await ozzie.takeScreenshot('initial_counter_is_0');\n    });\n  });\n\n  test('initial counter is 0', () async {\n    await ozzie.profilePerformance('counter1', () async {\n      await driver.tap(find.byType('FloatingActionButton'));\n      await driver.waitFor(find.text('1'));\n      await ozzie.takeScreenshot('counter_is_1');\n    });\n  });\n}\n```\n\nAfter this, a report will be generated inside your project as `ozzie/index.html`:\n\n![report example](./art/report.gif)\n\n### Using ozzie.yaml to control performance thresholds\n\nYou can declare, at the root of your project, an `ozzie.yaml` file to control the different thresholds of your performance tests. If this file is not declared, `Ozzie` will use internal default values:\n\n`ozzie.yaml`:\n\n```yaml\nintegration_test_expectations:\n  should_fail_build_on_warning: true\n  should_fail_build_on_error: true\nperformance_metrics:\n  missed_frames_threshold:\n    warning_percentage: 5.0\n    error_percentage: 10.0\n  frame_build_rate_threshold:\n    warning_time_in_millis: 14.0\n    error_time_in_millis: 16.0\n  frame_rasterizer_rate_threshold:\n    warning_time_in_millis: 14.0\n    error_time_in_millis: 16.0\n```\n\n### Optional screenshots\n\nTaking screenshots can take a while, and sometimes you might want to run your integration tests without taking screenshots. If that's the case, you can set `shouldTakeScreenshots` to `false` and skip that part, saving you some precious time:\n\n```dart\nsetUpAll(() async {\n  driver = await FlutterDriver.connect();\n  ozzie = Ozzie.initWith(\n    driver,\n    groupName: 'counter',\n    shouldTakeScreenshots: false,\n  );\n});\n```\n\n## Maintainers\n\nProject Lead(s):\n\n- [Tim Chabot](https://github.com/tchabot22)\n\nMain Maintainer(s):\n\n- [Jorge Coca (@jorgecoca)](https://github.com/jorgecoca)\n- [Felix Angelov (@felangel)](https://github.com/felangel)\n\n## License\n\n```\nCopyright 2018 Jorge Coca\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbmw-tech%2Fozzie.flutter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbmw-tech%2Fozzie.flutter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbmw-tech%2Fozzie.flutter/lists"}