java Appium是否能够运行一个测试,同时接触两个不同的应用程序,一个是iOS,另一个是Android?
上下文:我正在处理一个项目,该项目涉及一个由安卓控制的硬件和一个通过websocket与安卓设备对话的iOS应用程序。我们在较低级别(API、单元、合同)测试方面处于良好状态,但在UI部分没有任何帮助
UI自动化,尤其是端到端的自动化,不是我最喜欢的测试方式,因为它是脆弱而缓慢的,我相信它的目的只是保证主要用户流是可执行的,而不是每一项功能
因此,我开发了一个套件,其中包括安卓和iOS代码以及页面对象,但现在我唯一能做的就是分别运行它们中的每一个:
- 启动适用于安卓的appium服务器和appium驱动程序,运行安卓应用程序套件
- 启动ios的appium服务器和appium驱动程序,运行ios应用程序套件
但这并不完全是我想要的——因为这将是唯一的测试用例,我希望它是完整的端到端;启动appium服务器,启动安卓服务器,同时启动两者的appium驱动程序,运行在ios上放置操作的测试,并验证安卓是否正在执行该操作
我不希望有人手动运行这个东西,同时查看这两个设备。如果这不起作用,安卓和ios套件将分别运行,依赖于模拟版
所以我把它扔到这里给社区,因为我所投递的测试工程小组中没有一个能给出答案
我需要知道是否有人做过或看到过这件事来给我启示,或者是否有人知道如何去做
# 1 楼答案
我将研究通过命令行在不同端口上启动2个appium实例,然后将每个套件连接到给定的appium实例。此时,您只需要正确地对每个套件执行线程,以便正确地测试代码。要做到这一点,您需要添加依赖项(可以使用TestNG轻松完成)
步骤:
1)为IOS和Android套件创建一个线程
2)在不同的appium会话(即不同的端口)上运行每个套件
3)将测试设置为相互依赖(我建议使用TestNG作为框架)
4)使用线程逻辑正确等待测试完成后再开始。收益率和超时将非常有用,以及TestNG依赖性,它将拯救你的生命,因为你正在做什么
注意:Appium有一个超时功能,默认情况下,如果会话在60秒内没有收到命令,会话将被销毁。又名确保你增加或找到一种方法来关闭超时
此外,作为建议,我建议使用TestNG而不是JUnit。JUnit是一个单元测试框架,这意味着您正在测试特定的功能单元。然而,这对于应用程序自动化来说并不理想,因为应用程序的许多领域都依赖于以前的功能。例如,如果您有一个登录屏幕,其中登录功能当前被破坏,那么您不想运行所有需要用户登录才能通过的测试。这不仅会在你的大部分测试失败时引起很多恐惧,还会让你更难找到失败的原因。相反,如果所有这些测试都依赖于登录功能的通过,那么如果登录失败,就会出现一个可以修复的错误,并且所有依赖于登录功能的测试在您知道它们将通过时不会运行
希望这个过程能有所帮助,很抱歉,我显然无法在这个过程中发送代码,因为我需要几个小时才能输入/理解
# 2 楼答案
问题解决了,就这么简单
我所做的是实现一个抽象类,用android和ios的功能和特定的appium端口构建驱动程序,并实例化它们各自的页面对象。所有的测试类都扩展了这个抽象类
然后我把套房分成三部分: 一个仅适用于Android,它仅访问Android的页面对象; 一个用于ios,它也只访问ios的页面对象; 第三个测试是同时启动ios和android并控制它们
为了避免总是启动两台appium服务器,也为了避免总是下载android和ios的最新应用版本,我为每个平台创建了gradle任务,因此CI作业只能调用为在给定时刻必须测试的平台准备的任务