Appium并行测试完整教程[附实例]

521 阅读21分钟

在今天这个快节奏的世界里,每个企业的首要目标是尽早向最终用户发布他们的应用程序或网站。因此,企业不断寻找方法来测试、衡量和改进他们的产品。 随着竞争的加剧,更快的上市时间(TTM)对于任何企业在今天的市场上生存都变得至关重要。然而,许多企业团队可能面临的挑战之一是发布周期时间,它通常会因为一些原因而被延长。

我们尝试用不同的技术和方法来检查业务需求、开发、质量和整体进度,以了解克服挑战所需的所有可能的事情。所有这些都确保了在不影响质量的情况下加快产品上市的时间。

以下是我在许多项目工作中遇到的一些原因。

  • 编码问题。
  • 自动化管道的运行时间比预期的要长,这对加快反馈没有帮助。
  • 生成需要大量的时间,这导致在运行自动化回归测试和最后执行手动探索性测试时出现延迟。
  • 测试的松散性。

同样,可能还有很多要列出的。然而,我已经列出了许多团队中常见的几个原因。

从上面列出的原因中,让我们来谈谈为什么自动化管道的运行时间比预期的要长,这不利于更快的反馈,同时也看看可能的解决方案,如何将其降到最低。

考虑一个为Android和iOS平台构建的移动电子商务应用程序的场景,你需要在两个平台上运行自动化回归测试套件。每个测试套件有大约100多个测试案例要运行。因此,考虑到我们有两个平台,iOS和Android,我们需要运行200个测试,之后只有我们能够为构建提供反馈。

考虑到一个测试需要10秒左右的时间,所以考虑到100个测试案例,在执行Android自动化测试时,运行一个套件需要1000秒,执行iOS自动化测试也需要1000秒。

这就是平行测试发挥作用的地方!在这个Appium测试教程的后续部分,我将讨论并行测试,并展示如何执行Appium并行测试。

因此,请准备好和我一起进行这个用Appium并行测试运行自动化测试的旅程。

什么是Appium?

在我们深入了解Appium并行测试之前,让我们先了解一下Appium,因为不使用这个框架,我们将无法继续编写移动自动化测试

Appium是一个流行的开源移动应用测试框架,有助于实现iOS、Android和Windows平台的自动化测试。它可以用来测试原生、移动网络和混合应用程序。你可以从这个博客中了解更多关于这些应用程序的信息,即网络与混合与原生应用程序

它支持测试开箱即用的react native应用程序,并使用WebDriver接口运行测试案例。它还支持多种编程语言,如Java、Javascript、C#、Python、PHP和Ruby。

Appium可用于在本地和云平台的真实设备上运行测试,也可使用TestNG并行运行测试。如果你想了解更多关于Appium和TestNG的信息,你可以通过这个Appium与TestNG教程。

什么是并行测试?

并行测试是同时执行多个自动化测试的方式,测试在不同的线程上运行,消耗不同的资源。我们可以在不同的平台、多个设备上运行不同的测试,并同时使用不同的输入。因此,在上面的电子商务应用程序的例子中,在Android上运行所有的测试需要1000秒,在iOS上运行同样需要1000秒。所以,总的来说,我们需要2000秒在安卓和iOS设备上运行测试。

让我们考虑一下,Android和iOS有多个设备;时间将乘以你增加的设备数量来运行测试。通过并行运行测试,我们可以节省1000秒,因为两者会同时运行,为我们提供更快的反馈。

run all tests

让我们详细讨论一下如何使用LambdaTest等云托管的移动平台进行Appium并行测试,以及它如何帮助你减少运行测试的时间。

如果你仔细观察上图,它显示了测试的编排,即当它们连续运行时,它们是如何被设计为分别在设备1和设备2上执行。

设备1可能是一个Android设备,设备2可能是一个iOS设备或另一个Android设备。这完全取决于你想如何运行你的测试。一旦测试被执行,设备1将被设置,测试1到测试4将在其上执行。

一旦在设备1上执行完毕,只有设备2将被选中执行另一组相同的测试。在这里,在设备2上运行测试所需的时间可能更多地取决于等待、定位器策略等,取决于用于运行测试的设备和平台。

mobile tests in parallel

现在,让我们来谈谈平行运行移动测试的问题。上图显示,所有的测试都在多个设备上并行执行。只要你执行测试,所有4个设备都同时设置。这4个设备可能是在同一平台上,如iOS,或运行在不同的平台上。目的是一次性执行所有的测试,这样我们就可以节省时间,并快速获得测试反馈。

