开发者社区> 问答> 正文

Python脚本测试该如何进行?



1. 设置Desired Capabilities


在开始前,您可以点击下载本章所有测试相关文件。
开始第一步,创建一个文件,名为:desired_capabilities.py。内容如下:

  1. [backcolor=transparent]#!/usr/bin/env python
  2. [backcolor=transparent]def[backcolor=transparent] get_desired_capabilities[backcolor=transparent]():
  3. [backcolor=transparent]    desired_caps [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]{
  4. [backcolor=transparent]        [backcolor=transparent]'platformName'[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]'Android'[backcolor=transparent],
  5. [backcolor=transparent]        [backcolor=transparent]'platformVersion'[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]'4.0.4'[backcolor=transparent],
  6. [backcolor=transparent]        [backcolor=transparent]'deviceName'[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]'V889F'[backcolor=transparent],
  7. [backcolor=transparent]        [backcolor=transparent]'appPackage'[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]'com.alibaba.mts.mtsdemoapp'[backcolor=transparent],
  8. [backcolor=transparent]        [backcolor=transparent]'appWaitPackage'[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]'com.alibaba.mts.mtsdemoapp'[backcolor=transparent],
  9. [backcolor=transparent]        [backcolor=transparent]'app'[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]'D:/home/mdp/result/GroovyTest/case1/task.apk'[backcolor=transparent],
  10. [backcolor=transparent]        [backcolor=transparent]'newCommandTimeout'[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]30[backcolor=transparent],
  11. [backcolor=transparent]        [backcolor=transparent]'automationName'[backcolor=transparent]:[backcolor=transparent] [backcolor=transparent]'Appium'
  12. [backcolor=transparent]    [backcolor=transparent]}
  13. [backcolor=transparent]    [backcolor=transparent]return[backcolor=transparent] desired_caps
  14. [backcolor=transparent]def[backcolor=transparent] get_uri[backcolor=transparent]():
  15. [backcolor=transparent]    [backcolor=transparent]return[backcolor=transparent] [backcolor=transparent]"http://localhost:50000/wd/hub"

里面包含两个函数:get_desired_capabilities()和get_uri()。
a. get_uri()
返回Appium Server的地址,比如这里我们在本地启动的Appium Server,并且设置默认监听端口为50000,得到的地址是http://localhost:50000/wd/hub
b. get_desired_capabilities()
获取本次会话的参数。这里主要设置了8个参数。用户可以根据自己的需求进行调整。

  1. platformName,我们测试的目标机器。

  2. platformVersion,测试目标设备的系统版本。

  3. deviceName,测试机器的名称(设备名称即可)。

  4. appPackage,被测应用的包名(只有Android测试才用)。

  5. appWaitPackage,测试时会等待(只有Android测试才用)。

  6. app,被测应用文件的所在位置

  7. newCommandTimeout,两条指令的最长时间间隔。如果超过这个间隔,Appium Server将会终止本次会话。

  8. automationName,本次会话所使用的自动化引擎。Android 4.2以下系统请使用Selendroid;IOS、Android 4.2以上(含)请使用Appium。
    更多的选项,请参见capabilities文档


2. 编写测试用例


