为每个移动平台运行一个开发团队都会从其他工作中吸收资源。 Flutter是一个开发团队在所有平台上建立的最受欢迎的方式。
什么是颤音?
Flutter是Google的免费,开源软件开发套件(SDK),用于跨平台移动应用程序开发。使用单个平台 - 不合骨代码库,Flutter可以帮助开发人员构建具有吸引人的Android或iOS功能用户界面的高性能,可扩展的应用程序。 Flutter依靠预制小部件的库,这使得即使是有限的编程或开发经验的人,也可以快速启动自己的移动应用程序。
列表的公司清单与Flutter
进行了值得注意的工作
截至2023年1月,Play商店中有超过700,000个应用程序是用扑朔迷离的,而Play商店中的五分之一的应用程序都使用颤音,而不是所有其他跨平台框架。 Flutter正在从其他跨平台框架中获得市场份额,该框架在过去的十二个月中是平坦或下降的。
最受欢迎的应用程序用Flutter
- 阿里巴巴群
- Google Pay
- bytedance
- 宝马
- Dream11
- Nubank
- PUBG移动
- aws放大
- Google教室
- Zerodha
如何自动化颤音应用
Flutter App Automation并不总是很简单。
使用两个阶段的过程呈现flutter应用程序:
- 小部件树
- 渲染对象树
颤动渲染引擎高效,可以以高框架速率渲染复杂的UI。这是因为渲染引擎使用许多优化,例如缓存渲染对象和批处理绘制调用。
有几种不同的方法可以自动化颤音应用程序。
1。颤动驱动器:
flutter驱动程序用于与应用程序的UI进行交互,验证该应用程序的行为是否如预期并执行其他任务。
要使用Flutter驱动程序,您需要将其依赖性安装在flutter项目中
dev_dependencies:
flutter_test:
sdk: flutter
flutter_driver:
sdk: flutter
test: any
样品测试
import 'package:flutter_driver/driver_extension.dart';
import 'package:test/main.dart' as app;
void main() {
enableFlutterDriverExtension();
app.main();
}
test('increments the counter', () async {
await driver.tap(incrementButtonFinder);
expect(await driver.getText(counterTextFinder), "1");
});
使用Flutter驱动程序自动化flutter应用程序时可能会遇到的挑战:
- 用其他语言的其他语言写作测试
- 使用嵌入式WebView或本机视图或带有嵌入式Flutter View的现有本机应用程序运行Flutter应用程序的集成测试
- 同时在多个设备上运行测试(并行运行)
- 在设备农场上运行集成测试,例如酱汁实验室,headspin,aws,firebase
2。 Appium Flutter驱动程序
appium flutter驱动程序是用于自动化颤音应用程序的最受欢迎的工具。
Appium是一种跨平台自动化工具,可用于自动化在各种平台上运行的应用程序,包括Flutter。
pre Requisite
您的颤动应用程序(AUT)必须以调试或配置文件模式进行编译,因为Flutter驱动程序不支持在发布模式下运行。另外,在运行应用程序之前,请确保您的Flutter Aut具有enableFlutterDriverextension()。然后,请确保您的应用程序导入的flutter_driver软件包也作为其DevDections。
dev_dependencies:
flutter_test:
sdk: flutter
flutter_driver:
sdk: flutter
test: any
import 'package:flutter/material.dart';
import 'package:flutter_driver/driver_extension.dart';
import 'package:functional_widget_annotation/functional_widget_annotation.dart';
import 'package:hello_world/stream.dart';
part 'main.g.dart';
void main() {
enableFlutterDriverExtension(enableTextEntryEmulation: false);
init();
runApp(MyApp());
}
@widget
Widget myApp() => MaterialApp(
title: 'Counter App',
home: MyHomePage(title: 'Counter App Home Page'),
);
@widget
Widget myHomePage(BuildContext context, {String title}) => Scaffold(
appBar: AppBar(
title: Text(title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'You have pushed the button this many times:',
),
Tooltip(
message: 'counter_tooltip',
child: StreamBuilder<int>(
stream: counterStream,
builder: (context, snapshot) {
return Text(
'${snapshot.data}',
key: Key('counter'),
style: Theme.of(context).textTheme.display1,
semanticsLabel: 'counter_semantic',
);
}
),
),
FlatButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => Scaffold(
appBar: AppBar(
title: Text("Second Route"),
),
body: Center(
child: SecondPage(),
),
)),
);
},
child: Text(
'Go to next route',
key: Key('next_route_key'),
),
),
],
),
),
floatingActionButton: FloatingActionButton(
// Provide a Key to this button. This allows finding this
// specific button inside the test suite, and tapping it.
key: Key('increment'),
onPressed: () => plusClickSink.add(null),
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
@widget
Widget secondPage() => ListView(
padding: const EdgeInsets.all(8.0),
children: <Widget>[
Container(
height: 100,
color: Colors.amber[600],
child: const Center(child: Text('This is 2nd route')),
),
Container(
height: 200,
color: Colors.amber[500],
child: const Center(child: Text('Entry B')),
),
Container(
height: 500,
color: Colors.amber[100],
child: const Center(child: Text('Entry C')),
),
Container(
height: 1000,
color: Colors.amber[100],
child: const Center(child: Text('Entry D')),
),
Container(
height: 1000,
color: Colors.amber[100],
child: const Center(
child: TextField(
decoration: InputDecoration(
border: OutlineInputBorder(),
labelText: 'Sample Input',
),
)),
),
],
);
自动化代码:
Add maven dependency to pom.xml
<dependency>
<groupId>io.github.ashwithpoojary98</groupId>
<artifactId>appium_flutterfinder_java</artifactId>
<version>1.0.1</version>
</dependency>
import io.appium.java_client.AppiumDriver;
public class FlutterFinderExampleTest {
RemoteWebDriver driver;
@BeforeMethod
public void openApp() throws MalformedURLException {
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("deviceName", "emulator-5554");
capabilities.setCapability("platformName", "Android");
capabilities.setCapability("noReset", true);
capabilities.setCapability("app", "");
capabilities.setCapability("automationName", "Flutter");
driver = new AppiumDriver(new URL("http://0.0.0.0:4723/wd/hub"), capabilities);
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(30));
}
@Test
public void appiumFlutterTest() {
FlutterFinder finder = new FlutterFinder(driver);
WebElement element = finder.byValueKey("increment");
element.click();
}
@AfterMethod
public void tearDown() {
if (driver != null) {
driver.quit();
}
}
}
ashwithpoojary98 / javaflutterfinder
使用Java实施的弹驱动器
Appium Futter Finder Java
Flutter appium driver is automation tool with java implemantation.
maven-plugin
设置
将maven依赖性添加到pom.xml
https://mvnrepository.com/artifact/io.github.ashwithpoojary98/appium_flutterfinder_java
用法
import io 。 appium 。 java_client 。 appiumdriver
public class flutterfinderexampletest {
remotewebdriver 驱动程序;
@ beforemethod
在=“ pl-k”>投掷 MalformedUrlexception {
desiredcapabilities 能力 = new DesiredCapabilities ();
能力。 setCapibalibaly (“ deviceName” , “ Emulator-5554” );
能力。 setcapibalibaly (“ platformName” , “ android” );
在 true );
在“” );
能力。 setcapibalibaly (“ automationName” , “ flutter” );
在=“ pl-k”> new url (“ http://0.0.0.0.0:4723/wd /hub“ ),功能);
在)。 n> n> 30 ));
}
@ test
在¦
如果您有任何疑问,请随时接触。
gmail:ashwithpoojary98@gmail.com
Insta:Ashwith__poojary
github:https://github.com/ashwithpoojary98
谢谢....