测试Flutter应用程序:工具,优势,挑战

你好!我叫Maria Leshchinskaya,我是Surf的质量检查专家。自2011年以来,我们公司一直在开发本机应用程序,自2018年以来,我们也一直在为Flutter开发。



在本文中,我们将比较本机和跨平台应用程序的测试功能。我将分享与Flutter一起工作的印象,并告诉您在测试时我们在Surf中使用了哪些工具,为什么方便使用Flutter以及遇到什么问题。







Flutter中的测试功能与本地功能相当



当公司改变其开发方法或出现新技术时,重要的是不要严重影响测试能力。理想情况下,质量保证专家在使用新语言或框架时,将继续使用熟悉的工具和技术,这些工具和技术已以最佳方式证明了自己。



在测试本地应用程序时,Surf会使用自动测试并读取和替换软件包。没有自动测试(尤其是回归测试),也没有代理的帮助,应用程序的可变性和许多案例的覆盖率都会降低。 



对我们而言,重要的是在测试Flutter应用程序时仍保留熟悉的功能。



自动测试



Surf与Calabash和Ruby框架一起用于自动测试本机应用程序。当Flutter出现时,我们想知道的第一件事是:是否可以不使用Calabash,但同时可以完全按照我们习惯的方式(甚至更酷)使用自动测试。 



事实证明,这不仅有可能-甚至没有第三方服务:在Flutter中,开箱即用即可进行集成测试和控制台中的小部件测试。我们的Flutter开发人员在有关Flutter上的自动测试的文章中对此进行了更详细的介绍



Flutter上的自动测试同时是跨平台的和本地的:您可以在应用程序项目中编写测试,并且它们可以在两种平台上使用。当整个项目摆在您眼前时,您可以添加缺少的id-schnick甚至找到错误并加以修复-这是提高应用程序质量的又一次机会。



Flutter还支持行为驱动开发-BDD方法。我们将其用于UI测试。我们选择了Gherkin作为语言:您可以在其中使用功能文件,用英语和俄语编写脚本。可以理解,它具有脚本步骤的实现,内部没有脚本参数,也没有其他参数,还可以自定义启动自动测试的功能:例如,通过标签运行某些脚本,而不是整个书面测试。 



要在测试Flutter应用程序时使用Gherkin,我们连接了flutter_gherkin开源框架。 



当我们意识到Flutter上有自动测试功能时,我们想知道Calabash和Dart + Gherkin技术之间有什么区别,哪种方法更好。让我们一起比较一下。



1.两种方法的功能文件绝对相同。



例如,将使用Calabash在Dart和Ruby中正确解释通过PIN码进行授权的脚本:



:        ( )
       
          
         
        


两种技术都支持俄语,英语和其他语言。



2.实施步骤不同。
飞镖+ flutter_gherkin



class TapAnErrorButtonOnPinCodeScreen extends ThenWithWorld<FlutterWorld> {
  @override
  Future<void> executeStep() async {
    final elemFromReportAnErrorScreen = find.byValueKey('reportAnErrorButton');
    await FlutterDriverUtils.tap(world.driver, elemFromReportAnErrorScreen);
  }
  @override
  RegExp get pattern => RegExp(r"       -");
}


When(/^       -$/) do
wait_element("* id:'reportAnErrorButton'")
tap_on("* id:'reportAnErrorButton'")
end


这并不是说哪个更方便:某种技术内的结构不会改变,这很好。 



3. Flutter使用附加的.dart文件来配置和使用测试。对于Calabash,不存在这样的单个文件。



我们认为,不可能说这是Flutter或Calabash内部的抖动-这仅仅是使用特定工具和技术的细节。



4。为了方便在应用程序中使用元素,每个元素都必须有自己的ID。当使用Calabash进行自动测试时,您需要事先注意两个平台在被测试的应用程序中都有ID。在Dart上,您可以在编写自动测试的过程中添加ID,而无需分别重新加载iOS和Android应用程序的文件-这样既方便又节省时间。 



我们的结论是:在Dart上进行自动测试并不逊于使用Calabash框架进行自动测试。

 

代理



为了增加案例的应用范围,Surf使用程序来读取和欺骗流量,例如Charles。客户端-服务器交互的分析允许:



  1. 确定与后端之间是否存在真正的交互。
  2. 找出问题出在哪一边:在客户端还是在服务器上。
  3. , .
  4. : , , . Charles , , , .