Appium并行测试的优势

现在,你已经对Appium并行测试的含义和我们使用它的原因有了一定的了解。现在,让我们来讨论Appium并行测试的一些优势。

以下是执行Appium并行测试的一些优势。

  • 减少了测试的整体执行时间。
  • 提供在不同平台和平台版本的多个设备上运行测试的杠杆。
  • 加快对构建的反馈。
  • 快速的反馈有助于团队及早修复问题并消除瓶颈。
  • 实现更快和更频繁的发布,同时与持续集成和开发保持同步。

让我给你举一个最近的例子,在我以前的一个项目中,我们为Android和iOS开发了一个内置的移动应用程序,我们使用Appium来运行移动测试。CI/CD管道是使用测试金字塔构建的,所以单元测试首先运行,之后是合约测试。之后,运行集成测试,最后,执行端到端的回归测试。在所有的测试成功运行后,构建被部署到QA环境中,之后QA对构建进行手动探索性测试

大约涉及7个用户旅程,使用Appium在Android和iOS平台上运行移动测试。仅在安卓设备上运行测试就花了大约20分钟。一旦所有的Android测试被运行,iOS测试被触发,这又花了大约20-25分钟来完成iOS测试的执行。因此,最终大约需要40-45分钟来执行端到端测试

在这中间,我们面临着一些故障的问题,有时测试开始失败。我们不得不首当其冲,因为我们不能及时建立,以执行手动探索性测试,这最终导致了故事的溢出。

团队提出了通过Appium并行测试运行移动测试的想法。我们对移动测试的真实设备标准选择如下。

  1. 最新的、真实的、具有最新平台版本的Android和iOS设备。
  2. 安卓和iOS的真实设备具有相应的旧平台版本(这是为了检查应用程序的最低版本支持 - 我们支持安卓8作为最低版本和iOS 12)。

我们配置并更新了我们的移动测试,以执行Appium并行测试,这帮助我们减少了50%的测试执行时间。所有的端到端测试都在20-25分钟内完成,而且我们现在得到了更快的测试反馈。

由于端到端测试相互依赖,我们需要设计测试,以便它们能够成功地并行运行。TestNG有测试的dependsOnMethods 属性,可用于链式测试的端到端旅程。例如,产品购买测试应该只在登录成功后运行,而支付应该只在产品结账成功后发生。在执行Appium并行测试时,应仔细设计此类测试的运行。

在3000多个真实设备的Appium云上自动化你的应用程序。现在就试试LambdaTest吧

如何在LambdaTest上执行Appium并行测试?

LambdaTest是一个可靠、可扩展、安全和高性能的Appium测试平台,它使开发和测试团队能够加快其发布周期。你可以在由3000多个真实的iOS和Android设备组成的真实设备云上自动测试你的移动应用程序。

你也可以订阅LambdaTest的YouTube频道,随时了解围绕Selenium测试Cypress E2E测试、CI/CD等的最新教程。

以下是LambdaTest的Appium测试平台的一些特点。

让我告诉你,我们将使用Android和iOS应用程序来编写测试。这些是由LambdaTest构建的演示应用程序。

在我们开始编写测试之前,让我告诉你我们将使用哪些工具来编写和运行测试。

在编写和执行Appium并行测试时,我们使用了以下编程语言和工具。

  • 编程语言。Java 11
  • 网络自动化框架。Appium(Appium Java客户端 - 7.6.0)
  • 测试运行器。测试NG
  • 构建工具。Maven

用于测试执行的云平台。LambdaTest

让我们来讨论一下Proverbial应用程序的移动测试策略,重点是什么以及如何实现自动化?

这个应用程序打开时有一个主页、一条欢迎信息和一些按钮。

我们将使用以下测试场景进行Appium自动化。

  1. 打开应用程序并检查欢迎信息--"你好!欢迎来到名为Proverbial的lambdatest样本应用程序",并正确显示。
  2. 点击文本 按钮,检查文本信息 "Proverbial "是否显示。
  3. 点击通知 按钮,检查通知是否显示在顶部。检查通知是否正确出现,并点击关闭。
  4. 点击吐司 按钮,检查吐司信息是否显示在屏幕底部,并验证其文字 "吐司应该可见"。
  5. 点击GeoLocation 按钮,检查该应用是否成功导航到地理位置页面。一旦导航到地理位置页面成功,导航回主页。
  6. 点击SpeedTest 按钮,检查应用程序是否导航到速度测试页面,验证横幅是否显示。验证后,导航回主页。
  7. 点击屏幕底部的浏览器 菜单。一旦应用程序导航到浏览器页面,输入文本"https://www.lambdatest.com "并点击查找 按钮,检查网站是否加载到屏幕上。

