超级棒,易于遵循的分步指南,用于设置自动执行iOS测试的Appium

因此,您构建了一个kickass iOS应用程序。 您将其安装在iPhone上,进行试用,执行一些基本的手动测试,一切都将正常工作! 您感觉到了世界的最高境界,并且继续前进,开发应用程序的下一个重要功能,同时听到天使在后台唱歌。

海绵宝宝天使GIF –在GIPHY上找到并分享

与您认识的所有人一起发现并分享这个有趣的GIF。 GIPHY是您搜索,共享,发现和创建GIF的方式。

giphy.com

然后它像一堆砖头一样打击您。 对于您添加的每个新功能,还需要进行大量测试。 在设备上进行更多的部署-进行更多的手动测试-将更多的时间花费在测试上,而不是享受生活。

这就是Appium发挥作用的地方。 用其创建者的话说,Appium是一种开源工具,用于自动化iOS和Android平台上的本机,移动网络和混合应用程序。 简而言之:Appium允许您使用Python为您的应用程序创建自动化测试,因此您不必自己手动对其进行测试。

既然您对未来充满了期待和兴奋,现在该开始使用iPhone模拟器运行Appium进行iOS测试了!

启动您喜欢的文本编辑器并开始编写出色的测试可能会令人兴奋,我们首先需要安装一些模块,这些模块将帮助我们(和Appium)实现自动化。

首先,通过在命令行中键入pip -V来确保在系统上安装了PiP。 您应该得到类似于以下结果:

pip 9.0.1 from /Users/johnnyt/.py/lib/python2.7/site-packages (python 2.7) 

如果由于某种原因没有安装pip,请转到https://pip.pypa.io/en/stable/installing/了解有关如何安装的详细信息。

接下来,创建一个文件夹以放入我们所有的测试和配置文件,然后创建一个名为pip-reqs.txt的文本文件,其中包含我们希望安装的所有软件包:

 selenium==3.3.1 py==1.4.34 pytest==3.2.3 Appium-Python-Client==0.24 

为什么我们需要您可能会问的这4个软件包?

  • Selenium是浏览器自动化工具。 我们将使用它来执行测试中的各种动作。
  • Pytest是一个用Python编写测试的框架。
  • Py是pytest的依赖项。
  • Appium-Python-Client是Appium的Python包装器。

使用以下命令安装所有软件包:

 pip wheel --wheel-dir wheelhouse -r pip-reqs.txt 

使用NPM安装了Appium。 没错,这很容易。

 npm install -g appium 

为了使您的应用在模拟器中运行,必须为该模拟器专门编译该应用。 这是使用项目文件夹中的xcodebuild命令行工具完成的。 让我们研究以下示例:

 xcodebuild -workspace SuperAwesomeApp.xcworkspace -scheme SuperAwesome -sdk iphonesimulator11.1 

该命令为xcodebuild设置了三个必需的参数,如下所示:

  • 工作区 :此参数只是项目的xcode工作区文件名。
  • scheme :方案基本上是针对各种目标(例如Release或Test)的命令的集合。 要获取项目可能的方案列表,只需在项目的文件夹中键入以下命令:
 xcodebuild -list 
  • sdk :此参数指定在构建应用程序时要使用的SDK。 它可以是最新的iOS SDK,也可以是watchOS的特定版本。 要获取可用SDK的列表,只需在项目文件夹中键入以下命令:
 xcodebuild -showsdks 

Please️ 请注意 :由于我们希望使用模拟器进行自动化测试,因此在构建应用程序时应使用iphonesimulator SDK选项。

运行后,将创建一个名为.app的新文件夹,其中包含您的应用程序及其相关元素(调试代码等)。 如果您未更改默认项目值,则将在以下位置创建.app文件夹:

 ~/Library/Developer/Xcode/DerivedData/-xxxxxxxxxx/Build/Products/debug-iphonesimulator/ 

Please️ 请注意 :xxxxxxx将替换为随机字符串。

现在我们已经安装了所有内容,并且以正确的方式编译了我们的应用程序,让我们开始测试!

通过GIPHY

我们自动测试的基础是让Appium启动iPhone模拟器,将我们的应用程序部署到其中,然后最终运行该应用程序。

在“ 安装Python先决条件”步骤中创建的同一文件夹中,使用以下代码创建一个名为_common utils.py的新文件:

 from appium import webdriver import os def set_up(self): d_caps = {} d_caps['platformName'] = 'iOS' d_caps['platformVersion'] = '11.1' d_caps['deviceName'] = 'iPhone 7' d_caps['app'] = os.path.abspath('/users/johnnyt/Projects/super-awesome-app/DerivedData/SuperAwesome/Build/Products/Debug-iphonesimulator/SuperAwesome.app') self.driver = webdriver.Remote('http://localhost:4723/wd/hub', d_caps) 

