众所周知,自动化测试对任何程序员都非常有价值。 它是一种工具,可以模拟人在特定设备上的动作,因此受到青睐,因为它没有实际人的错误或速度限制。
Appium是基于流行的测试框架Selenium的自动测试工具,可在本机iOS和Android应用程序上进行自动测试。 它的主要限制是它仅适用于OS X和Linux。
在我的办公室,我们使用Appium进行回归测试。 回归测试只是意味着测试现有功能,以确保它们随着产品的增长而继续按预期运行。 了解功能何时中断非常重要,这样进度才能以线性方式继续进行。
在本教程中,我将向您展示如何为Android应用程序设置Appium,生成自动脚本以及创建一些简单的登录测试。
1. Appium设定
获取Appium不需要花费很多时间,但是很容易弄乱设置。 第一次安装Appium时,我是天真的下载了该应用程序(.dmg),然后在命令行上进行了设置。 事实证明,如果您首先下载该应用程序,可能会使在命令行上获取Appium变得非常困难。 因此,首先从命令行获取Appium。
在以下步骤中,我假设您已经安装了自制软件并且正在使用OSX。如果没有安装节点,请从命令行执行以下命令:
$ brew install node
接下来,使用节点包管理器安装Appium。 你不使用它的重要sudo这些命令或Appium将无法正常工作。
$ npm install -g appium
$ npm install wd
如果您没有使用这些命令的权限,则必须自己更改chmod而不是sudo 。 根据您的设置,文件夹的位置可能与您不同。
$ sudo chmod -R a+w /usr/local
要运行Appium服务器并查看是否已正确设置,请从命令行执行以下命令。
$ appium &
通过命令行上的Appium,您不仅可以在Android和iOS模拟器上运行Selenium测试,还可以在物理设备上运行Selenium测试。 该应用程序具有一个不错的用户界面,使您可以运行AUT (测试中的应用程序)的模拟版本,并轻松生成Selenium代码,以对应用程序执行简单的操作。 您将主要在创建测试的初始阶段使用该应用程序,然后使用命令行来运行测试。
我们为什么不将应用程序用于整个流程? 如果您计划在各种设备上以自动化方式(可能是按时间表)运行一套测试,那么从命令行运行Appium至关重要。
可以从Bitbucket下载Appium应用程序。 下载磁盘映像后,双击它,然后将Appium应用程序拖到“应用程序”文件夹中。
2. AUT设定
接下来,我们需要一个应用程序进行测试。 对于Appium的简介,我们将测试一个我称为AUT的本地Android应用程序。 这是一个非常简单的登录和注销应用程序。 成功登录后,它将带我们到一个页面,该页面告诉我们我们已成功登录,并显示注销按钮。
许多应用程序都具有登录功能,因此我们将创建一套基本的登录测试套件,以测试用户与登录流程进行交互的可能结果。 我们并不是要确保登录正常,我们要测试应用对用户可能无法登录的各种方式(例如,通过输入无效的凭据)的响应。
由于不可能拥有所有可用的Android设备,因此我通常在模拟设备上进行测试。 这使我可以轻松更改要模拟哪个设备以进行兼容性测试。 要获取Android模拟器,请获取AVD Manager并设置您选择的任何与API级别21兼容的Android设备。
- 从GitHub下载APK。
- 如果还没有JDK ,请获取它。
- 使用AVD Manager获取Android SDK 。
- 设置
ANDROID_HOME,JAVA_HOME和PATH环境变量在.profile或.bash_profile中 (或.zshrc如果您使用的zsh)。
ANDROID_HOME应该指向Android sdk的位置,而JAVA_HOME应该指向JDK的位置。
这样可以将这些路径添加到.bash_profile中 。 请注意,路径可能与您不同。
$ vim ~/.bash_profile
$ export ANDROID_HOME=/Users/(username)/Library/Android/sdk
$ export PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools
$ export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home
接下来,使用AVD Manager创建模拟设备。 确保启用“ 使用主机GPU”并将VM Heap设置为64 。
$ cd $ANDROID_HOME/tools
$ ./android avd
为了使模拟器运行更快,请从英特尔网站安装HAX。
3.鸦片检验员
现在该使用Appium Inspector并开始编写一些测试了。 启动Appium应用程序。 在“ 常规设置”中 ,取消选中“ 检查更新 ,启动应用程序 , 覆盖现有会话以及在启动前使用服务器端口终止进程” 。
接下来,选中Android单选按钮 ,然后点击Android图标 。 选中“ 应用程序路径” ,并将其值设置为放置要测试的应用程序APK的位置。 选中启动AVD,然后选择模拟设备。 从Platform Version的下拉菜单中选择5.1 Lollipop(API级别21) 。
点击启动,然后等待该应用在模拟设备上启动。
您可能会遇到一个问题,因为我们使用的是全新的API 21,因此应用程序在解锁时崩溃。要解决此问题,请在手动解锁模拟屏幕后再次启动该应用程序。
模拟设备启动应用程序后,点击放大镜图标以启动检查器。
这是Appium检查器。 这是一个非常方便的工具,可帮助您开始编写Appium测试。 本质上,检查器允许您在本机Android应用程序上执行操作,并将您的操作记录为生成的代码。
检查器左侧的框构成了UI导航器,并允许您导航当前活动的元素。 底部是与从元素框中选择的元素进行交互的选项。 所选元素的详细信息显示在“ 详细信息”中 。 如果您手动执行模拟操作,则必须单击“ 刷新”以使检查器识别这些更改。 如果要开始用代码记录操作,则必须单击“ 记录”按钮。
让我们创建成功登录所需的代码。 该应用程序具有两个硬编码的登录名,分别为success@envato.com :password和success2@envato.com :password2 。
- 单击记录 ,观察检查器下面现在有代码。 您可以选择不同的语言来显示。在本教程中,我们将使用Python。
- 在UI导航器中,导航到android.widget.LinearLayout / android.widget.FrameLayout /
android.widget.LinearLayout / android.widget.ScrollView /
android.widget.LinearLayout / android.widget.EditText [1]。 - 单击底部的文本 ,然后输入success@envato.com 。
- 单击“ 发送密钥” ,然后观察下面的代码有了新行。
5.在UI导航器中 ,导航到android.widget.LinearLayout /
android.widget.FrameLayout / android.widget.LinearLayout /
android.widget.ScrollView / android.widget.LinearLayout /
android.widget.EditText [2]
6.输入密码。
7.单击发送密钥 。
8.在UI导航器中 ,导航到android.widget.LinearLayout / android.widget.FrameLayout /
android.widget.LinearLayout / android.widget.ScrollView /
android.widget.LinearLayout / android.widget.Button [1]
9.单击底部的“ 触摸 ”,然后单击 。 我们现在正在进行一项新活动,因此UI导航器已更改。
10.单击“ 刷新”,因为检查员现在可能尚未意识到模拟器已超出加载屏幕。
11.在UI导航器中,导航到android.widget.LinearLayout / android.widget.FrameLayout /
android.widget.RelativeLayout / android.widget.Button [1]。
12.单击点击 。
在下面的代码中,我们提供了所有代码来模拟成功登录。 随时与检查员联系。 在本教程的稍后部分,我们还将为失败的登录编写测试。
4.登录测试
现在,我们将使用Appium编写一些测试,以确保我们的登录页面能够正常工作。 如果您没有Python,则可以从官方网站下载。
要将Appium Web驱动程序与Python一起使用,您还必须获取适用于Python的Appium库 。
- 下载并取消存档.gz文件。
- 打开.gz文件,导航到命令行上的位置,然后执行以下命令:
$ python setup.py install
在开始编写测试之前,我们需要确定将要制作的测试用例。 一个好的测试套件应该考虑所有可能的交互。 让我们从一个简单的开始。
- 成功登录。
- 登录失败。
#!/usr/bin/python
from appium import webdriver
import time
import unittest
import os
首先,我们必须导入测试所需的所有内容。 我们将使用内置的Python单元测试来运行我们的测试。 Appium元素是Web驱动程序,我们将使用它与Appium服务器进行交互。
class LoginTests(unittest.TestCase):
def setUp(self):
desired_caps = {}
desired_caps['appium-version'] = '1.0'
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['app'] = os.path.abspath('/Users/mkim/Documents/AUT/app/build/outputs/apk/app-debug-unaligned.apk')
self.wd = webdriver.Remote('http://0.0.0.0:4723/wd/hub', desired_caps)
self.wd.implicitly_wait(60)
我们创建一个类LoginTests来定义我们的测试套件。 单元测试的setUp功能在测试开始时运行。 在这种方法中,我们设置了所需的功能,例如Android和应用程序路径。 然后,我们通过连接到Appium服务器来初始化Web驱动程序self.wd
def tearDown(self):
self.wd.quit()
经过测试后, tearDown函数将运行,并且它与Appium服务器断开连接。
def test_success(self):
basepath = "//android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.ScrollView[1]/android.widget.LinearLayout[1]/"
basepath2 = "//android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/"
self.wd.find_element_by_xpath(basepath + "android.widget.EditText[1]").send_keys("success@envato.com")
self.wd.find_element_by_xpath(basepath + "android.widget.EditText[2]").send_keys("password")
self.wd.find_element_by_xpath(basepath + "android.widget.Button[1]").click()
try:
self.wd.find_element_by_xpath(basepath2 + "android.widget.TextView[1]")
except:
self.fail("Not at Login Success page.\n")
self.wd.find_element_by_xpath(basepath2 + "android.widget.Button[1]").click()
上面的代码块大部分是从Appium检查器代码复制而来的。 我们在用户界面上执行所需的操作才能成功登录。 在try子句中,我们尝试找到显示文本Login Success的textView元素! 如果引发异常,则测试失败。
def test_fail(self):
basepath = "//android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.ScrollView[1]/android.widget.LinearLayout[1]/"
self.wd.find_element_by_xpath(basepath + "android.widget.EditText[1]").send_keys("success@envato.com")
self.wd.find_element_by_xpath(basepath + "android.widget.EditText[2]").send_keys("wrongpassword")
self.wd.find_element_by_xpath(basepath + "android.widget.Button[1]").click()
try:
self.wd.find_element_by_xpath(basepath + "android.widget.Button[1]")
except:
self.fail("Not still at login screen.\n")
要使登录测试失败,我们特意使用了错误的密码errorpassword ,期望登录失败。 我们检查是否可以找到登录按钮元素,如果无法通过,则测试失败。
if __name__ == '__main__':
suite = unittest.TestLoader().loadTestsFromTestCase(LoginTests)
unittest.TextTestRunner(verbosity=2).run(suite)
这是运行测试所需的主要功能。 我们的第一个测试用例没有错。 但是,不成功的登录可能意味着很多事情。 当用户无法登录时,我们要确保用户界面正在帮助他们意识到如何解决错误,从而获得更好的用户体验。
- 成功登录。
- 使用不正确的密码登录。
- 使用不正确的电子邮件登录。
- 没有密码登录。
- 没有电子邮件登录。
- 使用无效的电子邮件登录。
我们已将登录页面的测试用例从两个测试用例扩展到了六个。 如此简单的功能看起来很多,但这是绝对必要的。
编写测试最困难的部分是检查期望。 例如,失败的登录测试将检查用户界面中是否存在元素。 这意味着登录测试完全依赖于用户界面来告诉我们是否满足要求。
这可能是一件坏事,因为用户界面无法告诉我们有关底层代码的所有信息。 但是,目标是测试用户界面,以便对用户界面元素存在的期望进行检查。 我们可以通过检查页面上是否存在每个期望的元素,甚至通过检查每个元素的正确位置来使我们的期望更加透彻。
结论
我们已经学会了如何:
关于Appium和测试还有很多要学习的东西。 下一步可能是创建一个持续集成的测试系统,该系统将Appium的功能用于您自己的应用程序。
翻译自: https://code.tutsplus.com/tutorials/an-introduction-to-appium--cms-23861
619

被折叠的 条评论
为什么被折叠?