Appium并行测试策略。

正如本博客关于Appium并行测试的最初部分所提到的,我们将按以下方式并行运行所有测试。

测试案例编号平台名称平台版本设备名称
1安卓10银河S9 Plus
2ǞǞǞ11像素5
3ǞǞǞ14iPhone 12专业版
4iOS14iPhone 11

开始使用Appium并行测试

如前所述,这个项目是用Maven创建的。TestNG 被用作测试运行器。项目创建后,我们需要在文件中添加Appium、TestNG、lombokjackson-databind的依赖。 *pom.xml*文件中添加Appium、TestNG、lombok和jackson-databind的依赖关系。

Pom.xml

为了读取JSON,我们将使用jackson-databind 依赖的JsonNode类。它有一些丰富的功能,允许我们用较少的代码来无缝读取JSON文件。必须应用适当的方法和逻辑来获得相应的值。

JsonNode class

添加Appium Java客户端依赖,这将有助于我们编写移动自动化测试。

Java client dependency

依赖关系的版本被设置在一个单独的属性块中。这样做是为了可维护性,所以如果我们需要更新版本,我们可以很容易地做到这一点,而无需在整个pom.xml文件中搜索依赖关系。

属性块

你可以通过这个视频了解更多关于在真实设备上执行应用自动化的信息。

TestNG是如何帮助执行Appium并行测试的?

TestNG是一个基于Java的测试自动化框架,帮助运行测试。这里,"NG "代表 "下一代"。它的设计是为了让测试人员轻松进行端到端的测试。TestNG允许执行Appium的并行测试,通过将""标签分别设置为**"测试"、"方法"、"类 "和 "实例"。**

根据运行测试的设置,它将开始在不同的线程中执行测试。

你可以使用以下选项来运行TestNG的Appium并行测试

<suite name="My suite" parallel="tests" thread-count="3">

**parallel="测试"。**为标签中的并行属性提供此值将在同一线程中运行同一标签中的所有方法,但每个标签将在一个单独的线程中。

<suite name="My suite" parallel="methods" thread-count="3">

**parallel="方法"。**为标签中的并行属性提供此值将在独立的线程中运行所有的测试方法。依赖的方法也会在独立的线程中运行,但会尊重你指定的顺序。

<suite name="My suite" parallel="classes" thread-count="3">

**parallel="classes"。**为标签中的并行属性提供此值,将在同一线程中运行同一类中的所有方法,但每个类将在一个单独的线程中运行。

<suite name="My suite" parallel="instances" thread-count="3">

parallel="instances"。为标签中的并行属性提供此值将在同一线程中运行同一实例中的所有方法,但两个不同实例上的两个方法将在不同线程中运行。

正如我们看到的,TestNG提供了多种选择。然而,这完全取决于你的测试设计和协调,以并行方式运行你的测试。

自动化测试

在这篇关于执行Appium并行测试的博客中,我不会讨论寻找定位器和编写iOS和Android的自动化测试。请参考我之前关于测试React原生应用的博客。我已经讨论了使用Appium Inspector为使用react-native框架创建的iOS和Android应用程序寻找定位器。

关于如何使用Appium和页面对象模型编写测试的深入细节也在上述博客中提供。此外,我还提供了使用Java创建页面和测试的代码演练,以及如何使用Maven运行它。

开始使用Appium与TestNG的并行测试

让我们讨论一下我们定义的并行运行测试的策略。首先,我们创建了一个JSON格式的配置文件,并放置在test/resources文件夹中,我们将从中读取在LambdaTest真实设备云上运行测试所需的Desired Capabilities

配置(文件名 - parallel.config.json)

所有常见的期望能力都被放在 "commonCapabilities"JSON对象中。这些能力是LambdaTest平台所需要的,以便让测试在真实设备上运行,并分别启用日志。

你看到的 "deviceAndBuildCaps"的另一个块是需要告诉测试和它各自的驱动程序在哪个平台、设备和平台的操作系统版本以及在哪个应用程序上运行测试。

将应用程序上传到LambdaTest

应用程序的值是我们使用LambdaTest的app-upload API将应用程序上传到LambdaTest后得到的app_url

有两种方法可以将API上传至LambdaTest:使用App File和使用App Url。在LambdaTest上上传应用程序必须采取以下步骤。

1. 使用应用程序文件。

可以使用以下curl命令上传应用程序。

  • MacOS / Linux用户。