MQC会执行用户上传的main.py,所以要创建这个入口脚本:main.py。我们以一个登录的脚本main.py作为例子进行说明,代码如下:
  1. [backcolor=transparent]# -*- coding: utf-8 -*-
  2. [backcolor=transparent]from[backcolor=transparent] appium [backcolor=transparent]import[backcolor=transparent] webdriver
  3. [backcolor=transparent]# 引入刚刚创建的同目录下的desired_capabilities.py
  4. [backcolor=transparent]import[backcolor=transparent] desired_capabilities
  5. [backcolor=transparent]# 我们使用python的unittest作为单元测试工具
  6. [backcolor=transparent]from[backcolor=transparent] unittest [backcolor=transparent]import[backcolor=transparent] [backcolor=transparent]TestCase
  7. [backcolor=transparent]# 我们使用python的unittest作为单元测试工具
  8. [backcolor=transparent]import[backcolor=transparent] unittest
  9. [backcolor=transparent]# 使用time.sleep(xx)函数进行等待
  10. [backcolor=transparent]import[backcolor=transparent] time
  11. [backcolor=transparent]class[backcolor=transparent] [backcolor=transparent]MqcTest[backcolor=transparent]([backcolor=transparent]TestCase[backcolor=transparent]):
  12. [backcolor=transparent]   [backcolor=transparent]global[backcolor=transparent] automationName
  13. [backcolor=transparent]   [backcolor=transparent]def[backcolor=transparent] setUp[backcolor=transparent]([backcolor=transparent]self[backcolor=transparent]):
  14. [backcolor=transparent]       [backcolor=transparent]# 获取我们设定的capabilities,通知Appium Server创建相应的会话。
  15. [backcolor=transparent]       desired_caps [backcolor=transparent]=[backcolor=transparent] desired_capabilities[backcolor=transparent].[backcolor=transparent]get_desired_capabilities[backcolor=transparent]()
  16. [backcolor=transparent]       [backcolor=transparent]# 获取server的地址。
  17. [backcolor=transparent]       uri [backcolor=transparent]=[backcolor=transparent] desired_capabilities[backcolor=transparent].[backcolor=transparent]get_uri[backcolor=transparent]()
  18. [backcolor=transparent]       [backcolor=transparent]# 获取使用的测试框架
  19. [backcolor=transparent]       [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]automationName [backcolor=transparent]=[backcolor=transparent] desired_caps[backcolor=transparent].[backcolor=transparent]get[backcolor=transparent]([backcolor=transparent]'automationName'[backcolor=transparent])
  20. [backcolor=transparent]       [backcolor=transparent]# 创建会话,得到driver对象,driver对象封装了所有的设备操作。下面会具体讲。
  21. [backcolor=transparent]       [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]driver [backcolor=transparent]=[backcolor=transparent] webdriver[backcolor=transparent].[backcolor=transparent]Remote[backcolor=transparent]([backcolor=transparent]uri[backcolor=transparent],[backcolor=transparent] desired_caps[backcolor=transparent])
  22. [backcolor=transparent]   [backcolor=transparent]def[backcolor=transparent] test_searchbox[backcolor=transparent]([backcolor=transparent]self[backcolor=transparent]):
  23. [backcolor=transparent]        [backcolor=transparent]# 找到包含”Tab4”字符串的控件。
  24. [backcolor=transparent]        [backcolor=transparent]if[backcolor=transparent] [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]automationName [backcolor=transparent]==[backcolor=transparent] [backcolor=transparent]'Appium'[backcolor=transparent]:
  25. [backcolor=transparent]            tab4 [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]driver[backcolor=transparent].[backcolor=transparent]find_element_by_name[backcolor=transparent]([backcolor=transparent]"Tab4"[backcolor=transparent])
  26. [backcolor=transparent]        [backcolor=transparent]else[backcolor=transparent]:
  27. [backcolor=transparent]            tab4 [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]driver[backcolor=transparent].[backcolor=transparent]find_element_by_link_text[backcolor=transparent]([backcolor=transparent]"Tab4"[backcolor=transparent])
  28. [backcolor=transparent]        [backcolor=transparent]# 点击.
  29. [backcolor=transparent]        tab4[backcolor=transparent].[backcolor=transparent]click[backcolor=transparent]()
  30. [backcolor=transparent]        [backcolor=transparent]# 等待2秒钟
  31. [backcolor=transparent]        time[backcolor=transparent].[backcolor=transparent]sleep[backcolor=transparent]([backcolor=transparent]2[backcolor=transparent])
  32. [backcolor=transparent]        [backcolor=transparent]# 通过控件类名找到用户名和密码输入框。
  33. [backcolor=transparent]        editTexts [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]driver[backcolor=transparent].[backcolor=transparent]find_elements_by_class_name[backcolor=transparent]([backcolor=transparent]"android.widget.EditText"[backcolor=transparent])
  34. [backcolor=transparent]        [backcolor=transparent]# 第一个框为用户名输入框,输入用户名;第二个框为密码框,输入密码
  35. [backcolor=transparent]        editTexts[backcolor=transparent][[backcolor=transparent]0[backcolor=transparent]].[backcolor=transparent]send_keys[backcolor=transparent]([backcolor=transparent]"admin"[backcolor=transparent])
  36. [backcolor=transparent]        editTexts[backcolor=transparent][[backcolor=transparent]1[backcolor=transparent]].[backcolor=transparent]send_keys[backcolor=transparent]([backcolor=transparent]"admin"[backcolor=transparent])
  37. [backcolor=transparent]        [backcolor=transparent]# 隐藏出现的软键盘
  38. [backcolor=transparent]        [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]driver[backcolor=transparent].[backcolor=transparent]hide_keyboard[backcolor=transparent]()
  39. [backcolor=transparent]        [backcolor=transparent]# 找到包含“登录”的按钮并点击
  40. [backcolor=transparent]        [backcolor=transparent]if[backcolor=transparent] [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]automationName [backcolor=transparent]==[backcolor=transparent] [backcolor=transparent]'Appium'[backcolor=transparent]:
  41. [backcolor=transparent]            [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]driver[backcolor=transparent].[backcolor=transparent]find_element_by_name[backcolor=transparent]([backcolor=transparent]"登陆"[backcolor=transparent]).[backcolor=transparent]click[backcolor=transparent]()
  42. [backcolor=transparent]        [backcolor=transparent]else[backcolor=transparent]:
  43. [backcolor=transparent]            [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]driver[backcolor=transparent].[backcolor=transparent]find_element_by_link_text[backcolor=transparent]([backcolor=transparent]"登陆"[backcolor=transparent]).[backcolor=transparent]click[backcolor=transparent]()
  44. [backcolor=transparent]        [backcolor=transparent]# 等待3秒钟,登录需要与服务器通讯。
  45. [backcolor=transparent]        time[backcolor=transparent].[backcolor=transparent]sleep[backcolor=transparent]([backcolor=transparent]3[backcolor=transparent])
  46. [backcolor=transparent]   [backcolor=transparent]def[backcolor=transparent] tearDown[backcolor=transparent]([backcolor=transparent]self[backcolor=transparent]):[backcolor=transparent]
  47. [backcolor=transparent]        [backcolor=transparent]# 测试结束,退出会话。
  48. [backcolor=transparent]        [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]driver[backcolor=transparent].[backcolor=transparent]quit[backcolor=transparent]()

  • 几种查找控件的方法(在类By下):

    1. ID : 通过resource-id查找。注意,测试Android应用时,Appium引擎和Selendroid引擎的id写法不同,Appium下类似这样:com.alibaba.mts.mtsdemoapp:id/login_login_button;而Selendroid下id是:login_login_button。所以,如果要写通用的脚本,建议使用其他查找方式。

    2. XPATH : 通过xpath寻找。例如查找一个包含“Add note”字符串的TextView控件:driver.findElement(By.XPATH, "//android.widget.TextView[contains(@text,'Add note')]")。点击查看更多XPATH语法。

    3. LINK_TEXT : (不支持Android 4.2.1以下)通过控件的文本文字查找,比如:driver.findElement(By.LINK_TEXT, “登录”),找到控件文字为“登录”控件。注意,它不会匹配“登录吧”、“快登录”等文字。建议使用下面的“PARTIAL_LINK_TEXT”。

    4. PARTIAL_LINK_TEXT : (不支持Android 4.2.1以下)类似LINK_TEXT,但是可以匹配“登录吧”、“快登录”等文本的控件。只要包含“登录”即可。

    5. NAME : 与ACCESSIBILITY_ID相同,通过content description查找。content description是为生理缺陷的人使用的,比如色盲人员看不清图片,可以通过TalkBack等软件朗读content description的内容。

    6. TAG_NAME : 通过控件类名查找,比如EditText、Button等等。

    7. CLASS_NAME : 通过控件全类名查找,比如android.widget.EditText 、android.widget.Button等。

    8. CSS_SELECTOR : 只用于Hybird APP,通过CSS选择器,查找WebView中的HTML控件。

    9. ACCESSIBILITY_ID : 同NAME。
      更多示例请参考:hybird app查找方法、native app查找方法。

  • 关于支持操作:
    Appium支持滑动、点击、输入、安装、启动等方法,请参考详细文档。