Dart有自己的客户端,可以使用网络。由于所有请求都会通过它,因此必须在应用程序内部输入使用代理的必要设置。为了方便测试人员,所有必需的设置都放在一个单独的屏幕上:在Surf中,我们使用了我们自己开发的“调试”屏幕。



调试屏幕是附加设置屏幕,仅在调试版本中可用,并有助于测试。在其中,您可以选择所需的服务器,在应用程序中启用读取和保存http请求的使用,查看设备的fcm令牌等等-有很多测试机会。 



调试屏幕是自定义的:开发人员应测试人员的要求向其中添加其他元素-例如,用于从应用程序配置代理的字段。因此,我们有充分的机会与Charles合作:您可以将代理服务器连接到Debug Screen,而无需重新启动应用程序。



如您所见,测试Flutter应用程序的可能性不受限制。我们习惯于使用本机时所使用的一切都是方便且易于使用的。这是个好消息。



问题:框架错误,第三方库中的缺陷,预期的本机行为



我们在测试Flutter应用程序时面临的问题也是本机的。不能说这些是Flutter的特定缺点:在任何技术中,解决问题都不总是那么明显和简单。 



让我们告诉您在测试Flutter应用程序时要寻找什么。有备则无患。



Flutter-framework错误



在测试过程中,我们遇到了在iOS上显示和设置字体格式的问题:iOS平台上的字母间距明显比Android宽。这导致了很多视觉错误。 



事实证明,问题出在框架本身。当我们的移动应用程序开发人员与Flutter框架开发人员社区的成员联系,要求修复此类令人不愉快的错误时,该框架很快得到更新,并且iOS上的文本显示也已修复。



这样的情况肯定会重复发生。但是,这不能被认为是一个大问题:Flutter社区的成员迅速地对问题做出响应,支持并开发了框架。



第三方库中的缺陷在



iOS 10和11版本上,第三方库中存在实现缺陷。例如,我们修复了一个错误,该错误是在启动应用程序时立即弹出访问通知的权限,而不是按技术规范和设计的计划在按钮上弹出。



这样的问题可能同时出现在跨平台和原生平台上。它们可以通过项目内的修复程序或与库开发人员一起解决。



处理预期的本机行为



通过长期使用和测试iOS和Android上的本机应用程序,可以轻松预测用户对不同应用程序行为的期望。因此,例如,在iOS上回退是一种标准手势。在Android上,您不需要它。



两种平台上的系统对话框均不同:在iOS中,您需要请求访问通知的权限,而在Android上,默认情况下会授予此访问权限。 



正是这些操作系统细节的这些部分通常必须手动完成。有时-削减(如果突然之间),iOS平台的预期行为会迁移到Android,例如后擦。



在本机应用程序中,诸如更新屏幕,不正确地最小化应用程序以及应用程序的操作等问题对于当前OS而言是罕见的,这种情况很少见:为特定平台开发应用程序的工具和技术显然旨在涵盖特定系统的所有版本和功能。 



在测试Flutter应用程序之一时,我们遇到了一个有趣的情况:带有刘海的iOS设备上没有更新屏幕的功能-从iPhoneX和更高版本开始。同时,没有刘海的iOS设备和Android正常运行。 



我们在Android版本6上遇到了另一个错误:将其最小化时,该应用程序已从内存中完全卸载。



这些错误是由我们的开发人员在项目中修复的。


iOS非常了解他们的设备和系统,它们会在新的OS版本中发布哪些芯片,哪些将不再在以前的版本中运行,以及更新同一Swift时应关注的焦点。Android了解到他们必须针对大量设备和完全不同的屏幕尺寸,并且他们也了解其具体情况。 



我希望跨平台包含本机开发实现的所有微妙之处。当然,使用Flutter时会有一些缺点,但这不是问题:您只需要使用自己的跨平台方法即可。



好处:一个代码库,一个开发团队



单个代码库减少了测试时间



,错误的原因可能是技术规范模糊,设计中缺少呈现状态,后端更新时向后兼容。创建此类错误更容易,因为您需要创建一半的任务,而这已经节省了时间。 



您可以在一个平台上搜索错误并检查功能:在两个平台上重复出现这些错误的机率很高-毕竟有一个实现。 



