当前位置: 首页 > news >正文

Flutter 自动化测试 -appium-flutter-driver

上篇文章有讲述如何通过FlutterDriver实现集成测试Flutter 应用自动化测试-集成测试篇 不熟悉的小伙伴可以先去看看。

什么是Appium Flutter Driver?

作为Flutter开发,FlutterDriver是足够帮助他们进行测试的,而作为自动化测试工程师最大的困难是对dart语言不了解,不知道如何在FlutterDriver驱动下用Dart语言编写TestCase,所以需要一款更加简单的、不需要学习Dart语言的工具来帮助我们去实现自动化测试,而Appium Flutter Driver满足这一点。

Appium Flutter Driver是一款可以跨平台测试Flutter应用的自动化测试工具,并且是Appium移动端测试工具的一部分。

其项目的Github地址:https://github.com/truongsinh/appium-flutter-driver

FlutterDriver VS Appium Flutter Driver

Appium Flutter Driver对比FlutterDriver对QA来说有巨大的优势:

  • 不需要通过Dart编写TestCase,可以支持Java、Python、nodeJs等语言
  • 支持Flutter嵌套webview页面或者原生页面,或者是原生嵌套Flutter页面的自动化测试
  • 支持并发执行
  • 支持云测试平台,比如Sauce Labs

image.png

安装Appium Flutter Driver

Appium V1.16.0版本或以上才能支持appium-flutter-driver

image.png

使用Appium-Desktop的同学

安装Appium-desktop V1.16.0以上,这里以Appium-Desktop V1.17.0为例,可以看到自带了appium-flutter-driver

image.png

使用npm方式安装Appium的同学
  1. 安装node.js https://nodejs.org/en/

  2. 安装配置Appium环境(版本V1.16.0或以上)

    #设置npm淘宝镜像
    npm config set registry https://registry.npm.taobao.org
    #全局安装appium,设置chromeDriver镜像下载地址
    npm install appium@1.17 -g --chromedriver_cdnurl=http://cdn.npm.taobao.org/dist/chromedriver
    #安装appium-doctor
    npm install appium-doctor -g
    #appium doctor检测环境
    appium-doctor
    

同样可以在Appium目录中找到appium-flutter-driver

打包测试App

由于FlutterDriver不支持release模式的App,所以被测应用需要打包成debug或者profile模式

Step1:开启FlutterDriver扩展模式

在runApp()之前添加enableFlutterDriverExtension()

void main() {enableFlutterDriverExtension();runApp(MyApp());
}

Step2:构建debug模式App包

在工程根目录下输入flutter build apk --debug

image.png

编写Java测试脚本

Step1:创建Maven工程

pom文件依赖配置如下:

<dependencies><dependency><groupId>io.appium</groupId><artifactId>java-client</artifactId><version>7.0.0</version></dependency><dependency><groupId>org.jetbrains.kotlinx</groupId><artifactId>kotlinx-serialization-runtime</artifactId><version>0.20.0</version></dependency><dependency><groupId>org.testng</groupId><artifactId>testng</artifactId><version>7.0.0</version></dependency>
</dependencies>

Step2:导入finder源码

由于appium-flutter-finder客户端依赖没有放到Maven中央仓库,我们需要自己导入相关源码(选择kotlin)

image.png

image.png

Step3:编写TestCase
public class FlutterAppTest {public static String appPath = "src\\test\\resources\\app-debug.apk";protected FlutterFinder find;protected AndroidDriver<MobileElement> driver;@BeforeTestpublic void setUp() throws MalformedURLException {String appAbsolutePath = System.getProperty("user.dir") + File.separator + appPath;DesiredCapabilities capabilities = new DesiredCapabilities();capabilities.setCapability("platformName", "Android");capabilities.setCapability("deviceName", "08e7c5997d2a");capabilities.setCapability("app", appAbsolutePath);capabilities.setCapability("platformVersion", "5.1.1");capabilities.setCapability("automationName", "Flutter");driver = new AndroidDriver<MobileElement>(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);find = new FlutterFinder(driver);}@Testpublic void countTest() throws InterruptedException {Thread.sleep(2000);MobileElement counterTextFinder = find.byValueKey("counter");MobileElement buttonFinder = find.byValueKey("increment");buttonFinder.click();buttonFinder.click();Assert.assertEquals("2", counterTextFinder.getText());}@AfterTestpublic void tearDown() throws InterruptedException {Thread.sleep(2000);driver.quit();}
}