3. 启动Appium Server


在本地的命令行中执行命令:
appium –p 50000
启动参数释义:

  1. “-p”: 指定appium server监听的端口号。

  2. “-a”: 指定appium server的ip地址。

  3. “-selendroid-port”: selendroid模式下,adb forward的端口。

  4. “-U”: 当挂载多个设备时,可以通过此参数指定某个设备的串号,这样Appium server就可以知道是要在这个设备上进行测试。

  5. “--full-reset”: 如果加上此参数,设备每个case完成时都会对设备进行完全的清理。


4. 执行测试用例


在命令行中执行命令:
python -m unittest main
其中main就是我们刚刚创建的测试用例:main.py

5. 提交到MQC云平台


本地测试通过之后,将所有测试文件打包成zip文件,然后在”Android功能测试”里,提交被测应用和打包后的脚本ZIP包。
注意,目前只支持一个main.py作为testsuite,并且请使用unittest作为用例测试工具。更多问题,请到我们的旺旺交流群(群号:335334143)中反馈。

展开
收起
猫饭先生 2017-10-25 10:15:18 1536 0
1 条回答
写回答
取消 提交回答
  • 1. 单元测试:编写单元测试是Python脚本测试的首要任务。单元测试是针对代码中最小的可测试单元的测试,可以确保代码的正确性,并帮助发现潜在的错误。在编写单元测试时,我们可以使用unittest或pytest等测试框架。

    2. 集成测试:在编写Python脚本时,通常会涉及到多个模块或组件。集成测试是用来测试这些模块或组件之间的交互和协作。在进行集成测试时,我们需要使用模拟数据或者实际数据来测试代码的正确性。可以使用unittest或pytest等测试框架来进行集成测试。

    3. 功能测试:功能测试是用来测试Python脚本的整体功能的测试,也称为端到端测试。功能测试需要模拟真实的用户行为,测试整个程序的正确性和性能。在进行功能测试时,我们需要考虑各种情况,如输入数据的正确性、异常处理等。可以使用Selenium等自动化测试框架来进行功能测试。

    4. 性能测试:性能测试是用来测试Python脚本的性能和资源利用率的测试。在进行性能测试时,我们需要模拟真实的负载,测试程序的响应时间、吞吐量等指标。可以使用JMeter等性能测试工具进行性能测试。

    5. 安全测试:安全测试是用来测试Python脚本的安全性的测试,包括SQL注入、XSS攻击、CSRF攻击等。安全测试需要模拟真实的攻击行为,测试程序的安全性和漏洞。可以使用OWASP ZAP等安全测试工具进行安全测试。

    2023-06-19 19:04:54
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
移动互联网测试到质量的转变 立即下载
给ITer的技术实战进阶课-阿里CIO学院独家教材(四) 立即下载
F2etest — 多浏览器兼容性测试整体解决方案 立即下载