这两个平台上的新功能的逻辑也相同,因为编写了相同的代码:在应用程序中测试复杂的过程被简化为在一个平台上测试它们并在另一个平台上进行确认。我们在一个平台上进行完整的活动周期:我们进行探索性测试,功能运行,冒烟/健全/完整,分析反馈。之后,仅需通过其他平台上的探索性测试来确认质量。这种方法可节省逻辑测试时间约1.3倍。





, , , : , . , .



, (, iOS), , (Android), event .


如果两个平台的组件需要在同一天交付给客户,它们会同时发出,并且项目中只有一名QA工程师,则可能没有足够的时间来进行本机开发中的验证:测试周期必须在两个平台上分别执行。我们通过测试跨平台应用程序来节省时间:两个平台的回归测试在一个周期内进行。 



我们试图粗略评估两个类似项目的测试-一个在本机Android和iOS上进行,第二个在Flutter上进行-并进行实际比较。 



在一台iOS设备和一台Android平台设备上进行了分析和测试。正如您在实践中所看到的,Flutter确实使您获得了时间上的收益,尽管没有两次。这是可以理解的:您不能完全删除两个平台之一上的测试。不管怎么说,它们都有不同的专一性并专注于用户。

 

本机iOS

本机Android

Flutter Android + iOS

找回密码

2小时

2小时

3h 20m

授权书

1h 30m

1h 30m

2h 20m

推送通知

2小时

2小时

4小时



在测试不会完全影响操作系统细节且未针对每个平台分别编写的现成功能时,在两个平台上检查Flutter应用程序的时间减少了约1.3-1.5倍。例如,在不同平台上没有特定行为的授权和密码恢复功能将Flutter版本的测试时间减少了1.3倍。



至于需要从每个平台进行自定义行为的功能,您不应该等待时间的减少。预期iOS和Android的行为会有所不同,这意味着您需要完全独立地测试两个平台。例如,由于权限差异,经常使用通知连接,在iOS和Android上发送通知的推送器设置以及其他实现方面的细微差别,经常有必要在两个平台上对推送通知进行全周期测试,以便支持用户通常使用的通知。尊重传统知识和设计。



在团队内部组织交流更容易



当项目中有很多人时,很难组织该过程,以至于即使最小的细节也不会消失。尤其是如果未来还有很多改进,通常会实施新功能并进行更改。当开发团队是一个团队时,大多数问题都可以解决。 



首先,通过实现单个命令来测试应用程序要比在两个平台上使用两种不同的实现方法容易。当然,质量保证专业人员希望在iOS平台和Android平台上都拥有有关应用程序状态的完整信息。使用Flutter时更容易。



其次,本机开发中有一个重要的要点:关于一个平台已经学会并接受的更改,有必要通知另一个平台,在大而密集的更改过程中有时会忘记或丢失该平台。开发Flutter应用程序时没有这种问题:只有一个团队-也就是说,一个修订任务适用于两个平台。



我们喜欢测试Flutter应用程序 



成为酷社区的一部分



对于我们而言,新框架是一个加号:解决非标准问题,我们拓宽了视野。我们发现许多有趣且独特的错误,这些错误会在测试应用程序时发展我们的技能和能力。



同时,Flutter-framework社区的开发人员可以快速提供已发现问题的反馈,改进库并允许我们为项目做出贡献:我们正在共同前进,这很好。 



成为专家



在处理跨平台应用程序时,重要的是要牢记操作系统的差异,并且不要将注意力集中在平台的特殊性上。在理论上应尽量减少差异的地方寻求和发现差异,学习从未有过的东西-这样的工作可以提高专业水平。 



在开发和测试本机应用程序时,无法从例如Android Studio或Visual Studio Code构建iOS应用程序。使用Flutter时,IDE对于Android和iOS都是相同的。这很酷。


保持独立



在与Flutter合作时,Surf面临着截然不同的项目:从电子商务到银行业务。实践表明,质量检查工程师可以单手测试两个平台。当工作节奏加快并且完成任务的时间用尽时,有必要仅在发行版附近连接另一位专家。 



颤振-向前迈出的一步



测试跨平台应用程序并不困难。有时,与使用本机相比,它甚至更快,更方便。一个人可能面临的所有困难并没有带来便利和优势。



在开发和测试Flutter应用程序方面的经验表明,Surf认为该框架是向前迈出的一大步。 



All Articles