curl -u "YOUR_LAMBDATEST_USERNAME:YOUR_LAMBDATEST_ACCESS_KEY" \
--location --request POST 'https://manual-api.lambdatest.com/app/upload/realDevice' \
--form 'name="Android_App"' \
--form 'appFile=@"/Users/macuser/Downloads/proverbial_android.apk"'
  • Windows用户。
curl -u "YOUR_LAMBDATEST_USERNAME:YOUR_LAMBDATEST_ACCESS_KEY" -X POST "https://manual-api.lambdatest.com/app/upload/realDevice" -F "appFile=@"/Users/macuser/Downloads/proverbial_android.apk""

2.使用应用程序的URL。

可以使用下面的curl命令上传应用程序。

  • MacOS / Linux用户。
curl -u "YOUR_LAMBDATEST_USERNAME:YOUR_LAMBDATEST_ACCESS_KEY" --location --request POST "https://manual-api.lambdatest.com/app/upload/realDevice" --header "Content-Type: application/x-www-form-urlencoded" --data-urlencode "url=:https://prod-mobile-artefacts.lambdatest.com/assets/docs/proverbial_android.apk" --data-urlencode "name=Proverbial_App"
  • Windows用户。
curl --location --request POST "https://manual-api.lambdatest.com/app/upload/realDevice" -u "YOUR_LAMBDATEST_USERNAME:YOUR_LAMBDATEST_ACCESS_KEY" --header "Content-Type: application/x-www-form-urlencoded" --data-urlencode "url=https://prod-mobile-artefacts.lambdatest.com/assets/docs/proverbial_android.apk" --data-urlencode "name=test" --data-urlencode "custom_id=my_app"

一旦应用程序被成功上传,我们应该收到 "app_url "的响应,这可以用于运行测试。

代码演练。

读取JSON配置文件并设置期望的能力。

配置 (FileName - DriverManager)

GitHub

由于我们正在从JSON文件中读取所需的能力,因此有必要解析JSON文件并从中获取所有细节,这样我们就可以在所需的能力中设置这些值,这是运行测试所需要的。来自jackson-databind依赖的JsonNode类被用来读取JSON文件。

 JSON file

JSON配置文件有两个块:"commonCapabilities",一个JSON对象,和 "deviceAndBuildCaps",一个JSON数组,按我们需要运行测试的设备持有不同的值。

commonCapabilities

首先,我们将设置deviceAndBuildCaps。一个变量deviceId 被创建,它将根据testng.xml文件中设置的参数值 取值。一旦我们得到这个值,我们将把这个值与我们在parallel.config.json文件的id字段中提供的值进行比较。

一旦这样做了,我们就有适当的所需能力块分配给我们计划执行的各个测试。因此,假设我们计划在Android设备上运行测试。在这种情况下,应该从配置文件中选取正确的所需能力块,并映射到所需能力,以成功运行测试。

deviceAndBuildCaps之后,我们将设置commonCapabilities,这是LambdaTest平台为启用记录器和使用真实设备进行测试而要求的。

commonCapabilities

最后,这些能力将被设置在AppiumDriver中,最终将分别使用它来运行测试。

最重要的任务是设置驱动程序,以便我们可以使用它们来运行测试。在这里。 **AppiumDriver**是用来运行测试的,因为我们将在
LambdaTest平台上运行测试,因为AndroidDriverIOSDriver 都扩展了AppiumDriver。

AppiumDriver

ThreadLocal 类用于设置运行测试的驱动程序,因为它是线程安全的,在测试并行运行时效果很好。使用ThreadLocal的主要原因是,即使两个线程在同一个ThreadLocal对象上设置不同的值,两个线程也不能看到对方的ThreadLocal变量。这将有助于我们安全地运行并行测试。

因此,一旦设置了所需的能力,我们需要设置驱动程序,并将LambdaTest用户名、访问令牌和网格URL与所需的能力一起传递给它,这样它就可以用来生成与云平台的连接,以运行测试。

我们将通过从用户那里获取用户名访问令牌作为一个环境变量来设置它。从安全的角度来看,这些属性的值不应该被披露。因此,我们将在运行时设置它。网格网址将使用代码本身的静态变量来设置,因为这个值在代码执行过程中的任何时候都不会改变。

这里需要注意的一点是,Lombok的@Builder注解被用在这个类中,允许我们在运行时从testng.xml中建立并获取设备Id 值,而不必在方法签名中传递相应的参数。

ThreadLocal

基础测试

BaseTest (FileName - BaseTest)

