超级棒,易于遵循的分步指南,用于设置自动执行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的新类,该类需要一个unittest 。 TestCase作为参数,表明这是一个测试用例函数。
- 第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上 发布 。