CINXE.COM

Check app functionality with an integration test | Flutter

<!doctype html><html lang="en"><head><meta charset="utf-8"><title>Check app functionality with an integration test | Flutter</title><link rel="icon" href="/assets/images/branding/flutter/icon/64.png" eleventy:ignore><link rel="apple-touch-icon" href="/assets/images/branding/flutter/logo/flutter-logomark-320px.png" eleventy:ignore><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="theme-color" content="#ffffff"><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><meta name="google-site-verification" content="HFqxhSbf9YA_0rBglNLzDiWnrHiK_w4cqDh2YD2GEY4"><script>!function(e,t,a,n){e[n]=e[n]||[],e[n].push({"gtm.start":(new Date).getTime(),event:"gtm.js"});var g=t.getElementsByTagName(a)[0],m=t.createElement(a);m.async=!0,m.src="https://www.googletagmanager.com/gtm.js?id=GTM-ND4LWWZ",g.parentNode.insertBefore(m,g)}(window,document,"script","dataLayer")</script><script>!function(e,a,t,n,c,o,s){e.GoogleAnalyticsObject=c,e[c]=e[c]||function(){(e[c].q=e[c].q||[]).push(arguments)},e[c].l=1*new Date,o=a.createElement(t),s=a.getElementsByTagName(t)[0],o.async=1,o.src="//www.google-analytics.com/analytics.js",s.parentNode.insertBefore(o,s)}(window,document,"script",0,"ga"),ga("create","UA-67589403-1","auto"),ga("send","pageview")</script><meta name="description" content="Learn how to write integration tests"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:site" content="@flutterdev"><meta property="og:title" content="Check app functionality with an integration test"><meta property="og:url" content="https://docs.flutter.dev/testing/integration-tests"><meta property="og:description" content="Learn how to write integration tests"><meta property="og:image" content="https://docs.flutter.dev/assets/images/flutter-logo-sharing.png" eleventy:ignore><link href="https://fonts.googleapis.com/css2?family=Google+Sans:wght@400;500;700&display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css2?family=Google+Sans+Text:wght@400;500;700&display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css2?family=Google+Sans+Mono:wght@400;500;700&display=swap" rel="stylesheet"><link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@24,400,0,0" rel="stylesheet"><script>window.__CALLBACKS=[]</script><link rel="stylesheet" href="/assets/css/main.css?v=4"></head><body><section id="cookie-notice"><div class="container"><p>docs.flutter.dev uses cookies from Google to deliver and enhance the quality of its services and to analyze traffic. <a href="https://policies.google.com/technologies/cookies" target="_blank" rel="noopener">Learn more</a>.</p><button id="cookie-consent" class="filled-button">OK, got it</button></div></section><noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-ND4LWWZ" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript><div id="site-banner" role="alert"><p>Flutter 3.29 is here with a bouquet of performance and fidelity improvements for your apps! <a href="https://medium.com/flutter/whats-new-in-flutter-3-29-f90c380c2317">Learn more</a><br></p></div><header class="site-header"><a href="#document-title" id="skip-to-main" class="filled-button" tabindex="1">Skip to main content</a><nav class="navbar"><div id="site-switcher" class="dropdown"><button class="dropdown-button site-wordmark" aria-expanded="false" aria-controls="site-switcher-menu" aria-label="Switch between Flutter and Dart sites"><img src="/assets/images/branding/flutter/logo/default.svg" alt="Flutter logo" width="28"> <span>Flutter</span> <span class="subtype">Docs</span> <span class="material-symbols" aria-hidden="true">unfold_more</span></button><div class="dropdown-content" id="site-switcher-menu"><nav class="dropdown-menu" role="menu"><ul><li role="presentation"><a href="https://flutter.dev" class="site-wordmark" role="menuitem" title="Flutter homepage" aria-label="Go to the Flutter homepage"><img src="/assets/images/branding/flutter/logo/default.svg" alt="Flutter logo" width="28"> <span>Flutter</span></a></li><li role="presentation"><a href="https://docs.flutter.dev" class="site-wordmark current-site" role="menuitem" aria-current="true" title="Flutter docs homepage" aria-label="Go to the Flutter docs homepage"><img src="/assets/images/branding/flutter/logo/default.svg" alt="Flutter logo" width="28"> <span>Flutter</span> <span class="subtype">Docs</span></a></li><li role="presentation"><a href="https://api.flutter.dev" class="site-wordmark" role="menuitem" title="Flutter API reference" aria-label="Go to the Flutter API reference"><img src="/assets/images/branding/flutter/logo/default.svg" alt="Flutter logo" width="28"> <span>Flutter</span> <span class="subtype">API</span></a></li><li aria-hidden="true" class="dropdown-divider" role="separator"></li><li role="presentation"><a href="https://dart.dev" class="site-wordmark" role="menuitem" title="Dart homepage" aria-label="Go to the Dart homepage"><img src="/assets/images/branding/dart/logo.svg" alt="Dart logo" width="28" height="28"> <span>Dart</span></a></li><li role="presentation"><a href="https://dartpad.dev" class="site-wordmark" role="menuitem" title="DartPad playground" aria-label="Go to the DartPad playground"><img src="/assets/images/branding/dart/logo.svg" alt="Dart logo" width="28" height="28"> <span>DartPad</span></a></li><li role="presentation"><a href="https://pub.dev" class="site-wordmark" role="menuitem" title="pub.dev homepage" aria-label="Go to the pub.dev homepage"><img src="/assets/images/branding/dart/logo.svg" alt="Dart logo" width="28" height="28"> <span>pub.dev</span></a></li></ul></nav></div></div><div class="navbar-contents"><ul class="navbar-nav"><li class="nav-item"><a class="nav-link" href="https://flutter.dev">Homepage</a></li><li class="nav-item"><a class="nav-link" href="https://flutter.dev/community">Community</a></li><li class="nav-item"><a class="nav-link" href="https://pub.dev">Packages</a></li><li class="nav-item"><a class="nav-link" href="https://api.flutter.dev">API reference</a></li></ul><form action="/search/" class="site-header__search"><input class="site-header__searchfield search-field" type="search" name="q" id="q" autocomplete="off" placeholder="Search" aria-label="Search"></form><a href="/search" id="fallback-search-button" class="icon-button" aria-label="Navigate to the docs search page." title="Navigate to the docs search page."><span class="material-symbols" aria-hidden="true">search</span> </a><a id="call-to-action" class="filled-button" href="/get-started/install/">Get started</a> <button id="menu-toggle" class="icon-button" type="button" aria-controls="sidenav" aria-label="Toggle navigation" title="Toggle navigation"><span class="material-symbols" aria-hidden="true">menu</span></button></div></nav></header><div id="site-below-header"><div id="site-main-row"><div id="sidenav" class="site-sidebar"><nav><ul><li class="nav-header">Get started</li><li class="nav-item"><a class="nav-link" href="/get-started/install"><div><span>Set up Flutter</span></div></a></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-3" role="button" aria-expanded="false" aria-controls="sidenav-3"><span>Learn Flutter</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-3"><li class="nav-item"><a class="nav-link" href="/get-started/learn-flutter"><div><span>Introduction</span></div></a></li><li class="nav-item"><a class="nav-link" href="/get-started/codelab"><div><span>Write your first app</span></div></a></li><li class="nav-item"><button class="nav-link collapsible" data-toggle="collapse" data-target="#sidenav-3-3" role="button" aria-expanded="true" aria-controls="sidenav-3-3"><span>Learn the fundamentals</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse show" id="sidenav-3-3"><li class="nav-item"><a class="nav-link" href="/get-started/fundamentals"><div><span>Introduction</span></div></a></li><li class="nav-item"><a class="nav-link" href="/get-started/fundamentals/dart"><div><span>Intro to Dart</span></div></a></li><li class="nav-item"><a class="nav-link" href="/get-started/fundamentals/widgets"><div><span>Widgets</span></div></a></li><li class="nav-item"><a class="nav-link" href="/get-started/fundamentals/layout"><div><span>Layout</span></div></a></li><li class="nav-item"><a class="nav-link" href="/get-started/fundamentals/state-management"><div><span>State management</span></div></a></li><li class="nav-item"><a class="nav-link" href="/get-started/fundamentals/user-input"><div><span>Handling user input</span></div></a></li><li class="nav-item"><a class="nav-link" href="/get-started/fundamentals/networking"><div><span>Networking and data</span></div></a></li><li class="nav-item"><a class="nav-link" href="/get-started/fundamentals/local-caching"><div><span>Local data and caching</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-3-4" role="button" aria-expanded="false" aria-controls="sidenav-3-4"><span>From another platform?</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-3-4"><li class="nav-item"><a class="nav-link" href="/get-started/flutter-for/android-devs"><div><span>Flutter for Android devs</span></div></a></li><li class="nav-item"><a class="nav-link" href="/get-started/flutter-for/compose-devs"><div><span>Flutter for Jetpack Compose devs</span></div></a></li><li class="nav-item"><a class="nav-link" href="/get-started/flutter-for/swiftui-devs"><div><span>Flutter for SwiftUI devs</span></div></a></li><li class="nav-item"><a class="nav-link" href="/get-started/flutter-for/uikit-devs"><div><span>Flutter for UIKit devs</span></div></a></li><li class="nav-item"><a class="nav-link" href="/get-started/flutter-for/react-native-devs"><div><span>Flutter for React Native devs</span></div></a></li><li class="nav-item"><a class="nav-link" href="/get-started/flutter-for/web-devs"><div><span>Flutter for web devs</span></div></a></li><li class="nav-item"><a class="nav-link" href="/get-started/flutter-for/xamarin-forms-devs"><div><span>Flutter for Xamarin.Forms devs</span></div></a></li><li class="nav-item"><a class="nav-link" href="/get-started/flutter-for/declarative"><div><span>Introduction to declarative UI</span></div></a></li><li class="nav-item"><a class="nav-link" href="/get-started/flutter-for/dart-swift-concurrency"><div><span>Flutter versus Swift concurrency</span></div></a></li></ul></li><div class="sidenav-divider"></div><li class="nav-item"><a class="nav-link" href="/codelabs"><div><span>Codelabs</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook"><div><span>Cookbook</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://github.com/flutter/samples" target="_blank" rel="noopener"><div><span>Demos and samples</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-4" role="button" aria-expanded="false" aria-controls="sidenav-4"><span>Stay up to date</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-4"><li class="nav-item"><a class="nav-link" href="/release/upgrade"><div><span>Upgrade</span></div></a></li><li class="nav-item"><a class="nav-link" href="/release/archive"><div><span>SDK archive</span></div></a></li><div class="sidenav-divider"></div><li class="nav-item"><a class="nav-link" href="/release/whats-new"><div><span>What's new</span></div></a></li><li class="nav-item"><a class="nav-link" href="/release/release-notes"><div><span>Release notes</span></div></a></li><li class="nav-item"><a class="nav-link" href="/release/breaking-changes"><div><span>Breaking changes</span></div></a></li><li class="nav-item"><a class="nav-link" href="/release/compatibility-policy"><div><span>Compatibility policy</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-5" role="button" aria-expanded="false" aria-controls="sidenav-5"><span>App solutions</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-5"><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-5-1" role="button" aria-expanded="false" aria-controls="sidenav-5-1"><span>AI</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-5-1"><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-5-1-1" role="button" aria-expanded="false" aria-controls="sidenav-5-1-1"><span>AI Toolkit guide</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-5-1-1"><li class="nav-item"><a class="nav-link" href="/ai-toolkit"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ai-toolkit/user-experience"><div><span>User experience</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ai-toolkit/feature-integration"><div><span>Feature integration</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ai-toolkit/custom-llm-providers"><div><span>Custom LLM providers</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ai-toolkit/chat-client-sample"><div><span>Chat client sample</span></div></a></li></ul></li><li class="nav-item"><a class="nav-link" href="https://www.youtube.com/watch?v=1AuzJEiHjO4" target="_blank" rel="noopener"><div><span>Build with Google AI Dart SDK (video)</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-5-2" role="button" aria-expanded="false" aria-controls="sidenav-5-2"><span>Firebase & Firestore</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-5-2"><li class="nav-item"><a class="nav-link" href="/data-and-backend/firebase"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://firebase.google.com/docs/flutter" target="_blank" rel="noopener"><div><span>Discover Firebase for Flutter</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://www.youtube.com/watch?v=wUSkeTaBonA" target="_blank" rel="noopener"><div><span>Get to know Firebase for Flutter</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://firebase.google.com/codelabs/firebase-auth-in-flutter-apps" target="_blank" rel="noopener"><div><span>Add a user authentication flow to a Flutter app using FirebaseUI</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://firebase.google.com/codelabs/firebase-get-to-know-web" target="_blank" rel="noopener"><div><span>Get to know Firebase for web</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-5-3" role="button" aria-expanded="false" aria-controls="sidenav-5-3"><span>Games</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-5-3"><li class="nav-item"><a class="nav-link" href="/resources/games-toolkit"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/games/achievements-leaderboard"><div><span>Add achievements and leaderboards</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://firebase.google.com/codelabs/build-leaderboards-with-firestore#0" target="_blank" rel="noopener"><div><span>Build leaderboards with Firestore</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/plugins/google-mobile-ads"><div><span>Add advertising</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/games/firestore-multiplayer"><div><span>Add multiplayer support</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://codelabs.developers.google.com/codelabs/flutter-in-app-purchases" target="_blank" rel="noopener"><div><span>Add in-app purchases</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://firebase.google.com/codelabs/firebase-auth-in-flutter-apps" target="_blank" rel="noopener"><div><span>Add user authentication</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://firebase.google.com/docs/crashlytics/get-started?platform=flutter" target="_blank" rel="noopener"><div><span>Debug using Crashlytics</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://codelabs.developers.google.com/codelabs/flutter-flame-brick-breaker" target="_blank" rel="noopener"><div><span>Intro to Flame with Flutter</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-5-4" role="button" aria-expanded="false" aria-controls="sidenav-5-4"><span>Monetization</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-5-4"><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-5-4-1" role="button" aria-expanded="false" aria-controls="sidenav-5-4-1"><span>Advertising</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-5-4-1"><li class="nav-item"><a class="nav-link" href="/resources/ads-overview"><div><span>Ads overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/plugins/google-mobile-ads"><div><span>Add advertising</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://codelabs.developers.google.com/codelabs/admob-ads-in-flutter" target="_blank" rel="noopener"><div><span>Add AdMob ads to your Flutter app</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://codelabs.developers.google.com/codelabs/admob-inline-ads-in-flutter" target="_blank" rel="noopener"><div><span>Add an AdMob banner and native inline ads</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://developers.google.com/admob/flutter/mediation" target="_blank" rel="noopener"><div><span>Google AdMob mediation</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://pub.dev/packages/interactive_media_ads" target="_blank" rel="noopener"><div><span>Interactive Media Ads SDK</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-5-4-2" role="button" aria-expanded="false" aria-controls="sidenav-5-4-2"><span>In-app purchases</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-5-4-2"><li class="nav-item"><a class="nav-link" href="/resources/in-app-purchases-overview"><div><span>In-app purchases overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://codelabs.developers.google.com/codelabs/flutter-in-app-purchases" target="_blank" rel="noopener"><div><span>Add in-app purchases</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-5-4-3" role="button" aria-expanded="false" aria-controls="sidenav-5-4-3"><span>Payments</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-5-4-3"><li class="nav-item"><a class="nav-link" href="/resources/payments-overview"><div><span>Payments overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://pub.dev/packages/pay" target="_blank" rel="noopener"><div><span>Google pay package</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li></ul></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-5-5" role="button" aria-expanded="false" aria-controls="sidenav-5-5"><span>Maps</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-5-5"><li class="nav-item"><a class="nav-link" href="https://codelabs.developers.google.com/codelabs/google-maps-in-flutter" target="_blank" rel="noopener"><div><span>Add Google maps to a Flutter app</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://developers.google.com/maps/flutter-package" target="_blank" rel="noopener"><div><span>Google Maps package</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-5-6" role="button" aria-expanded="false" aria-controls="sidenav-5-6"><span>News</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-5-6"><li class="nav-item"><a class="nav-link" href="/resources/news-toolkit"><div><span>Build a news app</span></div></a></li></ul></li></ul></li><li aria-hidden="true"><div class="sidenav-divider"></div></li><li class="nav-header">User interface</li><li class="nav-item"><a class="nav-link" href="/ui"><div><span>Introduction</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/widgets"><div><span>Widget catalog</span></div></a></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-10" role="button" aria-expanded="false" aria-controls="sidenav-10"><span>Layout</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-10"><li class="nav-item"><a class="nav-link" href="/ui/layout"><div><span>Introduction</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/layout/tutorial"><div><span>Build a layout</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-10-3" role="button" aria-expanded="false" aria-controls="sidenav-10-3"><span>Lists & grids</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-10-3"><li class="nav-item"><a class="nav-link" href="/cookbook/lists/basic-list"><div><span>Create and use lists</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/lists/horizontal-list"><div><span>Create a horizontal list</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/lists/grid-lists"><div><span>Create a grid view</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/lists/mixed-list"><div><span>Create lists with different types of items</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/lists/spaced-items"><div><span>Create lists with spaced items</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/lists/long-lists"><div><span>Work with long lists</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-10-4" role="button" aria-expanded="false" aria-controls="sidenav-10-4"><span>Scrolling</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-10-4"><li class="nav-item"><a class="nav-link" href="/ui/layout/scrolling"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/layout/scrolling/slivers"><div><span>Use slivers to achieve fancy scrolling</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/lists/floating-app-bar"><div><span>Place a floating app bar above a list</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/effects/parallax-scrolling"><div><span>Create a scrolling parallax effect</span></div></a></li></ul></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-11" role="button" aria-expanded="false" aria-controls="sidenav-11"><span>Adaptive & responsive design</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-11"><li class="nav-item"><a class="nav-link" href="/ui/adaptive-responsive"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/adaptive-responsive/general"><div><span>General approach</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/adaptive-responsive/safearea-mediaquery"><div><span>SafeArea & MediaQuery</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/adaptive-responsive/large-screens"><div><span>Large screens & foldables</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/adaptive-responsive/input"><div><span>User input & accessibility</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/adaptive-responsive/capabilities"><div><span>Capabilities & policies</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/adaptive-responsive/platform-adaptations"><div><span>Automatic platform adaptations</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/adaptive-responsive/best-practices"><div><span>Best practices</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/adaptive-responsive/more-info"><div><span>Additional resources</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-12" role="button" aria-expanded="false" aria-controls="sidenav-12"><span>Design & theming</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-12"><li class="nav-item"><a class="nav-link" href="/cookbook/design/themes"><div><span>Share styles with themes</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/design/material"><div><span>Material design</span></div></a></li><li class="nav-item"><a class="nav-link" href="/release/breaking-changes/material-3-migration"><div><span>Migrate to Material 3</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-12-4" role="button" aria-expanded="false" aria-controls="sidenav-12-4"><span>Text</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-12-4"><li class="nav-item"><a class="nav-link" href="/ui/design/text/typography"><div><span>Fonts & typography</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/design/fonts"><div><span>Use a custom font</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/design/package-fonts"><div><span>Export fonts from a package</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://pub.dev/packages/google_fonts" target="_blank" rel="noopener"><div><span>Google Fonts package</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-12-5" role="button" aria-expanded="false" aria-controls="sidenav-12-5"><span>Custom graphics</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-12-5"><li class="nav-item"><a class="nav-link" href="/ui/design/graphics/fragment-shaders"><div><span>Use custom fragment shaders</span></div></a></li></ul></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-13" role="button" aria-expanded="false" aria-controls="sidenav-13"><span>Interactivity</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-13"><li class="nav-item"><a class="nav-link" href="/ui/interactivity"><div><span>Add interactivity to your app</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-13-2" role="button" aria-expanded="false" aria-controls="sidenav-13-2"><span>Gestures</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-13-2"><li class="nav-item"><a class="nav-link" href="/ui/interactivity/gestures"><div><span>Introduction</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/gestures/handling-taps"><div><span>Handle taps</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/interactivity/gestures/drag-outside"><div><span>Drag an object outside an app</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/effects/drag-a-widget"><div><span>Drag a UI element within an app</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/gestures/ripples"><div><span>Add Material touch ripples</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/gestures/dismissible"><div><span>Implement swipe to dismiss</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-13-3" role="button" aria-expanded="false" aria-controls="sidenav-13-3"><span>Input & forms</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-13-3"><li class="nav-item"><a class="nav-link" href="/cookbook/forms/text-input"><div><span>Create and style a text field</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/forms/retrieve-input"><div><span>Retrieve the value of a text field</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/forms/text-field-changes"><div><span>Handle changes to a text field</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/forms/focus"><div><span>Manage focus in text fields</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/forms/validation"><div><span>Build a form with validation</span></div></a></li></ul></li><li class="nav-item"><a class="nav-link" href="/cookbook/design/snackbars"><div><span>Display a snackbar</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/interactivity/actions-and-shortcuts"><div><span>Implement actions & shortcuts</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/interactivity/focus"><div><span>Manage keyboard focus</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-14" role="button" aria-expanded="false" aria-controls="sidenav-14"><span>Assets & media</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-14"><li class="nav-item"><a class="nav-link" href="/ui/assets/assets-and-images"><div><span>Add assets and images</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/images/network-image"><div><span>Display images from the internet</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/images/fading-in-images"><div><span>Fade in images with a placeholder</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/plugins/play-video"><div><span>Play and pause a video</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/assets/asset-transformation"><div><span>Transform assets at build time</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-15" role="button" aria-expanded="false" aria-controls="sidenav-15"><span>Navigation & routing</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-15"><li class="nav-item"><a class="nav-link" href="/ui/navigation"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/design/tabs"><div><span>Add tabs to your app</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/navigation/navigation-basics"><div><span>Navigate to a new screen and back</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/navigation/passing-data"><div><span>Send data to a new screen</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/navigation/returning-data"><div><span>Return data from a screen</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/design/drawer"><div><span>Add a drawer to a screen</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/navigation/deep-linking"><div><span>Set up deep linking</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/navigation/set-up-app-links"><div><span>Set up app links for Android</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/navigation/set-up-universal-links"><div><span>Set up universal links for iOS</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/navigation/url-strategies"><div><span>Configure web URL strategies</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-16" role="button" aria-expanded="false" aria-controls="sidenav-16"><span>Animations & transitions</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-16"><li class="nav-item"><a class="nav-link" href="/ui/animations"><div><span>Introduction</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/animations/tutorial"><div><span>Tutorial</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/animations/implicit-animations"><div><span>Implicit animations</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/animation/animated-container"><div><span>Animate the properties of a container</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/animation/opacity-animation"><div><span>Fade a widget in and out</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/animations/hero-animations"><div><span>Hero animations</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/animation/page-route-animation"><div><span>Animate a page route transition</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/animation/physics-simulation"><div><span>Animate using a physics simulation</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/animations/staggered-animations"><div><span>Staggered animations</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/effects/staggered-menu-animation"><div><span>Create a staggered menu animation</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/animations/overview"><div><span>API overview</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-17" role="button" aria-expanded="false" aria-controls="sidenav-17"><span>Accessibility & internationalization</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-17"><li class="nav-item"><a class="nav-link" href="/ui/accessibility-and-internationalization/accessibility"><div><span>Accessibility</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/accessibility-and-internationalization/internationalization"><div><span>Internationalization</span></div></a></li></ul></li><li aria-hidden="true"><div class="sidenav-divider"></div></li><li class="nav-header">Beyond UI</li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-20" role="button" aria-expanded="false" aria-controls="sidenav-20"><span>Data & backend</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-20"><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-20-1" role="button" aria-expanded="false" aria-controls="sidenav-20-1"><span>State management</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-20-1"><li class="nav-item"><a class="nav-link" href="/data-and-backend/state-mgmt/intro"><div><span>Introduction</span></div></a></li><li class="nav-item"><a class="nav-link" href="/data-and-backend/state-mgmt/declarative"><div><span>Think declaratively</span></div></a></li><li class="nav-item"><a class="nav-link" href="/data-and-backend/state-mgmt/ephemeral-vs-app"><div><span>Ephemeral vs app state</span></div></a></li><li class="nav-item"><a class="nav-link" href="/data-and-backend/state-mgmt/simple"><div><span>Simple app state management</span></div></a></li><li class="nav-item"><a class="nav-link" href="/data-and-backend/state-mgmt/options"><div><span>Options</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-20-2" role="button" aria-expanded="false" aria-controls="sidenav-20-2"><span>Networking & http</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-20-2"><li class="nav-item"><a class="nav-link" href="/data-and-backend/networking"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/networking/fetch-data"><div><span>Fetch data from the internet</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/networking/authenticated-requests"><div><span>Make authenticated requests</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/networking/send-data"><div><span>Send data to the internet</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/networking/update-data"><div><span>Update data over the internet</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/networking/delete-data"><div><span>Delete data on the internet</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/networking/web-sockets"><div><span>Communicate with WebSockets</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-20-3" role="button" aria-expanded="false" aria-controls="sidenav-20-3"><span>Serialization</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-20-3"><li class="nav-item"><a class="nav-link" href="/data-and-backend/serialization/json"><div><span>JSON serialization</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/networking/background-parsing"><div><span>Parse JSON in the background</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-20-4" role="button" aria-expanded="false" aria-controls="sidenav-20-4"><span>Persistence</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-20-4"><li class="nav-item"><a class="nav-link" href="/cookbook/persistence/key-value"><div><span>Store key-value data on disk</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/persistence/reading-writing-files"><div><span>Read and write files</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/persistence/sqlite"><div><span>Persist data with SQLite</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-20-5" role="button" aria-expanded="false" aria-controls="sidenav-20-5"><span>Firebase</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-20-5"><li class="nav-item"><a class="nav-link" href="/data-and-backend/firebase"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://firebase.google.com/docs/flutter/setup" target="_blank" rel="noopener"><div><span>Add Firebase to your Flutter app</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li></ul></li><li class="nav-item"><a class="nav-link" href="/data-and-backend/google-apis"><div><span>Google APIs</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-21" role="button" aria-expanded="false" aria-controls="sidenav-21"><span>App architecture</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-21"><li class="nav-item"><a class="nav-link" href="/app-architecture"><div><span>Introduction</span></div></a></li><li class="nav-item"><a class="nav-link" href="/app-architecture/concepts"><div><span>Architecture concepts</span></div></a></li><li class="nav-item"><a class="nav-link" href="/app-architecture/guide"><div><span>Guide to app architecture</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-21-4" role="button" aria-expanded="false" aria-controls="sidenav-21-4"><span>Architecture case study</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-21-4"><li class="nav-item"><a class="nav-link" href="/app-architecture/case-study"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/app-architecture/case-study/ui-layer"><div><span>UI layer</span></div></a></li><li class="nav-item"><a class="nav-link" href="/app-architecture/case-study/data-layer"><div><span>Data layer</span></div></a></li><li class="nav-item"><a class="nav-link" href="/app-architecture/case-study/dependency-injection"><div><span>Dependency injection</span></div></a></li><li class="nav-item"><a class="nav-link" href="/app-architecture/case-study/testing"><div><span>Testing each layer</span></div></a></li></ul></li><li class="nav-item"><a class="nav-link" href="/app-architecture/recommendations"><div><span>Recommendations</span></div></a></li><li class="nav-item"><a class="nav-link" href="/app-architecture/design-patterns"><div><span>Design patterns</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-22" role="button" aria-expanded="false" aria-controls="sidenav-22"><span>Platform integration</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-22"><li class="nav-item"><a class="nav-link" href="/reference/supported-platforms"><div><span>Supported platforms</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/desktop"><div><span>Build desktop apps with Flutter</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/platform-channels"><div><span>Write platform-specific code</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-22-4" role="button" aria-expanded="false" aria-controls="sidenav-22-4"><span>Android</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-22-4"><li class="nav-item"><a class="nav-link" href="/platform-integration/android/install-android"><div><span>Add Android as build target</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/android/splash-screen"><div><span>Add a splash screen</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/android/predictive-back"><div><span>Add predictive back</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/android/c-interop"><div><span>Bind to native code</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/android/platform-views"><div><span>Host a native Android view</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/android/call-jetpack-apis"><div><span>Calling JetPack APIs</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/android/compose-activity"><div><span>Launch a Jetpack Compose activity</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/android/restore-state-android"><div><span>Restore state on Android</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/android/chromeos"><div><span>Target ChromeOS with Android</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-22-5" role="button" aria-expanded="false" aria-controls="sidenav-22-5"><span>iOS</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-22-5"><li class="nav-item"><a class="nav-link" href="/platform-integration/ios/install-ios"><div><span>Add iOS as build target</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/ios/ios-latest"><div><span>Flutter on latest iOS</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/ios/apple-frameworks"><div><span>Leverage Apple's system libraries</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/ios/launch-screen"><div><span>Add a launch screen</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/ios/ios-app-clip"><div><span>Add iOS App Clip support</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/ios/app-extensions"><div><span>Add iOS app extensions</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/ios/c-interop"><div><span>Bind to native code</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/ios/platform-views"><div><span>Host a native iOS view</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/ios/ios-debugging"><div><span>Enable debugging on iOS</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/ios/restore-state-ios"><div><span>Restore state on iOS</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-22-6" role="button" aria-expanded="false" aria-controls="sidenav-22-6"><span>Linux</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-22-6"><li class="nav-item"><a class="nav-link" href="/platform-integration/linux/install-linux"><div><span>Add Linux as build target</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/linux/building"><div><span>Build a Linux app</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-22-7" role="button" aria-expanded="false" aria-controls="sidenav-22-7"><span>macOS</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-22-7"><li class="nav-item"><a class="nav-link" href="/platform-integration/macos/install-macos"><div><span>Add macOS as build target</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/macos/building"><div><span>Build a macOS app</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/macos/c-interop"><div><span>Bind to native code</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/macos/platform-views"><div><span>Host a native macOS view</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-22-8" role="button" aria-expanded="false" aria-controls="sidenav-22-8"><span>Web</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-22-8"><li class="nav-item"><a class="nav-link" href="/platform-integration/web"><div><span>Web support in Flutter</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/web/install-web"><div><span>Add web as build target</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/web/building"><div><span>Build a web app</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/web/wasm"><div><span>Compile to WebAssembly</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/web/initialization"><div><span>Customize app initialization</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/web/embedding-flutter-web"><div><span>Add Flutter to any web app</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/web/web-content-in-flutter"><div><span>Web content in Flutter</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/web/renderers"><div><span>Web renderers</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/web/web-images"><div><span>Display images on the web</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/web/faq"><div><span>Web FAQ</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-22-9" role="button" aria-expanded="false" aria-controls="sidenav-22-9"><span>Windows</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-22-9"><li class="nav-item"><a class="nav-link" href="/platform-integration/windows/install-windows"><div><span>Add Windows as build target</span></div></a></li><li class="nav-item"><a class="nav-link" href="/platform-integration/windows/building"><div><span>Build a Windows app</span></div></a></li></ul></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-23" role="button" aria-expanded="false" aria-controls="sidenav-23"><span>Packages & plugins</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-23"><li class="nav-item"><a class="nav-link" href="/packages-and-plugins/using-packages"><div><span>Use packages & plugins</span></div></a></li><li class="nav-item"><a class="nav-link" href="/packages-and-plugins/developing-packages"><div><span>Develop packages & plugins</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-23-3" role="button" aria-expanded="false" aria-controls="sidenav-23-3"><span>Swift Package Manager</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-23-3"><li class="nav-item"><a class="nav-link" href="/packages-and-plugins/swift-package-manager/for-app-developers"><div><span>For app developers</span></div></a></li><li class="nav-item"><a class="nav-link" href="/packages-and-plugins/swift-package-manager/for-plugin-authors"><div><span>For plugin authors</span></div></a></li></ul></li><div class="sidenav-divider"></div><li class="nav-item"><a class="nav-link" href="/packages-and-plugins/favorites"><div><span>Flutter Favorites</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://pub.dev/flutter" target="_blank" rel="noopener"><div><span>Package repository</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link active collapsible" data-toggle="collapse" data-target="#sidenav-24" role="button" aria-expanded="true" aria-controls="sidenav-24"><span>Testing & debugging</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse show" id="sidenav-24"><li class="nav-header">Testing</li><li class="nav-item"><a class="nav-link" href="/testing/overview"><div><span>Overview</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-24-3" role="button" aria-expanded="false" aria-controls="sidenav-24-3"><span>Unit testing</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-24-3"><li class="nav-item"><a class="nav-link" href="/cookbook/testing/unit/introduction"><div><span>Introduction</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/testing/unit/mocking"><div><span>Mock dependencies</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-24-4" role="button" aria-expanded="false" aria-controls="sidenav-24-4"><span>Widget testing</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-24-4"><li class="nav-item"><a class="nav-link" href="/cookbook/testing/widget/introduction"><div><span>Introduction</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/testing/widget/finders"><div><span>Find widgets</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/testing/widget/scrolling"><div><span>Simulate scrolling</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/testing/widget/tap-drag"><div><span>Simulate user interaction</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link active collapsible" data-toggle="collapse" data-target="#sidenav-24-5" role="button" aria-expanded="true" aria-controls="sidenav-24-5"><span>Integration testing</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse show" id="sidenav-24-5"><li class="nav-item"><a class="nav-link" href="/cookbook/testing/integration/introduction"><div><span>Introduction</span></div></a></li><li class="nav-item"><a class="nav-link active" href="/testing/integration-tests"><div><span>Write and run an integration test</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/testing/integration/profiling"><div><span>Profile an integration test</span></div></a></li></ul></li><li class="nav-item"><a class="nav-link" href="/testing/testing-plugins"><div><span>Test a plugin</span></div></a></li><li class="nav-item"><a class="nav-link" href="/testing/plugins-in-tests"><div><span>Handle plugin code in tests</span></div></a></li><li class="nav-header">Debugging</li><li class="nav-item"><a class="nav-link" href="/testing/debugging"><div><span>Debugging tools</span></div></a></li><li class="nav-item"><a class="nav-link" href="/testing/code-debugging"><div><span>Debug your app programmatically</span></div></a></li><li class="nav-item"><a class="nav-link" href="/testing/native-debugging"><div><span>Use a native language debugger</span></div></a></li><li class="nav-item"><a class="nav-link" href="/testing/common-errors"><div><span>Common Flutter errors</span></div></a></li><li class="nav-item"><a class="nav-link" href="/testing/errors"><div><span>Handle errors</span></div></a></li><li class="nav-item"><a class="nav-link" href="/cookbook/maintenance/error-reporting"><div><span>Report errors to a service</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-25" role="button" aria-expanded="false" aria-controls="sidenav-25"><span>Performance & optimization</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-25"><li class="nav-item"><a class="nav-link" href="/perf"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/perf/impeller"><div><span>Impeller</span></div></a></li><li class="nav-item"><a class="nav-link" href="/perf/best-practices"><div><span>Performance best practices</span></div></a></li><li class="nav-item"><a class="nav-link" href="/perf/app-size"><div><span>App size</span></div></a></li><li class="nav-item"><a class="nav-link" href="/perf/deferred-components"><div><span>Deferred components</span></div></a></li><li class="nav-item"><a class="nav-link" href="/perf/rendering-performance"><div><span>Rendering performance</span></div></a></li><li class="nav-item"><a class="nav-link" href="/perf/ui-performance"><div><span>Performance profiling</span></div></a></li><li class="nav-item"><a class="nav-link" href="/perf/web-performance"><div><span>Performance profiling for web</span></div></a></li><li class="nav-item"><a class="nav-link" href="/perf/metrics"><div><span>Performance metrics</span></div></a></li><li class="nav-item"><a class="nav-link" href="/perf/isolates"><div><span>Concurrency and isolates</span></div></a></li><li class="nav-item"><a class="nav-link" href="/perf/faq"><div><span>Performance FAQ</span></div></a></li><li class="nav-item"><a class="nav-link" href="/perf/appendix"><div><span>Appendix</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-26" role="button" aria-expanded="false" aria-controls="sidenav-26"><span>Deployment</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-26"><li class="nav-item"><a class="nav-link" href="/deployment/obfuscate"><div><span>Obfuscate Dart code</span></div></a></li><li class="nav-item"><a class="nav-link" href="/deployment/flavors"><div><span>Create app flavors for Android</span></div></a></li><li class="nav-item"><a class="nav-link" href="/deployment/flavors-ios"><div><span>Create app flavors for iOS and macOS</span></div></a></li><li class="nav-item"><a class="nav-link" href="/deployment/android"><div><span>Build and release an Android app</span></div></a></li><li class="nav-item"><a class="nav-link" href="/deployment/ios"><div><span>Build and release an iOS app</span></div></a></li><li class="nav-item"><a class="nav-link" href="/deployment/macos"><div><span>Build and release a macOS app</span></div></a></li><li class="nav-item"><a class="nav-link" href="/deployment/linux"><div><span>Build and release a Linux app</span></div></a></li><li class="nav-item"><a class="nav-link" href="/deployment/windows"><div><span>Build and release a Windows app</span></div></a></li><li class="nav-item"><a class="nav-link" href="/deployment/web"><div><span>Build and release a web app</span></div></a></li><li class="nav-item"><a class="nav-link" href="/deployment/cd"><div><span>Set up continuous deployment</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-27" role="button" aria-expanded="false" aria-controls="sidenav-27"><span>Add to an existing app</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-27"><li class="nav-item"><a class="nav-link" href="/add-to-app"><div><span>Introduction</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-27-2" role="button" aria-expanded="false" aria-controls="sidenav-27-2"><span>Add to an Android app</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-27-2"><li class="nav-item"><a class="nav-link" href="/add-to-app/android/project-setup"><div><span>Set up Android project</span></div></a></li><li class="nav-item"><a class="nav-link" href="/add-to-app/android/add-flutter-screen"><div><span>Add a single Flutter screen</span></div></a></li><li class="nav-item"><a class="nav-link" href="/add-to-app/android/add-flutter-fragment"><div><span>Add a Flutter Fragment</span></div></a></li><li class="nav-item"><a class="nav-link" href="/add-to-app/android/add-flutter-view"><div><span>Add a Flutter View</span></div></a></li><li class="nav-item"><a class="nav-link" href="/add-to-app/android/plugin-setup"><div><span>Use a Flutter plugin</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-27-3" role="button" aria-expanded="false" aria-controls="sidenav-27-3"><span>Add to an iOS app</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-27-3"><li class="nav-item"><a class="nav-link" href="/add-to-app/ios/project-setup"><div><span>Set up iOS project</span></div></a></li><li class="nav-item"><a class="nav-link" href="/add-to-app/ios/add-flutter-screen"><div><span>Add a single Flutter screen</span></div></a></li></ul></li><li class="nav-item"><a class="nav-link" href="/platform-integration/web/embedding-flutter-web"><div><span>Add to a web app</span></div></a></li><li class="nav-item"><a class="nav-link" href="/add-to-app/debugging"><div><span>Debug embedded Flutter module</span></div></a></li><li class="nav-item"><a class="nav-link" href="/add-to-app/multiple-flutters"><div><span>Add multiple Flutter instances</span></div></a></li><li class="nav-item"><a class="nav-link" href="/add-to-app/performance"><div><span>Loading sequence and performance</span></div></a></li></ul></li><li aria-hidden="true"><div class="sidenav-divider"></div></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-29" role="button" aria-expanded="false" aria-controls="sidenav-29"><span>Tools & editors</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-29"><li class="nav-item"><a class="nav-link" href="/tools/android-studio"><div><span>Android Studio & IntelliJ</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/vs-code"><div><span>Visual Studio Code</span></div></a></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-29-3" role="button" aria-expanded="false" aria-controls="sidenav-29-3"><span>DevTools</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-29-3"><li class="nav-item"><a class="nav-link" href="/tools/devtools"><div><span>Overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/devtools/android-studio"><div><span>Run from Android Studio & IntelliJ</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/devtools/vscode"><div><span>Run from VS Code</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/devtools/cli"><div><span>Run from command line</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/devtools/inspector"><div><span>Flutter inspector</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/devtools/legacy-inspector"><div><span>Legacy Flutter inspector</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/devtools/performance"><div><span>Performance view</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/devtools/cpu-profiler"><div><span>CPU Profiler view</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/devtools/memory"><div><span>Memory view</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/devtools/console"><div><span>Debug console view</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/devtools/network"><div><span>Network view</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/devtools/debugger"><div><span>Debugger</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/devtools/logging"><div><span>Logging view</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/devtools/app-size"><div><span>App size tool</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/devtools/extensions"><div><span>DevTools extensions</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/devtools/deep-links"><div><span>Validate deep links</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/devtools/release-notes"><div><span>Release notes</span></div></a></li></ul></li><li class="nav-item"><a class="nav-link" href="/tools/sdk"><div><span>SDK overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/pubspec"><div><span>Flutter's pubspec options</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/flutter-fix"><div><span>Automated fixes</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/formatting"><div><span>Code formatting</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-30" role="button" aria-expanded="false" aria-controls="sidenav-30"><span>Flutter concepts</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-30"><li class="nav-item"><a class="nav-link" href="/resources/architectural-overview"><div><span>Architectural overview</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/inside-flutter"><div><span>Inside Flutter</span></div></a></li><li class="nav-item"><a class="nav-link" href="/ui/layout/constraints"><div><span>Understanding constraints</span></div></a></li><li class="nav-item"><a class="nav-link" href="/testing/build-modes"><div><span>Flutter's build modes</span></div></a></li><li class="nav-item"><a class="nav-link" href="/tools/hot-reload"><div><span>Hot reload</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsed collapsible" data-toggle="collapse" data-target="#sidenav-31" role="button" aria-expanded="false" aria-controls="sidenav-31"><span>Resources</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-31"><li class="nav-item"><a class="nav-link" href="/resources/faq"><div><span>FAQ</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/books"><div><span>Books</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/videos"><div><span>Videos</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/courses"><div><span>Courses</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/bootstrap-into-dart"><div><span>Learn Dart</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/support"><div><span>Get support</span></div></a></li><div class="sidenav-divider"></div><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-31-8" role="button" aria-expanded="false" aria-controls="sidenav-31-8"><span>Contribute</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-31-8"><li class="nav-item"><a class="nav-link" href="/resources/bug-reports"><div><span>Create useful bug reports</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://github.com/flutter/flutter/blob/main/CONTRIBUTING.md" target="_blank" rel="noopener"><div><span>Contribute to Flutter</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li><li class="nav-item"><a class="nav-link" href="/resources/design-docs"><div><span>Discover proposed features</span></div></a></li></ul></li><li class="nav-item"><button class="nav-link collapsible collapsed" data-toggle="collapse" data-target="#sidenav-31-9" role="button" aria-expanded="false" aria-controls="sidenav-31-9"><span>Reference</span> <span class="material-symbols expander" aria-hidden="true">expand_more</span></button><ul class="nav collapse" id="sidenav-31-9"><li class="nav-item"><a class="nav-link" href="/dash"><div><span>Who is Dash?</span></div></a></li><li class="nav-item"><a class="nav-link" href="/reference/widgets"><div><span>Widget index</span></div></a></li><li class="nav-item"><a class="nav-link" href="/reference/flutter-cli"><div><span>flutter CLI</span></div></a></li><li class="nav-item"><a class="nav-link" href="https://api.flutter.dev" target="_blank" rel="noopener"><div><span>API docs</span><span class="material-symbols" aria-hidden="true">open_in_new</span></div></a></li></ul></li></ul></li></ul></nav></div><main class="site-content"><div id="site-toc--side" class="site-toc"><header class="site-toc__title">Contents</header><ul class="section-nav"><li class="toc-entry nav-item"><a class="nav-link" href="#introduction">Introduction</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#create-a-new-app-to-test">Create a new app to test</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#add-the-integration_test-dependency">Add the integration_test dependency</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#create-the-integration-test-files">Create the integration test files</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#write-the-integration-test">Write the integration test</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#run-integration-tests">Run integration tests</a><ul class="nav"><li class="toc-entry nav-item"><a class="nav-link" href="#test-on-a-desktop-platform">Test on a desktop platform</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#test-on-an-android-device">Test on an Android device</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#test-on-an-ios-device">Test on an iOS device</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#test-in-a-web-browser">Test in a web browser</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#test-in-firebase-test-lab-android">Test in Firebase Test Lab (Android)</a></li><li class="toc-entry nav-item"><a class="nav-link" href="#test-in-firebase-test-lab-ios">Test in Firebase Test Lab (iOS)</a></li></ul></li></ul></div><article><header class="site-content__title"><h1 id="document-title">Check app functionality with an integration test</h1><nav class="breadcrumbs" aria-label="breadcrumb"><ol vocab="https://schema.org/" typeof="BreadcrumbList"><li class="breadcrumb-item" property="itemListElement" typeof="ListItem"><a href="/testing" property="item" typeof="WebPage"><span property="name">Testing & debugging</span></a><meta property="position" content="0"><span class="material-symbols child-icon" aria-hidden="true">chevron_right</span></li><li class="breadcrumb-item active" property="itemListElement" typeof="ListItem" aria-current="page"><a href="/testing/integration-tests" property="item" typeof="WebPage"><span property="name">Check app functionality with an integration test</span></a><meta property="position" content="1"></li></ol></nav></header><div id="site-toc--inline" class="site-toc toc-collapsible toc-collapsed"><header class="site-toc__title">Contents <span class="site-toc--inline__toggle toc-toggle-down" title="Expand table of contents"><i class="material-symbols" aria-hidden="true">keyboard_arrow_down</i></span> <span class="site-toc--inline__toggle toc-toggle-up" title="Collapse table of contents"><i class="material-symbols" aria-hidden="true">keyboard_arrow_up</i></span></header><ul class="section-nav"><li class="toc-entry"><a href="#introduction">Introduction</a></li><li class="toc-entry"><a href="#create-a-new-app-to-test">Create a new app to test</a></li><li class="toc-entry"><a href="#add-the-integration_test-dependency">Add the integration_test dependency</a></li><li class="toc-entry"><a href="#create-the-integration-test-files">Create the integration test files</a></li><li class="toc-entry"><a href="#write-the-integration-test">Write the integration test</a></li><li class="toc-entry"><a href="#run-integration-tests">Run integration tests</a><ul><li class="toc-entry"><a href="#test-on-a-desktop-platform">Test on a desktop platform</a></li><li class="toc-entry"><a href="#test-on-an-android-device">Test on an Android device</a></li><li class="toc-entry"><a href="#test-on-an-ios-device">Test on an iOS device</a></li><li class="toc-entry"><a href="#test-in-a-web-browser">Test in a web browser</a></li><li class="toc-entry"><a href="#test-in-firebase-test-lab-android">Test in Firebase Test Lab (Android)</a></li><li class="toc-entry"><a href="#test-in-firebase-test-lab-ios">Test in Firebase Test Lab (iOS)</a></li></ul></li></ul><span class="site-toc--inline__toggle toc-toggle-more-items" title="Expand table of contents"><i class="material-symbols" aria-hidden="true">more_horiz</i></span></div> <?code-excerpt path-base="testing/integration_tests/how_to"?> <div class="header-wrapper"><h2 id="introduction">Introduction</h2><a class="heading-link" href="#introduction" aria-label="Link to 'Introduction' section">#</a></div><p>This guide describes how to run integration tests with your Flutter app. With it, you'll learn how to do the following:</p><ul><li>Set up integration tests.</li><li>Verify if an app displays specific text.</li><li>Tap specific widgets.</li><li>Run integration tests.</li></ul><p>The guide references the <code>counter_app</code> project that comes with Flutter and the Flutter <a href="https://github.com/flutter/flutter/tree/main/packages/integration_test#integration_test"><code>integration_test</code></a> package. The <code>integration_test</code> package lets you:</p><ul><li>Use the <code>flutter drive</code> command to run tests on a physical device or emulator.</li><li>Run on <a href="https://firebase.google.com/docs/test-lab">Firebase Test Lab</a>, to automate testing on a variety of devices.</li><li>Use <a href="https://api.flutter.dev/flutter/flutter_test/flutter_test-library.html">flutter_test</a> APIs to write tests in a style similar to <a href="/testing/overview#widget-tests">widget tests</a>.</li></ul><div class="header-wrapper"><h2 id="create-a-new-app-to-test">Create a new app to test</h2><a class="heading-link" href="#create-a-new-app-to-test" aria-label="Link to 'Create a new app to test' section">#</a></div><p>Integration testing requires an app to test. This example uses the built-in <strong>Counter App</strong> example that Flutter produces when you run the <code>flutter create</code> command. The counter app allows a user to tap on a button to increase a counter.</p><ol><li><p>To create an instance of the built-in Flutter app, run the following command in your terminal:</p><div class="code-block-wrapper language-console"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#222222" class="undefined terminal-command">flutter create counter_app</span></span></code></pre></div></div></li><li><p>Change into the <code>counter_app</code> directory.</p></li><li><p>Open <code>lib/main.dart</code> in your preferred IDE.</p></li><li><p>Add a <code>key</code> parameter to the <code>floatingActionButton()</code> widget with an instance of a <code>Key</code> class with a string value of <code>increment</code>.</p><div class="code-block-wrapper language-dart"><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#222222"> floatingActionButton: </span><span style="color:#0468D7">FloatingActionButton</span><span style="color:#222222">(</span></span> <span class="line"><span style="color:#222222"> </span><mark class="highlight"><span style="color:#222222">key: </span><span style="color:#BD2314">const</span><span style="color:#0468D7"> ValueKey</span><span style="color:#222222">(</span><span style="color:#0C7064">'increment'</span><span style="color:#222222">),</span></mark></span> <span class="line"><span style="color:#222222"> onPressed: _incrementCounter,</span></span> <span class="line"><span style="color:#222222"> tooltip: </span><span style="color:#0C7064">'Increment'</span><span style="color:#222222">,</span></span> <span class="line"><span style="color:#222222"> child: </span><span style="color:#BD2314">const</span><span style="color:#0468D7"> Icon</span><span style="color:#222222">(</span><span style="color:#0468D7">Icons</span><span style="color:#222222">.add),</span></span> <span class="line"><span style="color:#222222"> ),</span></span></code></pre></div></div></li><li><p>Save your <code>lib/main.dart</code> file.</p></li></ol><p>After these changes, the <code>lib/main.dart</code> file should resemble the following code.</p> <?code-excerpt "lib/main.dart"?> <div class="code-block-wrapper language-dart"><div class="code-block-header">lib/main.dart</div><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#BD2314">import</span><span style="color:#0C7064"> 'package:flutter/material.dart'</span><span style="color:#222222">;</span></span> <span class="line"></span> <span class="line"><span style="color:#BD2314">void</span><span style="color:#6200EE"> main</span><span style="color:#222222">() => </span><span style="color:#6200EE">runApp</span><span style="color:#222222">(</span><span style="color:#BD2314">const</span><span style="color:#0468D7"> MyApp</span><span style="color:#222222">());</span></span> <span class="line"></span> <span class="line"><span style="color:#BD2314">class</span><span style="color:#0468D7"> MyApp</span><span style="color:#BD2314"> extends</span><span style="color:#0468D7"> StatelessWidget</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#BD2314"> const</span><span style="color:#0468D7"> MyApp</span><span style="color:#222222">({</span><span style="color:#BD2314">super</span><span style="color:#222222">.key});</span></span> <span class="line"></span> <span class="line"><span style="color:#BD2314"> @override</span></span> <span class="line"><span style="color:#0468D7"> Widget</span><span style="color:#6200EE"> build</span><span style="color:#222222">(</span><span style="color:#0468D7">BuildContext</span><span style="color:#222222"> context) {</span></span> <span class="line"><span style="color:#BD2314"> return</span><span style="color:#BD2314"> const</span><span style="color:#0468D7"> MaterialApp</span><span style="color:#222222">(</span></span> <span class="line"><span style="color:#222222"> title: </span><span style="color:#0C7064">'Counter App'</span><span style="color:#222222">,</span></span> <span class="line"><span style="color:#222222"> home: </span><span style="color:#0468D7">MyHomePage</span><span style="color:#222222">(title: </span><span style="color:#0C7064">'Counter App Home Page'</span><span style="color:#222222">),</span></span> <span class="line"><span style="color:#222222"> );</span></span> <span class="line"><span style="color:#222222"> }</span></span> <span class="line"><span style="color:#222222">}</span></span> <span class="line"></span> <span class="line"><span style="color:#BD2314">class</span><span style="color:#0468D7"> MyHomePage</span><span style="color:#BD2314"> extends</span><span style="color:#0468D7"> StatefulWidget</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#BD2314"> const</span><span style="color:#0468D7"> MyHomePage</span><span style="color:#222222">({</span><span style="color:#BD2314">super</span><span style="color:#222222">.key, </span><span style="color:#BD2314">required</span><span style="color:#BD2314"> this</span><span style="color:#222222">.title});</span></span> <span class="line"></span> <span class="line"><span style="color:#BD2314"> final</span><span style="color:#0468D7"> String</span><span style="color:#222222"> title;</span></span> <span class="line"></span> <span class="line"><span style="color:#BD2314"> @override</span></span> <span class="line"><span style="color:#0468D7"> State</span><span style="color:#222222">&#x3C;</span><span style="color:#0468D7">MyHomePage</span><span style="color:#222222">> </span><span style="color:#6200EE">createState</span><span style="color:#222222">() => </span><span style="color:#0468D7">_MyHomePageState</span><span style="color:#222222">();</span></span> <span class="line"><span style="color:#222222">}</span></span> <span class="line"></span> <span class="line"><span style="color:#BD2314">class</span><span style="color:#0468D7"> _MyHomePageState</span><span style="color:#BD2314"> extends</span><span style="color:#0468D7"> State</span><span style="color:#222222">&#x3C;</span><span style="color:#0468D7">MyHomePage</span><span style="color:#222222">> {</span></span> <span class="line"><span style="color:#0468D7"> int</span><span style="color:#222222"> _counter = </span><span style="color:#0C7064">0</span><span style="color:#222222">;</span></span> <span class="line"></span> <span class="line"><span style="color:#BD2314"> void</span><span style="color:#6200EE"> _incrementCounter</span><span style="color:#222222">() {</span></span> <span class="line"><span style="color:#6200EE"> setState</span><span style="color:#222222">(() {</span></span> <span class="line"><span style="color:#222222"> _counter++;</span></span> <span class="line"><span style="color:#222222"> });</span></span> <span class="line"><span style="color:#222222"> }</span></span> <span class="line"></span> <span class="line"><span style="color:#BD2314"> @override</span></span> <span class="line"><span style="color:#0468D7"> Widget</span><span style="color:#6200EE"> build</span><span style="color:#222222">(</span><span style="color:#0468D7">BuildContext</span><span style="color:#222222"> context) {</span></span> <span class="line"><span style="color:#BD2314"> return</span><span style="color:#0468D7"> Scaffold</span><span style="color:#222222">(</span></span> <span class="line"><span style="color:#222222"> appBar: </span><span style="color:#0468D7">AppBar</span><span style="color:#222222">(title: </span><span style="color:#0468D7">Text</span><span style="color:#222222">(widget.title)),</span></span> <span class="line"><span style="color:#222222"> body: </span><span style="color:#0468D7">Center</span><span style="color:#222222">(</span></span> <span class="line"><span style="color:#222222"> child: </span><span style="color:#0468D7">Column</span><span style="color:#222222">(</span></span> <span class="line"><span style="color:#222222"> mainAxisAlignment: </span><span style="color:#0468D7">MainAxisAlignment</span><span style="color:#222222">.center,</span></span> <span class="line"><span style="color:#222222"> children: &#x3C;</span><span style="color:#0468D7">Widget</span><span style="color:#222222">>[</span></span> <span class="line"><span style="color:#BD2314"> const</span><span style="color:#0468D7"> Text</span><span style="color:#222222">(</span><span style="color:#0C7064">'You have pushed the button this many times:'</span><span style="color:#222222">),</span></span> <span class="line"><span style="color:#0468D7"> Text</span><span style="color:#222222">(</span></span> <span class="line"><span style="color:#0C7064"> '</span><span style="color:#0C7064">$</span><span style="color:#222222">_counter</span><span style="color:#0C7064">'</span><span style="color:#222222">,</span></span> <span class="line"><span style="color:#222222"> style: </span><span style="color:#0468D7">Theme</span><span style="color:#222222">.</span><span style="color:#6200EE">of</span><span style="color:#222222">(context).textTheme.headlineMedium,</span></span> <span class="line"><span style="color:#222222"> ),</span></span> <span class="line"><span style="color:#222222"> ],</span></span> <span class="line"><span style="color:#222222"> ),</span></span> <span class="line"><span style="color:#222222"> ),</span></span> <span class="line"><span style="color:#222222"> floatingActionButton: </span><span style="color:#0468D7">FloatingActionButton</span><span style="color:#222222">(</span></span> <span class="line"><span style="color:#6E6E70"> // Provide a Key to this button. This allows finding this</span></span> <span class="line"><span style="color:#6E6E70"> // specific button inside the test suite, and tapping it.</span></span> <span class="line"><span style="color:#222222"> key: </span><span style="color:#BD2314">const</span><span style="color:#0468D7"> Key</span><span style="color:#222222">(</span><span style="color:#0C7064">'increment'</span><span style="color:#222222">),</span></span> <span class="line"><span style="color:#222222"> onPressed: _incrementCounter,</span></span> <span class="line"><span style="color:#222222"> tooltip: </span><span style="color:#0C7064">'Increment'</span><span style="color:#222222">,</span></span> <span class="line"><span style="color:#222222"> child: </span><span style="color:#BD2314">const</span><span style="color:#0468D7"> Icon</span><span style="color:#222222">(</span><span style="color:#0468D7">Icons</span><span style="color:#222222">.add),</span></span> <span class="line"><span style="color:#222222"> ),</span></span> <span class="line"><span style="color:#222222"> );</span></span> <span class="line"><span style="color:#222222"> }</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div><div class="header-wrapper"><h2 id="add-the-integration_test-dependency">Add the <code>integration_test</code> dependency</h2><a class="heading-link" href="#add-the-integration_test-dependency" aria-label="Link to 'Add the integration_test dependency' section">#</a></div><p>You need to add the testing packages to your new app.</p><p>To add <code>integration_test</code> and <code>flutter_test</code> packages as <code>dev_dependencies</code> using <code>sdk: flutter</code>, run following command.</p><div class="code-block-wrapper language-console"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#222222" class="undefined terminal-command">flutter pub add </span><span style="color:#0C7064">'dev:integration_test:{"sdk":"flutter"}'</span></span></code></pre></div></div><p>Output:</p><div class="code-block-wrapper language-console"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#222222">Building flutter tool...</span></span> <span class="line"><span style="color:#222222">Resolving dependencies... </span></span> <span class="line"><span style="color:#222222">Got dependencies.</span></span> <span class="line"><span style="color:#222222">Resolving dependencies... </span></span> <span class="line"><span style="color:#222222">+ file 7.0.0</span></span> <span class="line"><span style="color:#222222">+ flutter_driver 0.0.0 from sdk flutter</span></span> <span class="line"><span style="color:#222222">+ fuchsia_remote_debug_protocol 0.0.0 from sdk flutter</span></span> <span class="line"><span style="color:#222222">+ integration_test 0.0.0 from sdk flutter</span></span> <span class="line"><span style="color:#222222">...</span></span> <span class="line"><span style="color:#222222"> test_api 0.6.1 (0.7.1 available)</span></span> <span class="line"><span style="color:#222222"> vm_service 13.0.0 (14.2.1 available)</span></span> <span class="line"><span style="color:#222222">+ webdriver 3.0.3</span></span> <span class="line"><span style="color:#222222">Changed 8 dependencies!</span></span> <span class="line"><span style="color:#222222">7 packages have newer versions incompatible with dependency constraints.</span></span> <span class="line"><span style="color:#222222">Try `flutter pub outdated` for more information.</span></span></code></pre></div></div><p>Updated <code>pubspec.yaml</code> file:</p><div class="code-block-wrapper language-yaml"><div class="code-block-header">pubspec.yaml</div><div class="code-block-body"><span class="code-block-language" title="Language yaml">yaml</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#6E6E70"># ...</span></span> <span class="line"><span style="color:#0468D7">dev_dependencies</span><span style="color:#222222">:</span></span> <span class="line"><span style="color:#6E6E70"> # ... added dependencies</span></span> <span class="line"><span style="color:#0468D7"> flutter_test</span><span style="color:#222222">:</span></span> <span class="line"><span style="color:#0468D7"> sdk</span><span style="color:#222222">: </span><span style="color:#0C7064">flutter</span></span> <span class="line"><span style="color:#0468D7"> flutter_lints</span><span style="color:#222222">: </span><span style="color:#0C7064">^5.0.0</span></span> <span class="line"><span style="color:#0468D7"> </span><mark class="highlight"><span style="color:#0468D7">integration_test</span><span style="color:#222222">:</span></mark></span> <span class="line"><span style="color:#0468D7"> </span><mark class="highlight"><span style="color:#0468D7">sdk</span><span style="color:#222222">: </span><span style="color:#0C7064">flutter</span></mark></span> <span class="line"><span style="color:#6E6E70"># ...</span></span></code></pre></div></div><div class="header-wrapper"><h2 id="create-the-integration-test-files">Create the integration test files</h2><a class="heading-link" href="#create-the-integration-test-files" aria-label="Link to 'Create the integration test files' section">#</a></div><p>Integration tests reside in a separate directory inside your Flutter project.</p><ol><li>Create a new directory named <code>integration_test</code>.</li><li>Add empty file named <code>app_test.dart</code> in that directory.</li></ol><p>The resulting directory tree should resemble the following:</p><div class="code-block-wrapper language-plaintext"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span>counter_app/</span></span> <span class="line"><span> lib/</span></span> <span class="line"><span> main.dart</span></span> <span class="line"><span> integration_test/</span></span> <span class="line"><span> app_test.dart</span></span></code></pre></div></div><div class="header-wrapper"><h2 id="write-the-integration-test">Write the integration test</h2><a class="heading-link" href="#write-the-integration-test" aria-label="Link to 'Write the integration test' section">#</a></div><p>The integration test file consists of a Dart code file with dependencies on <code>integration_test</code>, <code>flutter_test</code>, and your app's Dart file.</p><ol><li><p>Open your <code>integration_test/app_test.dart</code> file in your preferred IDE.</p></li><li><p>Copy the following code and paste it into your <code>integration_test/app_test.dart</code> file. The last import should point to the <code>main.dart</code> file of your <code>counter_app</code>. (This <code>import</code> points to the example app called <code>introduction</code>.)</p> <?code-excerpt "integration_test/counter_test.dart (initial)" replace="/introduction/counter_app/g"?> <div class="code-block-wrapper language-dart"><div class="code-block-header">integration_test/counter_test.dart</div><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#BD2314">import</span><span style="color:#0C7064"> 'package:flutter/material.dart'</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#BD2314">import</span><span style="color:#0C7064"> 'package:flutter_test/flutter_test.dart'</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#BD2314">import</span><span style="color:#0C7064"> 'package:how_to/main.dart'</span><span style="color:#222222">;</span></span> <span class="line"><span style="color:#BD2314">import</span><span style="color:#0C7064"> 'package:integration_test/integration_test.dart'</span><span style="color:#222222">;</span></span> <span class="line"></span> <span class="line"><span style="color:#BD2314">void</span><span style="color:#6200EE"> main</span><span style="color:#222222">() {</span></span> <span class="line"><span style="color:#0468D7"> IntegrationTestWidgetsFlutterBinding</span><span style="color:#222222">.</span><span style="color:#6200EE">ensureInitialized</span><span style="color:#222222">();</span></span> <span class="line"></span> <span class="line"><span style="color:#6200EE"> group</span><span style="color:#222222">(</span><span style="color:#0C7064">'end-to-end test'</span><span style="color:#222222">, () {</span></span> <span class="line"><span style="color:#6200EE"> testWidgets</span><span style="color:#222222">(</span><span style="color:#0C7064">'tap on the floating action button, verify counter'</span><span style="color:#222222">, (</span></span> <span class="line"><span style="color:#222222"> tester,</span></span> <span class="line"><span style="color:#222222"> ) </span><span style="color:#BD2314">async</span><span style="color:#222222"> {</span></span> <span class="line"><span style="color:#6E6E70"> // Load app widget.</span></span> <span class="line"><span style="color:#BD2314"> await</span><span style="color:#222222"> tester.</span><span style="color:#6200EE">pumpWidget</span><span style="color:#222222">(</span><span style="color:#BD2314">const</span><span style="color:#0468D7"> MyApp</span><span style="color:#222222">());</span></span> <span class="line"></span> <span class="line"><span style="color:#6E6E70"> // Verify the counter starts at 0.</span></span> <span class="line"><span style="color:#6200EE"> expect</span><span style="color:#222222">(find.</span><span style="color:#6200EE">text</span><span style="color:#222222">(</span><span style="color:#0C7064">'0'</span><span style="color:#222222">), findsOneWidget);</span></span> <span class="line"></span> <span class="line"><span style="color:#6E6E70"> // Finds the floating action button to tap on.</span></span> <span class="line"><span style="color:#BD2314"> final</span><span style="color:#222222"> fab = find.</span><span style="color:#6200EE">byKey</span><span style="color:#222222">(</span><span style="color:#BD2314">const</span><span style="color:#0468D7"> ValueKey</span><span style="color:#222222">(</span><span style="color:#0C7064">'increment'</span><span style="color:#222222">));</span></span> <span class="line"></span> <span class="line"><span style="color:#6E6E70"> // Emulate a tap on the floating action button.</span></span> <span class="line"><span style="color:#BD2314"> await</span><span style="color:#222222"> tester.</span><span style="color:#6200EE">tap</span><span style="color:#222222">(fab);</span></span> <span class="line"></span> <span class="line"><span style="color:#6E6E70"> // Trigger a frame.</span></span> <span class="line"><span style="color:#BD2314"> await</span><span style="color:#222222"> tester.</span><span style="color:#6200EE">pumpAndSettle</span><span style="color:#222222">();</span></span> <span class="line"></span> <span class="line"><span style="color:#6E6E70"> // Verify the counter increments by 1.</span></span> <span class="line"><span style="color:#6200EE"> expect</span><span style="color:#222222">(find.</span><span style="color:#6200EE">text</span><span style="color:#222222">(</span><span style="color:#0C7064">'1'</span><span style="color:#222222">), findsOneWidget);</span></span> <span class="line"><span style="color:#222222"> });</span></span> <span class="line"><span style="color:#222222"> });</span></span> <span class="line"><span style="color:#222222">}</span></span></code></pre></div></div></li></ol><p>This example goes through three steps:</p><ol><li><p>Initialize <code>IntegrationTestWidgetsFlutterBinding</code>. This singleton service executes tests on a physical device.</p></li><li><p>Interact and test widgets using the <code>WidgetTester</code> class.</p></li><li><p>Test the important scenarios.</p></li></ol><div class="header-wrapper"><h2 id="run-integration-tests">Run integration tests</h2><a class="heading-link" href="#run-integration-tests" aria-label="Link to 'Run integration tests' section">#</a></div><p>The integration tests that run vary depending on the platform on which you test.</p><ul><li>To test a desktop platform, use the command line or a CI system.</li><li>To test a mobile platform, use the command line or Firebase Test Lab.</li><li>To test in a web browser, use the command line.</li></ul><hr><div class="header-wrapper"><h3 id="test-on-a-desktop-platform">Test on a desktop platform</h3><a class="heading-link" href="#test-on-a-desktop-platform" aria-label="Link to 'Test on a desktop platform' section">#</a></div><details markdown="1"><summary>Expand if you test Linux apps using a CI system</summary><p>To test a Linux app, your CI system must invoke an X server first. In the GitHub Action, GitLab Runner, or similar configuration file, set the integration test to work <em>with</em> the <code>xvfb-run</code> tool.</p><p>Doing this invokes an X Window system into which Flutter can launch and test your Linux app.</p><p>As an example using GitHub Actions, your <code>jobs.setup.steps</code> should include a step resembling the following:</p><div class="code-block-wrapper language-yaml"><div class="code-block-body"><span class="code-block-language" title="Language yaml">yaml</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#222222"> - </span><span style="color:#0468D7">name</span><span style="color:#222222">: </span><span style="color:#0C7064">Run Integration Tests</span></span> <span class="line"><span style="color:#0468D7"> uses</span><span style="color:#222222">: </span><span style="color:#0C7064">username/xvfb-action@v1.1.2</span></span> <span class="line"><span style="color:#0468D7"> with</span><span style="color:#222222">:</span></span> <span class="line"><span style="color:#0468D7"> run</span><span style="color:#222222">: </span><span style="color:#0C7064">flutter test integration_test -d linux -r github</span></span></code></pre></div></div><p>This starts the integration test within an X Window.</p><p>If you don't configure your integration in this way, Flutter returns an error.</p><div class="code-block-wrapper language-console"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#222222">Building Linux application...</span></span> <span class="line"><span style="color:#222222">Error waiting for a debug connection: The log reader stopped unexpectedly, or never started.</span></span></code></pre></div></div></details><p>To test on a macOS, Windows, or Linux platform, complete the following tasks.</p><ol><li><p>Run the following command from the root of the project.</p><div class="code-block-wrapper language-console"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#222222" class="undefined terminal-command">flutter test integration_test/app_test.dart</span></span></code></pre></div></div></li><li><p>If offered a choice of platform to test, choose the desktop platform. Type <code>1</code> to choose the desktop platform.</p></li></ol><p>Based on platform, the command result should resemble the following output.</p><div class="tabs-wrapper"><ul class="nav nav-tabs" role="tablist"><li class="nav-item"><a class="nav-link active" data-tab-save-id="windows" id="121-tab" href="#121-tab-panel" role="tab" aria-controls="121-tab-panel" aria-selected="true">Windows</a></li><li class="nav-item"><a class="nav-link" data-tab-save-id="macos" id="122-tab" href="#122-tab-panel" role="tab" aria-controls="122-tab-panel" aria-selected="false">macOS</a></li><li class="nav-item"><a class="nav-link" data-tab-save-id="linux" id="123-tab" href="#123-tab-panel" role="tab" aria-controls="123-tab-panel" aria-selected="false">Linux</a></li></ul><div class="tab-content"><div class="tab-pane active" id="121-tab-panel" role="tabpanel" aria-labelledby="121-tab"><div class="code-block-wrapper language-powershell"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#222222">PS C:\path\to\counter_app> flutter test .\integration_test\app_test.dart</span></span> <span class="line"><span style="color:#222222">Resolving dependencies...</span></span> <span class="line"><span style="color:#222222">Downloading packages...</span></span> <span class="line"><span style="color:#222222"> flutter_lints </span><span style="color:#0C7064">3.0</span><span style="color:#222222">.</span><span style="color:#0C7064">2</span><span style="color:#222222"> (</span><span style="color:#0C7064">4.0</span><span style="color:#222222">.</span><span style="color:#0C7064">0</span><span style="color:#222222"> available)</span></span> <span class="line"><span style="color:#222222"> leak_tracker </span><span style="color:#0C7064">10.0</span><span style="color:#222222">.</span><span style="color:#0C7064">4</span><span style="color:#222222"> (</span><span style="color:#0C7064">10.0</span><span style="color:#222222">.</span><span style="color:#0C7064">5</span><span style="color:#222222"> available)</span></span> <span class="line"><span style="color:#222222"> leak_tracker_flutter_testing </span><span style="color:#0C7064">3.0</span><span style="color:#222222">.</span><span style="color:#0C7064">3</span><span style="color:#222222"> (</span><span style="color:#0C7064">3.0</span><span style="color:#222222">.</span><span style="color:#0C7064">5</span><span style="color:#222222"> available)</span></span> <span class="line"><span style="color:#222222"> lints </span><span style="color:#0C7064">3.0</span><span style="color:#222222">.</span><span style="color:#0C7064">0</span><span style="color:#222222"> (</span><span style="color:#0C7064">4.0</span><span style="color:#222222">.</span><span style="color:#0C7064">0</span><span style="color:#222222"> available)</span></span> <span class="line"><span style="color:#222222"> material_color_utilities </span><span style="color:#0C7064">0.8</span><span style="color:#222222">.</span><span style="color:#0C7064">0</span><span style="color:#222222"> (</span><span style="color:#0C7064">0.11</span><span style="color:#222222">.</span><span style="color:#0C7064">1</span><span style="color:#222222"> available)</span></span> <span class="line"><span style="color:#222222"> meta </span><span style="color:#0C7064">1.12</span><span style="color:#222222">.</span><span style="color:#0C7064">0</span><span style="color:#222222"> (</span><span style="color:#0C7064">1.15</span><span style="color:#222222">.</span><span style="color:#0C7064">0</span><span style="color:#222222"> available)</span></span> <span class="line"><span style="color:#222222"> test_api </span><span style="color:#0C7064">0.7</span><span style="color:#222222">.</span><span style="color:#0C7064">0</span><span style="color:#222222"> (</span><span style="color:#0C7064">0.7</span><span style="color:#222222">.</span><span style="color:#0C7064">1</span><span style="color:#222222"> available)</span></span> <span class="line"><span style="color:#222222"> vm_service </span><span style="color:#0C7064">14.2</span><span style="color:#222222">.</span><span style="color:#0C7064">1</span><span style="color:#222222"> (</span><span style="color:#0C7064">14.2</span><span style="color:#222222">.</span><span style="color:#0C7064">2</span><span style="color:#222222"> available)</span></span> <span class="line"><span style="color:#222222">Got dependencies!</span></span> <span class="line"><span style="color:#0C7064">8</span><span style="color:#222222"> packages have newer versions incompatible with dependency constraints.</span></span> <span class="line"><span style="color:#BD2314">Try</span><span style="color:#222222"> `flutter pub outdated` </span><span style="color:#BD2314">for</span><span style="color:#222222"> more information.</span></span> <span class="line"></span> <span class="line"><span style="color:#222222">Connected devices:</span></span> <span class="line"></span> <span class="line"><span style="color:#222222">Windows (desktop) • windows • windows-x64 • Microsoft Windows [</span><span style="color:#BD2314">Version</span><span style="color:#0C7064"> 10.0</span><span style="color:#222222">.</span><span style="color:#0C7064">22631.3593</span><span style="color:#222222">]</span></span> <span class="line"><span style="color:#222222">Chrome (web) • chrome • web-javascript • Google Chrome </span><span style="color:#0C7064">124.0</span><span style="color:#222222">.</span><span style="color:#0C7064">6367.207</span></span> <span class="line"><span style="color:#222222">Edge (web) • edge • web-javascript • Microsoft Edge </span><span style="color:#0C7064">124.0</span><span style="color:#222222">.</span><span style="color:#0C7064">2478.97</span></span> <span class="line"></span> <span class="line"><span style="color:#222222">[</span><span style="color:#0C7064">1</span><span style="color:#222222">]: Windows (windows)</span></span> <span class="line"><span style="color:#222222">[</span><span style="color:#0C7064">2</span><span style="color:#222222">]: Chrome (chrome)</span></span> <span class="line"><span style="color:#222222">[</span><span style="color:#0C7064">3</span><span style="color:#222222">]: Edge (edge)</span></span> <span class="line"></span> <span class="line"><span style="color:#222222">Please choose one (or </span><span style="color:#0C7064">"q"</span><span style="color:#222222"> to quit): </span><span style="color:#0C7064">1</span></span> <span class="line"></span> <span class="line"><span style="color:#0C7064">00</span><span style="color:#222222">:</span><span style="color:#0C7064">00</span><span style="color:#0C7064"> +0</span><span style="color:#222222">: loading C:/path/to/counter_app/integration_test/app_test.dart B</span></span> <span class="line"><span style="color:#0C7064">00</span><span style="color:#222222">:</span><span style="color:#0C7064">29</span><span style="color:#0C7064"> +0</span><span style="color:#222222">: loading C:/path/to/counter_app/counter_app/integration_test/app_test.dart </span><span style="color:#0C7064">29.</span><span style="color:#222222">1s</span></span> <span class="line"><span style="color:#222222">√ Built build\windows\x64\runner\Debug\</span><span style="color:#6200EE">counter_app.exe</span></span> <span class="line"><span style="color:#0C7064">00</span><span style="color:#222222">:</span><span style="color:#0C7064">31</span><span style="color:#0C7064"> +1</span><span style="color:#222222">: All tests passed!</span></span></code></pre></div></div></div><div class="tab-pane" id="122-tab-panel" role="tabpanel" aria-labelledby="122-tab"><div class="code-block-wrapper language-console"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#222222" class="undefined terminal-command">flutter test integration_test</span></span> <span class="line"><span style="color:#222222">Resolving dependencies... </span></span> <span class="line"><span style="color:#222222">Downloading packages... </span></span> <span class="line"><span style="color:#222222"> flutter_lints 3.0.2 (4.0.0 available)</span></span> <span class="line"><span style="color:#222222">> leak_tracker 10.0.4 (</span><span style="color:#6200EE">was</span><span style="color:#0C7064"> 10.0.0</span><span style="color:#222222">) (</span><span style="color:#6200EE">10.0.5</span><span style="color:#0C7064"> available</span><span style="color:#222222">)</span></span> <span class="line"><span style="color:#222222">> leak_tracker_flutter_testing 3.0.3 (</span><span style="color:#6200EE">was</span><span style="color:#0C7064"> 2.0.1</span><span style="color:#222222">) (</span><span style="color:#6200EE">3.0.5</span><span style="color:#0C7064"> available</span><span style="color:#222222">)</span></span> <span class="line"><span style="color:#222222">> leak_tracker_testing 3.0.1 (</span><span style="color:#6200EE">was</span><span style="color:#0C7064"> 2.0.1</span><span style="color:#222222">)</span></span> <span class="line"><span style="color:#222222"> lints 3.0.0 (4.0.0 available)</span></span> <span class="line"><span style="color:#222222"> material_color_utilities 0.8.0 (0.11.1 available)</span></span> <span class="line"><span style="color:#222222">> meta 1.12.0 (</span><span style="color:#6200EE">was</span><span style="color:#0C7064"> 1.11.0</span><span style="color:#222222">) (</span><span style="color:#6200EE">1.15.0</span><span style="color:#0C7064"> available</span><span style="color:#222222">)</span></span> <span class="line"><span style="color:#222222">> test_api 0.7.0 (</span><span style="color:#6200EE">was</span><span style="color:#0C7064"> 0.6.1</span><span style="color:#222222">) (</span><span style="color:#6200EE">0.7.1</span><span style="color:#0C7064"> available</span><span style="color:#222222">)</span></span> <span class="line"><span style="color:#222222">> vm_service 14.2.1 (</span><span style="color:#6200EE">was</span><span style="color:#0C7064"> 13.0.0</span><span style="color:#222222">) (</span><span style="color:#6200EE">14.2.2</span><span style="color:#0C7064"> available</span><span style="color:#222222">)</span></span> <span class="line"><span style="color:#222222">Changed 6 dependencies!</span></span> <span class="line"><span style="color:#222222">8 packages have newer versions incompatible with dependency constraints.</span></span> <span class="line"><span style="color:#222222">Try `flutter pub outdated` for more information.</span></span> <span class="line"></span> <span class="line"><span style="color:#222222">Connected devices:</span></span> <span class="line"></span> <span class="line"><span style="color:#222222">macOS (desktop) • macos • darwin-arm64 • macOS 14.4.1 23E224 darwin-arm64</span></span> <span class="line"><span style="color:#222222">Mac Designed for iPad (desktop) • mac-designed-for-ipad • darwin • macOS 14.4.1 23E224 darwin-arm64</span></span> <span class="line"><span style="color:#222222">Chrome (web) • chrome • web-javascript • Google Chrome 124.0.6367.208</span></span> <span class="line"></span> <span class="line"><span style="color:#222222">No wireless devices were found.</span></span> <span class="line"></span> <span class="line"><span style="color:#222222">[1]: macOS (macos)</span></span> <span class="line"><span style="color:#222222">[2]: Mac Designed for iPad (mac-designed-for-ipad)</span></span> <span class="line"><span style="color:#222222">[3]: Chrome (chrome)</span></span> <span class="line"><span style="color:#222222">Please choose one (or "q" to quit): 1</span></span> <span class="line"></span> <span class="line"><span style="color:#222222">00:01 +0: loading /path/to/counter_app/integration_test/app_test.dart R</span></span> <span class="line"><span style="color:#222222">00:02 +0: loading /path/to/counter_app/integration_test/app_test.dart 846ms</span></span> <span class="line"><span style="color:#222222">00:03 +0: loading /path/to/counter_app/integration_test/app_test.dart B</span></span> <span class="line"></span> <span class="line"><span style="color:#222222">Building macOS application...</span></span> <span class="line"><span style="color:#222222">✓ Built build/macos/Build/Products/Debug/counter_app.app</span></span> <span class="line"><span style="color:#222222">00:32 +1: All tests passed!</span></span></code></pre></div></div></div><div class="tab-pane" id="123-tab-panel" role="tabpanel" aria-labelledby="123-tab"><div class="code-block-wrapper language-console"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#222222" class="undefined terminal-command">flutter test integration_test/app_test.dart</span></span> <span class="line"></span> <span class="line"><span style="color:#222222">Connected devices:</span></span> <span class="line"></span> <span class="line"><span style="color:#222222">Linux (desktop) • linux • linux-x64 • Ubuntu 22.04.4 LTS 6.5.0-35-generic</span></span> <span class="line"><span style="color:#222222">Chrome (web) • chrome • web-javascript • Google Chrome 104.0.5112.101</span></span> <span class="line"></span> <span class="line"><span style="color:#222222">[1]: Linux (linux)</span></span> <span class="line"><span style="color:#222222">[2]: Chrome (chrome)</span></span> <span class="line"></span> <span class="line"><span style="color:#222222">Please choose one (or "q" to quit): 1</span></span> <span class="line"></span> <span class="line"><span style="color:#222222">00:00 +0: /path/to/counter_app/integration_test/app_test.dart B</span></span> <span class="line"><span style="color:#222222">00:16 +0: /path/to/counter_app/integration_test/app_test.dart</span></span> <span class="line"></span> <span class="line"><span style="color:#222222">✓ Built build/linux/x64/debug/bundle/counter_app</span></span></code></pre></div></div></div></div></div><hr><div class="header-wrapper"><h3 id="test-on-an-android-device">Test on an Android device</h3><a class="heading-link" href="#test-on-an-android-device" aria-label="Link to 'Test on an Android device' section">#</a></div><p>To test on a real Android device, complete the following tasks.</p><ol><li><p>Connect the Android device.</p></li><li><p>Run the following command from the root of the project.</p><div class="code-block-wrapper language-console"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#222222" class="undefined terminal-command">flutter test integration_test/app_test.dart</span></span></code></pre></div></div><p>The result should resemble the following output.</p><div class="code-block-wrapper language-console"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#222222" class="undefined terminal-command">flutter test integration_test/app_test.dart</span></span> <span class="line"><span style="color:#222222">00:04 +0: loading /path/to/counter_app/integration_test/app_test.dart</span></span> <span class="line"><span style="color:#222222">00:15 +0: loading /path/to/counter_app/integration_test/app_test.dart</span></span> <span class="line"><span style="color:#222222">00:18 +0: loading /path/to/counter_app/integration_test/app_test.dart 2,387ms</span></span> <span class="line"><span style="color:#222222">Installing build/app/outputs/flutter-apk/app.apk... 612ms</span></span> <span class="line"><span style="color:#222222">00:21 +1: All tests passed!</span></span></code></pre></div></div></li><li><p>Verify that the test removed the Counter App when it finished. If not, subsequent tests fail. If needed, press on the app and choose <strong>Remove App</strong> from the context menu.</p></li></ol><hr><div class="header-wrapper"><h3 id="test-on-an-ios-device">Test on an iOS device</h3><a class="heading-link" href="#test-on-an-ios-device" aria-label="Link to 'Test on an iOS device' section">#</a></div><p>To test on a real iOS device, complete the following tasks.</p><ol><li><p>Connect the iOS device.</p></li><li><p>Run the following command from the root of the project.</p><div class="code-block-wrapper language-console"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#222222" class="undefined terminal-command">flutter test integration_test/app_test.dart</span></span></code></pre></div></div><p>The result should resemble the following output.</p><div class="code-block-wrapper language-console"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#222222" class="undefined terminal-command">flutter test integration_test/app_test.dart</span></span> <span class="line"><span style="color:#222222">00:04 +0: loading /path/to/counter_app/integration_test/app_test.dart</span></span> <span class="line"><span style="color:#222222">00:15 +0: loading /path/to/counter_app/integration_test/app_test.dart</span></span> <span class="line"><span style="color:#222222">00:18 +0: loading /path/to/counter_app/integration_test/app_test.dart 2,387ms</span></span> <span class="line"><span style="color:#222222">Xcode build done. 13.5s</span></span> <span class="line"><span style="color:#222222">00:21 +1: All tests passed!</span></span></code></pre></div></div></li><li><p>Verify that the test removed the Counter App when it finished. If not, subsequent tests fail. If needed, press on the app and choose <strong>Remove App</strong> from the context menu.</p></li></ol><hr><div class="header-wrapper"><h3 id="test-in-a-web-browser">Test in a web browser</h3><a class="heading-link" href="#test-in-a-web-browser" aria-label="Link to 'Test in a web browser' section">#</a></div><p>To test in a web browser, perform the following steps.</p><ol><li><p>Install <a href="https://googlechromelabs.github.io/chrome-for-testing/">ChromeDriver</a> into the directory of your choice.</p><div class="code-block-wrapper language-console"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#222222" class="undefined terminal-command">npx @puppeteer/browsers install chromedriver@stable</span></span></code></pre></div></div><p>To simplify the install, this command uses the <a href="https://www.npmjs.com/package/@puppeteer/browsers"><code>@puppeteer/browsers</code></a> Node library.</p></li><li><p>Add the path to ChromeDriver to your <code>$PATH</code> environment variable.</p></li><li><p>Verify the ChromeDriver install succeeded.</p><div class="code-block-wrapper language-console"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#222222" class="undefined terminal-command">chromedriver --version</span></span> <span class="line"><span style="color:#222222">ChromeDriver 124.0.6367.60 (8771130bd84f76d855ae42fbe02752b03e352f17-refs/branch-heads/6367@{#798})</span></span></code></pre></div></div></li><li><p>In your <code>counter_app</code> project directory, create a new directory named <code>test_driver</code>.</p><div class="code-block-wrapper language-console"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#222222" class="undefined terminal-command">mkdir test_driver</span></span></code></pre></div></div></li><li><p>In this directory, create a new file named <code>integration_test.dart</code>.</p></li><li><p>Copy the following code and paste it into your <code>integration_test.dart</code> file.</p> <?code-excerpt "test_driver/integration_test.dart"?> <div class="code-block-wrapper language-dart"><div class="code-block-header">test_driver/integration_test.dart</div><div class="code-block-body"><span class="code-block-language" title="Language dart">dart</span><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#BD2314">import</span><span style="color:#0C7064"> 'package:integration_test/integration_test_driver.dart'</span><span style="color:#222222">;</span></span> <span class="line"></span> <span class="line"><span style="color:#0468D7">Future</span><span style="color:#222222">&#x3C;</span><span style="color:#BD2314">void</span><span style="color:#222222">> </span><span style="color:#6200EE">main</span><span style="color:#222222">() => </span><span style="color:#6200EE">integrationDriver</span><span style="color:#222222">();</span></span></code></pre></div></div></li><li><p>Launch <code>chromedriver</code> as follows:</p><div class="code-block-wrapper language-console"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#222222" class="undefined terminal-command">chromedriver --port=</span><span style="color:#0C7064">4444</span></span></code></pre></div></div></li><li><p>From the root of the project, run the following command:</p><div class="code-block-wrapper language-console"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#222222" class="undefined terminal-command">flutter drive \</span></span> <span class="line"><span style="color:#222222"> --driver=test_driver/integration_test.dart \</span></span> <span class="line"><span style="color:#222222"> --target=integration_test/app_test.dart \</span></span> <span class="line"><span style="color:#222222"> -d chrome</span></span></code></pre></div></div><p>The response should resemble the following output:</p><div class="code-block-wrapper language-console"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#222222">Resolving dependencies...</span></span> <span class="line"><span style="color:#222222"> leak_tracker 10.0.0 (10.0.5 available)</span></span> <span class="line"><span style="color:#222222"> leak_tracker_flutter_testing 2.0.1 (3.0.5 available)</span></span> <span class="line"><span style="color:#222222"> leak_tracker_testing 2.0.1 (3.0.1 available)</span></span> <span class="line"><span style="color:#222222"> material_color_utilities 0.8.0 (0.11.1 available)</span></span> <span class="line"><span style="color:#222222"> meta 1.11.0 (1.14.0 available)</span></span> <span class="line"><span style="color:#222222"> test_api 0.6.1 (0.7.1 available)</span></span> <span class="line"><span style="color:#222222"> vm_service 13.0.0 (14.2.1 available)</span></span> <span class="line"><span style="color:#222222">Got dependencies!</span></span> <span class="line"><span style="color:#222222">7 packages have newer versions incompatible with dependency constraints.</span></span> <span class="line"><span style="color:#222222">Try `flutter pub outdated` for more information.</span></span> <span class="line"><span style="color:#222222">Launching integration_test/app_test.dart on Chrome in debug mode...</span></span> <span class="line"><span style="color:#222222">Waiting for connection from debug service on Chrome... 10.9s</span></span> <span class="line"><span style="color:#222222">This app is linked to the debug service: ws://127.0.0.1:51523/3lofIjIdmbs=/ws</span></span> <span class="line"><span style="color:#222222">Debug service listening on ws://127.0.0.1:51523/3lofIjIdmbs=/ws</span></span> <span class="line"><span style="color:#222222">00:00 +0: end-to-end test tap on the floating action button, verify counter</span></span> <span class="line"><span style="color:#222222">00:01 +1: (tearDownAll)</span></span> <span class="line"><span style="color:#222222">00:01 +2: All tests passed!</span></span> <span class="line"><span style="color:#222222">All tests passed.</span></span> <span class="line"><span style="color:#222222">Application finished.</span></span></code></pre></div></div><p>To run this as a headless test, run <code>flutter drive</code> with <code>-d web-server</code> option:</p><div class="code-block-wrapper language-console"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#222222" class="undefined terminal-command">flutter drive \</span></span> <span class="line"><span style="color:#222222"> --driver=test_driver/integration_test.dart \</span></span> <span class="line"><span style="color:#222222"> --target=integration_test/app_test.dart \</span></span> <span class="line"><span style="color:#222222"> -d web-server</span></span></code></pre></div></div></li></ol><p>To learn more, see the <a href="https://github.com/flutter/flutter/blob/main/docs/contributing/testing/Running-Flutter-Driver-tests-with-Web.md">Running Flutter driver tests with web</a> wiki page.</p><hr><div class="header-wrapper"><h3 id="test-in-firebase-test-lab-android">Test in Firebase Test Lab (Android)</h3><a class="heading-link" href="#test-in-firebase-test-lab-android" aria-label="Link to 'Test in Firebase Test Lab (Android)' section">#</a></div><p>You can use Firebase Test Lab to test Android targets.</p><div class="header-wrapper"><h4 id="android-setup">Android setup</h4><a class="heading-link" href="#android-setup" aria-label="Link to 'Android setup' section">#</a></div><p>Follow the instructions in the <a href="https://github.com/flutter/flutter/tree/main/packages/integration_test#android-device-testing">Android Device Testing</a> section of the README.</p><div class="header-wrapper"><h4 id="test-lab-project-setup">Test Lab project setup</h4><a class="heading-link" href="#test-lab-project-setup" aria-label="Link to 'Test Lab project setup' section">#</a></div><ol><li><p>Launch your <a href="http://console.firebase.google.com/">Firebase Console</a>.</p></li><li><p>Create a new Firebase project if necessary.</p></li><li><p>Navigate to <strong>Quality &gt; Test Lab</strong>.</p><img src="/assets/images/docs/integration-test/test-lab-1.png" alt="Firebase Test Lab Console"></li></ol><div class="header-wrapper"><h4 id="upload-an-android-apk">Upload an Android APK</h4><a class="heading-link" href="#upload-an-android-apk" aria-label="Link to 'Upload an Android APK' section">#</a></div><p>Complete the following steps to upload an Android APK.</p><ol><li><p>Create an APK using Gradle.</p><div class="code-block-wrapper language-console"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#222222">// Go to the Android directory which contains the gradlew script</span></span> <span class="line"><span style="color:#222222" class="undefined terminal-command">pushd android</span></span> <span class="line"></span> <span class="line"><span style="color:#222222">// Build the APK for Flutter with gradlew </span></span> <span class="line"><span style="color:#222222" class="undefined terminal-command">flutter build apk</span></span> <span class="line"></span> <span class="line"><span style="color:#222222">// Build an Android test APK</span></span> <span class="line"><span style="color:#222222" class="undefined terminal-command">./gradlew app:assembleAndroidTest</span></span> <span class="line"></span> <span class="line"><span style="color:#222222">// Build a debug APK by passing in an integration test</span></span> <span class="line"><span style="color:#222222" class="undefined terminal-command">./gradlew app:assembleDebug -Ptarget=</span><span style="color:#0C7064">integration_test/</span><span style="color:#222222">&#x3C;</span><span style="color:#0C7064">name</span><span style="color:#222222">></span><span style="color:#0C7064">_test.dart</span></span></code></pre></div></div><ul><li><code>&lt;name&gt;_test.dart</code>: The file created in the <strong>Project Setup</strong> section.</li></ul></li><li><p>If needed, pass parameters into the integration test as a comma-separated list. Encode all parameters as <code>base64</code>.</p><div class="code-block-wrapper language-console"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#222222" class="undefined terminal-command">./gradlew project:task -Pdart-defines=</span><span style="color:#0C7064">"{base64 (key=value)}[, ...]"</span></span></code></pre></div></div><ul><li><code>(key=value)}[, ...]</code>: Replace this with a comma-separated list of key value pairs.</li></ul></li><li><p>Return to your previous directory.</p><div class="code-block-wrapper language-console"><div class="code-block-body"><pre class="shiki dash-light" tabindex="0"><code><span class="line"><span style="color:#222222" class="undefined terminal-command">popd</span></span></code></pre></div></div></li></ol><p>For additional instructions, see the <a href="https://github.com/flutter/flutter/tree/main/packages/integration_test#firebase-test-lab">Firebase Test Lab section of the README</a>.</p><div class="header-wrapper"><h4 id="start-robo-test">Start Robo test</h4><a class="heading-link" href="#start-robo-test" aria-label="Link to 'Start Robo test' section">#</a></div><p>To use Robo test to run integration tests, complete the following steps.</p><ol><li><p>Drag the debug APK from <code>&lt;flutter_project_directory&gt;/build/app/outputs/apk/debug</code> into the <strong>Android Robo Test</strong> target on the web page. For example:</p><img src="/assets/images/docs/integration-test/test-lab-2.png" alt="Firebase Test Lab upload"></li><li><p>Click <strong>Run a test</strong>.</p></li><li><p>Select the <strong>Instrumentation</strong> test type.</p></li><li><p>Add the App APK to the <strong>App APK or AAB</strong> box.</p><p><code>&lt;flutter_project_directory&gt;/build/app/outputs/apk/debug/&lt;file&gt;.apk</code></p></li><li><p>Add the Test APK to the <strong>Test APK</strong> box.</p><p><code>&lt;flutter_project_directory&gt;/build/app/outputs/apk/androidTest/debug/&lt;file&gt;.apk</code></p><img src="/assets/images/docs/integration-test/test-lab-3.png" alt="Firebase Test Lab upload two APKs"></li><li><p>If a failure occurs, click the red icon to view the output:</p><img src="/assets/images/docs/integration-test/test-lab-4.png" alt="Firebase Test Lab test results"></li></ol><hr><div class="header-wrapper"><h3 id="test-in-firebase-test-lab-ios">Test in Firebase Test Lab (iOS)</h3><a class="heading-link" href="#test-in-firebase-test-lab-ios" aria-label="Link to 'Test in Firebase Test Lab (iOS)' section">#</a></div><p>You can use Firebase Test Lab to test iOS targets.</p><div class="header-wrapper"><h4 id="ios-setup">iOS setup</h4><a class="heading-link" href="#ios-setup" aria-label="Link to 'iOS setup' section">#</a></div><p>Follow the <a href="https://github.com/flutter/flutter/tree/main/packages/integration_test#ios-device-testing">iOS Device Testing instructions</a>.</p><div class="header-wrapper"><h4 id="test-lab-project-setup-1">Test Lab project setup</h4><a class="heading-link" href="#test-lab-project-setup-1" aria-label="Link to 'Test Lab project setup' section">#</a></div><ol><li><p>Launch your <a href="http://console.firebase.google.com/">Firebase Console</a>.</p></li><li><p>Create a new Firebase project if necessary.</p></li><li><p>Navigate to <strong>Quality &gt; Test Lab</strong>.</p><img src="/assets/images/docs/integration-test/test-lab-1.png" alt="Firebase Test Lab Console"></li></ol><div class="header-wrapper"><h4 id="upload-xcode-tests-through-the-firebase-console">Upload Xcode tests through the Firebase Console</h4><a class="heading-link" href="#upload-xcode-tests-through-the-firebase-console" aria-label="Link to 'Upload Xcode tests through the Firebase Console' section">#</a></div><p>To learn how to upload tests from a ZIP file, using the Firebase Test Lab Console, consult the <a href="https://firebase.google.com/docs/test-lab/ios/firebase-console">Firebase Test Lab iOS instructions</a>.</p><div class="header-wrapper"><h4 id="upload-xcode-tests-to-firebase-console-with-the-command-line">Upload Xcode tests to Firebase Console with the command line</h4><a class="heading-link" href="#upload-xcode-tests-to-firebase-console-with-the-command-line" aria-label="Link to 'Upload Xcode tests to Firebase Console with the command line' section">#</a></div><p>To learn how to upload tests from a ZIP file from the command line to the Firebase Test Lab Console, consult the <a href="https://github.com/flutter/flutter/tree/main/packages/integration_test#ios-device-testing">iOS Device Testing instructions</a>.</p><p id="page-github-links"><span>Unless stated otherwise, the documentation on this site reflects the latest stable version of Flutter. Page last updated on 2025-02-12.</span> <a href="https://github.com/flutter/website/tree/main/src/content/testing/integration-tests/index.md" target="_blank" rel="noopener">View source</a> <span>or </span><a href="https://github.com/flutter/website/issues/new?template=1_page_issue.yml&&page-url=https://docs.flutter.dev/testing/integration-tests/&page-source=https://github.com/flutter/website/tree/main/src/content/testing/integration-tests/index.md" title="Report an issue with this page" target="_blank" rel="noopener">report an issue</a>.</p></article></main></div><footer id="site-footer"><div class="footer-section footer-main"><a class="brand" href="https://flutter.dev"><img src="/assets/images/branding/flutter/logo+text/horizontal/white.svg" alt="Flutter logo" width="164"></a><div class="footer-social-links"><a class="icon-button" href="https://medium.com/flutter" target="_blank" rel="noopener" title="Flutter's Medium blog"><svg><use href="/assets/images/social/medium.svg#medium"></use></svg> </a><a class="icon-button" href="https://youtube.com/@flutterdev" target="_blank" rel="noopener" title="Flutter's YouTube"><svg><use href="/assets/images/social/youtube.svg#youtube"></use></svg> </a><a class="icon-button" href="https://github.com/flutter" target="_blank" rel="noopener" title="Flutter's GitHub"><svg><use href="/assets/images/social/github.svg#github"></use></svg> </a><a class="icon-button" href="https://bsky.app/profile/flutter.dev" target="_blank" rel="noopener" title="Flutter's Bluesky"><svg><use href="/assets/images/social/bluesky.svg#bluesky"></use></svg> </a><a class="icon-button" href="https://twitter.com/FlutterDev" target="_blank" rel="noopener" title="Flutter's X (Twitter)"><svg><use href="/assets/images/social/x.svg#x"></use></svg></a></div></div><div class="footer-section footer-tray"><div class="footer-licenses">Except as otherwise noted, this site is licensed under a <a href="https://creativecommons.org/licenses/by/4.0/">Creative Commons Attribution 4.0 International License</a>, and code samples are licensed under the <a href="https://opensource.org/licenses/BSD-3-Clause">3-Clause BSD License</a>.</div><div class="footer-utility-links"><ul><li><a href="/tos" title="Terms of use">Terms</a></li><li><a href="/brand" title="Brand usage guidelines">Brand</a></li><li><a href="https://policies.google.com/privacy" target="_blank" rel="noopener" title="Privacy policy">Privacy</a></li><li><a href="/security" title="Security philosophy and practices">Security</a></li></ul></div></div></footer></div><script src="/assets/js/tabs.js?v=4"></script><script src="/assets/js/archive.js?v=4"></script><script src="/assets/js/main.js?v=4"></script></body></html>

Pages: 1 2 3 4 5 6 7 8 9 10