创建基础测试是为了使它能够被扩展并用于其他测试,这样我们就不会在重复设置相同的配置时重复自己。创建单个Base Test是为了帮助我们为Android和iOS测试设置基础。

正如你所看到的,deviceId被捕获为 TestNG注解 @Parameters的一部分,它将使用testng.xml文件设置。基于这个字段值,设备配置将从 "parallel.config.json"文件中读取,相应地,设备将被分配到测试中。

parallel.config json

接下来,构建器设计模式被用来构建driverManager的实例,并相应地传递deviceId 值,这样我们就可以在所需配置上运行测试。

运行Appium测试

考虑到我们之前设定的并行测试策略,生成了以下 testng.xml ,这将帮助我们分别在 2个Android2个iOS真实设备上并行运行测试。

运行测试 (FilName - testng.xml)

看看testng.xml文件中的标签。

<suite name="Lambda tests Mobile automation test suite" parallel="tests" thread-count="4">

我们将属性值设置为 parallel="test",线程数设置为4。 因此,一旦我们执行这个,它将开始在4个不同的线程中并行运行测试。

下表解释了用于执行Appium并行测试的设备和平台细节。

测试编号平台平台版本设备名称
1安卓11像素5
2安卓10银河S9 Plus
3ǞǞǞ14iPhone 12 Pro
4iOS14iPhone 11

运行Appium并行测试

有2种方式来运行测试,具体如下。

  1. 通过testng.xml运行。
  2. 使用Maven运行。

使用testng.xml运行Appium并行测试

要使用testng.xml运行测试,我们需要右击textng.xml并选择
**Run '...\testng.xml'。**它应该开始并行地执行测试。

Running Appium parallel tests using testng

看看下面来自IntelliJ的屏幕截图,它显示了使用testng.xml运行测试的执行状态。

execution status of the tests

使用Maven运行Appium并行测试

在终端上触发以下命令,使用Maven运行测试。

mvn clean install -Dusername=<LambdaTest username> -Dtoken=<LambdaTest access token>

以下是IntelliJ的截图,显示了使用Maven的测试的执行状态。

screenshot from IntelliJ

一旦测试运行成功,我们就可以查看LambdaTest仪表板,并查看所有的视频记录、截图、设备日志以及测试运行的逐步细化细节。请看下面的截图,这将使你对自动化应用测试的仪表板有一个合理的概念。

我们平行地进行了4次测试--在2个不同的安卓设备上进行2次测试,在2个不同的iOS设备上进行2次测试。

下面的仪表板截图正确显示了我们从并行配置文件中传递的构建名称。这里要提到的一件重要的事情是,一旦你运行测试,你会看到所有的构建名称出现在并行中。另外,你可以检查设备分配和所有测试都在并行运行。

dashboard screenshot

下面的截图显示了构建的细节和运行的测试。同样,测试名称、设备名称、平台和各自的平台版本对于来自并行配置JSON文件的每个测试集都是正确可见的。

此外,这个屏幕详细显示了所有的指标,从测试人员的角度来看,这对检查哪个设备上运行了什么测试以及相应地查看设备和Appium的日志非常有帮助。

它还提供了测试运行的视频,让人们更好地了解测试是如何在设备上运行的。

LambdaTest-Build-1

LambdaTest-Build-1

LambdaTest-Build-2

LambdaTest-Build-2

羔羊测试-构建-3

LambdaTest-Build-3

LambdaTest-Build-4

LambdaTest-Build-4

结语

在这个Appium教程中,我们讨论了Appium并行测试及其优势和劣势。我们还谈到了与理解TestNG有关的一些要点,以及它如何帮助我们执行Appium并行测试。

我们还讨论了如何在LambdaTest上使用TestNG运行并行测试,LambdaTest是一个云托管的移动设备平台,以及我们如何使用LambdaTest仪表板及其详细的构建视图屏幕来查看测试运行的细节,它显示了关于测试运行的良好指标,包括日志、视频和更多数据。

常见问题解答(FAQ)

在Appium中可以进行并行测试吗?

Appium提供了一个默认的远程并行执行的实现,可以随时使用。它运行在Selenium WebDriver线协议和Appium自己的驱动实现之上。如果你有足够的设备,这个实现可以并行地运行测试。

TestNG可以在Appium中使用吗?

是的,它可以。TestNG是一个Java测试框架,具有许多功能,对编写功能和验收测试很有用。你可以使用这些功能来编写自动化测试,以实现移动应用测试过程的自动化。

TestNG可以在Appium中使用,用于编写移动应用程序的功能和验收测试。