执行效果:

image.png

编写Python测试脚本

Step1:下载Appium-Flutter-Finder for Python客户端库,官方提供了三种方式:
  • 从PyPi官方仓库安装

    pip install Appium-Flutter-Finder
  • 从https://pypi.org/project/Appium-Flutter-Finder/下载解压安装

    tar -xvf Appium-Flutter-Finder-X.X.tar.gz
    cd Appium-Flutter-Finder-X.X
    python setup.py install
    
  • 从Github下载安装

    git clone git@github.com:appium/python-client.git
    cd python-client
    python setup.py install
    

Step2:编写TestCase
import unittest
from appium import webdriver
from appium_flutter_finder.flutter_finder import FlutterElement, FlutterFinderclass FlutterTest(unittest.TestCase):def setUp(self):desired_caps = {}desired_caps['platformName'] = 'Android'desired_caps['platformVersion'] = '5.1.1'desired_caps['deviceName'] = '08e7c5997d2a'desired_caps['app'] = r'D:\flutter_demo\build\app\outputs\apk\debug\app-debug.apk'desired_caps['automationName'] = 'flutter'self.driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)self.finder = FlutterFinder()def test_flutter(self):text_finder = self.finder.by_value_key("counter")button_finder = self.finder.by_value_key("increment")text_element = FlutterElement(self.driver, text_finder)button_element = FlutterElement(self.driver, button_finder)button_element.click()button_element.click()self.assertEqual('2',text_element.text)def tearDown(self):self.driver.quit()if __name__ == '__main__':unittest.main()

执行过程和效果同上述一致,这里就不再展示了。

作者:shakebabe
链接:http://testingpai.com/article/1596527703036


 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • git clone 别人的项目上传到自己的Gitee或者github仓库
  • 小白指南:Linux怎么创建压缩包?又怎么解压缩?
  • 让甲方看得见服务器资源降本增效-软件开发不仅考虑开发成本也要重视长期的运维成本
  • Java基础(4)- IDEA
  • 嵌入式软件开发之状态机与事件驱动分析
  • 鲲鹏服务器之ARM探知
  • QString 初始化
  • 主成分分析PCA通用代码(输出world报告)
  • [大模型]源码安装-Langchain-Chatchat-V0.3
  • 【初阶数据结构】顺序表和链表算法题(下)
  • 图像处理中的对抗性研究:浅谈水印去除技术
  • Golang学习笔记-Golang中的锁
  • Linux上安装Conda以管理Python环境
  • F - Rook on Grid 矩阵 侧面视角 树状数组
  • 《Python 关键概念全解析:可迭代对象、迭代器、生成器与装饰器》
  • SegmentFault for Android 3.0 发布
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • Akka系列(七):Actor持久化之Akka persistence
  • Codepen 每日精选(2018-3-25)
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • express如何解决request entity too large问题
  • Java知识点总结(JavaIO-打印流)
  • MySQL QA
  • uni-app项目数字滚动
  • 事件委托的小应用
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 项目管理碎碎念系列之一:干系人管理
  • 一份游戏开发学习路线
  • MyCAT水平分库
  • ​Benvista PhotoZoom Pro 9.0.4新功能介绍
  • #宝哥教你#查看jquery绑定的事件函数
  • (2)Java 简介
  • (C语言)共用体union的用法举例
  • (TOJ2804)Even? Odd?
  • (ZT)薛涌:谈贫说富
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (二) 初入MySQL 【数据库管理】
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (七)Appdesigner-初步入门及常用组件的使用方法说明
  • (十七)Flink 容错机制
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (译)2019年前端性能优化清单 — 下篇
  • (转)创业的注意事项
  • .gitignore文件---让git自动忽略指定文件
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .NET CLR Hosting 简介
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .NET 常见的偏门问题
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .NET成年了,然后呢?
  • .NET上SQLite的连接
  • .NET下的多线程编程—1-线程机制概述
  • .net中调用windows performance记录性能信息