让我们分析一下这段代码的作用:

  • 前两行将导入我们的代码将使用的包。
  • 第5行创建一个称为_d caps的空对象(所需的caps的缩写),它将保存模拟器的属性。
  • 第6-8行定义了模拟器的特征:平台类型(iOS),平台版本(在此示例中为iOS 11.1,您可以将其更改为测试方案中需要的任何内容)和设备名称(与Xcode中的模拟器名称相对应) 。
  • 第9行将路径设置为我们在上一步中创建的.app文件。
  • 第10行使用我们设置的所有属性启动模拟器。 现在,让我们来尝试一下新的set_up方法! 创建另一个名为_basic test.py的文件,并插入以下代码:
 import unittest import time from common_utils import set_up class BasicTest(unittest.TestCase): test_name = 'BasicTest' driver = None def test_basic_test(self): set_up(self) 

了解这里发生的事情非常简单:

  • 第3行-从我们先前创建的_common utils.py文件中导入_setup方法。
  • 第5行-定义了一个称为BasicTest的新类,该类需要一个unittestTestCase作为参数,表明这是一个测试用例函数。
  • 第6–7行创建2个变量:_test name持有代表测试的字符串(我们将在以后使用)和driver持有web驱动程序对象。
  • 第9行定义了一个称为_test_basic 测试的函数,该函数在实际使用案例中是一个测试。 在这个简单的示例中,该测试唯一要做的就是打开我们先前创建的set_up方法中定义的模拟器的新实例。

现在我们准备开始我们的第一个测试! 只需键入appium并按Enter,即可打开您喜欢的终端应用程序并运行appium服务器 。 如果一切顺利,您应该会看到类似以下内容:

接下来,打开另一个终端窗口并通过键入以下内容运行测试:

 pytest -v -s basic_test.py 

几秒钟后,如果众神向我们微笑,将弹出一个运行我们应用程序的新iPhone模拟器,测试将通过。

Yay Appium \ o /

如果现在查看命令行,您会看到我们创建的简单测试通过了。 这是因为我们没有真正测试任何东西,我们只是告诉Appium打开模拟器,并且因为它如此优雅地进行了测试-我们的测试被认为是成功的。

例如,更有用的测试是测试应用程序的登录流程。 您可能会问我们如何去做? 好了,计划如下:

  • 使用其ID来获取电子邮件文本字段。
  • 清理
  • 写一个我们知道存在并且可以登录的用户的电子邮件。
  • 使用其ID细化密码文本字段。
  • 输入该用户的密码。
  • 使用其ID抓住登录按钮。
  • 单击登录按钮。
  • 在我的示例应用程序中,用户登录后,将显示一个新页面,其中包含注销按钮。 如果登录成功,那么我们应该能够通过其ID抓住该注销按钮,从而知道执行了成功的登录。

通过GIPHY

现在我们知道需要做什么,让我们开始吧。

为了轻松获取字段和按钮,我们需要为其指定一个ID。 在Xcode中,单击登录按钮,然后单击电子邮件和密码字段,切换到Identity Inspector,在Accessibility选项下输入一个身份:

向电子邮件字段添加ID

此时,您将需要重新构建应用程序(如“为Appium准备应用程序”部分中所述),以便Appium能够使用新ID。

接下来,打开_basic test.py文件,并在_test_basic 测试方法中添加以下代码,其外观如下:

 def test_basic_test(self): set_up(self) email = self.driver.find_element_by_name("emailField") email.clear() email.send_keys("dixie@monize.com") self.driver.back() password = self.driver.find_element_by_name("passwordField") password.clear() password.send_keys("1234567") self.driver.find_element_by_name("loginBtn").click() time.sleep(5) self.driver.find_element_by_id("logoutBtn") 

让我们分析一下代码:

  • 第2行-设置模拟器本身(如果您忘记了其实现方式,请在上方查找)
  • 第3行- 驱动程序对象是我们要与模拟器进行所有交互的关键。 它公开的一个关键功能是_find_element_by name() 。 此函数采用字符串参数(名称),并在当前显示的视图中按该名称查找元素。 如果找到该元素,它将返回一个对象,该对象将允许我们与该元素进行交互。 在本例中,我们希望找到电子邮件字段(我们之前进行了设置)。
  • 第4-5行-使用我们在第3行中获取的电子邮件对象,我们现在可以与电子邮件文本字段进行交互。 第4行清除该字段可能包含的所有文本,第5行输入电子邮件地址。
  • 第6行-back()函数仅使我们退后一步。 在我们的例子中,它关闭了键盘。
  • 第7–9行—与第3-5行相同,但用于密码字段。
  • 第10行-使用与驱动程序对象相同的_find_element_by name()函数,我们抓住了登录按钮。 抓住后,我们使用click()函数对其进行单击(在这里有很大的惊喜哈?)
  • 第11行-sleep()方法允许我们指定等待操作发生的秒数。 在我们的情况下,我们等待5秒钟以完成登录过程,然后显示应用程序的下一页。
  • 第12行-这是测试的重点。 该行查找注销按钮(使用与以前相同的_find_element_by name()函数)。 如果找到-测试通过,否则通过-失败。

让我们看看这个测试的实际效果:

通过测试

那里有它。 完全有效的测试,实际上可以测试有用的东西! 从这里开始-世界就是您的牡蛎。 充分利用您在这里学到的知识,享受自动化测试带来的乐趣。

🔥特别感谢Noy Mizrahi提供的帮助!


最初在 www.perimeterx.com上 发布