51Testing软件测试论坛

标题: 【你来问我来答第97期】:如何设计搭建自动化测试框架!(活动结束) [打印本页]

作者: lsekfe    时间: 2018-11-1 11:22
标题: 【你来问我来答第97期】:如何设计搭建自动化测试框架!(活动结束)
[attach]119197[/attach]
论坛ID:卡卡罗特
真实姓名: 何知非
曾任公司: 恒生电子股份有限公司
职位:测试技术部经理

作品:移动端爬虫获取京东大数据集
工作经验:
从业测试技术领域约15年,早期做过一些软件开发和运维工作,进入测试行业最早是在浙江省移动业务支撑中心担任测试组长,除日常测试工作外,负责自动化测试框架的维护和开发。后来与朋友合伙出来经营了一家小公司,专门接一些测试外包单项目,如美国Trilogy公司,恒生电子,联众医疗,淘宝等。于2010年正式加入恒生电子股份有限公司,担任测试技术部经理一职。作为首个公司级测试技术专家(E5),编写过多套自动化测试框架,UI和接口均包含,运用过自动化测试工具较多,如Winrunner,QTP,Testcomplete,Selenium,Appium等。除自动化测试外,性能测试,渗透测试,爬虫等技术领域也有所涉猎。

讲师语录:
自动化测试框架设计的核心,可以概括为解决以下这些问题:
1、测试数据要怎么准备,如何在框架中实现,是否可复用。
2、测试用例的批量导入。
3、用例之间是否存在逻辑关系,相互之间是否有影响,在框架中该如何处理。
4、测试执行结果的导出和查看。
5、执行失败的用例如何快速定位复现。
6、对于UI自动化,当出现异常时(如对象获取不到,无法对对象进行指定操作),框架要如何对应处理,以保证整套用例不会中断执行。
7、运用多进程和分布式管理的方式,实现在有限时间内完成大批量测试用例的执行。
8、测试结果的数据统计,生成分析图表。


各位会员可以在11月10日前以回帖的方式向客座专家提问。
(请大家围绕本期客座专家的擅长领域进行提问、探讨)
客座专家将在11月11日—11月31日为大家集中解答。

机会难得,欢迎大家踊跃提问!




作者: 明晚打老虎    时间: 2018-11-5 14:49
老师您好,请问jmeter原本返回101的请求在回放时返回400,这样的对压测结果又影响吗?大概是什么原因造成的呢?我们这个系统每个请求都会生成一个新的JESSIONID,不知道有没有影响
作者: Miss_love    时间: 2018-11-7 08:47
大佬好:
作者: Miss_love    时间: 2018-11-7 08:48
大佬好:
关于这些:
自动化测试框架设计的核心,可以概括为解决以下这些问题:
1、测试数据要怎么准备,如何在框架中实现,是否可复用。
2、测试用例的批量导入。
3、用例之间是否存在逻辑关系,相互之间是否有影响,在框架中该如何处理。
4、测试执行结果的导出和查看。
5、执行失败的用例如何快速定位复现。
6、对于UI自动化,当出现异常时(如对象获取不到,无法对对象进行指定操作),框架要如何对应处理,以保证整套用例不会中断执行。
7、运用多进程和分布式管理的方式,实现在有限时间内完成大批量测试用例的执行。
8、测试结果的数据统计,生成分析图表。

您是怎么做的呢?、贵公司的UI自动化框架用到了哪些工具?
作者: 测试乞丐    时间: 2018-11-7 14:07
一直在思考这个问题:一个优秀的自动化测试框架应该具备哪些条件?希望嘉宾能够帮我解答这个困惑!
作者: 热情的绿洲    时间: 2018-11-7 14:11
老师你好,在我们公司测试中,无论测试环境测试还是线上回归,都不可避免的会出现大量的垃圾数据。
测试环境还好,可以清空数据库(清起来超爽😏 ,就是可能会被测试同事打)。但是生产环境无法接触到数据库。这些测试数据一条一条删起来很费力(selenium删或者手动删)。不知道您有什么好方式吗?
作者: bling123    时间: 2018-11-7 15:44
你好,我这里有一个关于app元素定位的问题:
定位到一个元素,如QQ中的“写说说”这个按钮(是一个半屏幕下拉框格式),我是通过text = "说说"定位的,但是实际运行的时候,无法成功运行,这是什么原因啊?

然后我又想到通过android.widget.LinearLayout这个className定位,这个className是在第三个,就是说instance = 2,
d(className=("android.widget.LinearLayout").instance(2)).click()有报错,这一块怎么处理呢?

简约代码:
#  com.tencent.mobileqq
import uiautomator2 as u2
from time import sleep
d = u2.connect('192.168.1.129')
d.app_start("com.tencent.mobileqq")
d(text="动态").click()
sleep(4)
d(description = ("点击进入好友动态")).click()
sleep(4)
d(description=("写说说等按钮")).click()
sleep(4)
#  d(className=(("android.widget.LinearLayout").instance(2))).click()
d.text("说说").click()
sleep(4)
d(text="分享新鲜事...").set_text("flyme!")
sleep(4)
d(text="发表").click()
sleep(4)
d(description = ("返回动态 按钮")).click()
sleep(4)
d.app_stop("com.tencent.mobileqq")
作者: bling123    时间: 2018-11-7 15:48
bling123 发表于 2018-11-7 15:44
你好,我这里有一个关于app元素定位的问题:
定位到一个元素,如QQ中的“写说说”这个按钮(是一个半屏幕 ...

报错内容是:AttributeError: 'str' object has no attribute 'instance'


作者: bling123    时间: 2018-11-7 15:48
bling123 发表于 2018-11-7 15:44
你好,我这里有一个关于app元素定位的问题:
定位到一个元素,如QQ中的“写说说”这个按钮(是一个半屏幕 ...

报错内容是:AttributeError: 'str' object has no attribute 'instance'然后我又改成:
d(className=(("android.widget.LinearLayout").instance(2))).click()也不行


作者: 卡卡罗特    时间: 2018-11-7 17:16
Miss_love 发表于 2018-11-7 08:48
大佬好:
关于这些:
自动化测试框架设计的核心,可以概括为解决以下这些问题:

因为以上这些问题还是比较发散式的,点题的目的主要也是为了引发大家的思考。
如果全部具体讲解的话,可能篇幅也会比较长。还是以引导的方式,提供些思考方向给大家吧:

期望以上这些信息能对大家的工作有所帮助~

作者: 卡卡罗特    时间: 2018-11-7 17:17
明晚打老虎 发表于 2018-11-5 14:49
老师您好,请问jmeter原本返回101的请求在回放时返回400,这样的对压测结果又影响吗?大概是什么原因造成的 ...

Jmeter我不太熟哦,建议问下上一期的专家大佬,哈哈~
作者: 卡卡罗特    时间: 2018-11-7 17:24
测试乞丐 发表于 2018-11-7 14:07
一直在思考这个问题:一个优秀的自动化测试框架应该具备哪些条件?希望嘉宾能够帮我解答这个困惑!

出发点还是要以提高测试效率,扩大用例覆盖范围作为自动化测试的目标。
另外团队的力量一定是大于个人的。所以如果你的角色是作为测试团队中的测试开发,还要考虑到开发出来的自动化测试框架是否适用于目前团队成员及项目/产品现状,能否帮助他们改进日常的工作。(这里还要考虑到团队的技术基础。必要时对他们输出相应的培训和使用指导)
作者: 卡卡罗特    时间: 2018-11-7 17:31
热情的绿洲 发表于 2018-11-7 14:11
老师你好,在我们公司测试中,无论测试环境测试还是线上回归,都不可避免的会出现大量的垃圾数据。
测试环 ...

条件允许的话,如果希望测试数据尽可能接近生产环境(这点我也比较赞同),可以考虑把生产库的数据全部或部分拷贝出来,搭建到独立的自动化测试环境中,这样同样也可以避免影响到其他测试同事的数据。
在测试环境准备上,可以通过vmware或docker容器的方式,相对节省资源。
再强调一遍,独立的自动化测试环境,在执行上还是很有必要的。这块资源一般公司还是都能有条件提供的吧
作者: 卡卡罗特    时间: 2018-11-7 19:58
本帖最后由 卡卡罗特 于 2018-11-8 13:02 编辑
bling123 发表于 2018-11-7 15:48
报错内容是:AttributeError: 'str' object has no attribute 'instance'然后我又改成:
d(className=(( ...

我自己操作试了下。可以用xpath顺利执行。(用的机型为小米6,qq为最新版)通常首先考虑用id,如果没有id就用xpath。通过这两种属性基本都能定位并操作对应的办法。
另外为了动态加载等待对象的时间,可以添加个WebDriverWait。比用sleep硬等待时间会更好些。
[attach]119287[/attach]

参考代码如下(部分):
from appium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

#配置
caps = {'platformName': 'Android', 'deviceName': 'XXXX,'appPackage': 'com.tencent.mobileqq', 'appActivity': 'com.tencent.mobileqq.activity.SplashActivity','XXXX':'XXXX'}

#驱动
driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)
wait = WebDriverWait(driver, 30)


#定位对象并调用方法操作
xpath = u'//android.widget.TextView[@content-desc="说说"]'
shuoshuo = wait.until(EC.presence_of_element_located((By.XPATH, xpath)))
shuoshuo.click()



作者: always_fly    时间: 2018-11-8 11:39
嘉宾你好,看到你的课程内容,以下有几点我想咨询下:
1.性能如何评估(现在爬虫主要语言:python,java这两个有成熟框架可以弄)
2.数据质量用什么做标准 ?
3.策略和去重

作者: 海鸥一飞    时间: 2018-11-8 11:41
你好老师,想问下关于爬虫的内容。
最近也刚开始接触爬虫测试,开发写好爬虫脚本让我来测试验证,我这边的验证方法主要有两点:一是,运行爬虫脚本观察是否会出现异常,这点主要是通过查看log日志来检查的;二是,检查爬取的数据对不对,这点主要是查看数据库里的数据字段是不是全,是否都有值;不知道这个对不对。
作者: 卡卡罗特    时间: 2018-11-8 13:14
海鸥一飞 发表于 2018-11-8 11:41
你好老师,想问下关于爬虫的内容。
最近也刚开始接触爬虫测试,开发写好爬虫脚本让我来测试验证,我这边的 ...

你好,你的测试方法完全可行。
另外建议可以补充几点:
1、检查下最终的爬取记录总数,看是否存在爬虫执行过程中有丢包。
2、现在网站实施反爬措施的也日益增多。通常在爬取一段时间后就会被触发,所以需要跟踪观察。
3、如果遇到反爬的网站,处理机制通常会用到cookie池和ip池两种方式,可以和你的开发小伙伴一起了解下。
作者: 卡卡罗特    时间: 2018-11-8 13:37
always_fly 发表于 2018-11-8 11:39
嘉宾你好,看到你的课程内容,以下有几点我想咨询下:
1.性能如何评估(现在爬虫主要语言:python,java这 ...

你好,根据你提到的几点:
1、我主要用python,上手加快的框架可以选用pyspider(入门课程这两天就会上线)。功能更强大的,灵活配置度高的,可以选用scrapy框架(我的另一门分布式自动化测试框架课程用有讲解到此工具,目前课程已在后期处理中)。对于java我用的不多。所以没法回答你两者的性能比较。2、数据质量标准?嗯,不是很明白你的意思……就我的理解,爬取的数据大多是作为大数据分析的“原材料”,相关的大数据分析师,或搞机器对抗、人工AI的工程师,会明确提供给爬虫师对应的要求吧?
3、爬虫建议用非阻塞式请求会来的效率快。配合multiprocessing模块可以实现多进程方式,还有treading多线程方式,可以根据自己的需求搭配使用。在去重机制上,Scrapyd-Redis库自带此功能。另外还有国人对去重指纹做优化后的改良版scrapyd-redis-bloomfilter(布隆过滤器)可以了解下。

作者: 爱车rav4    时间: 2018-11-9 10:12
嘉宾,你好。请教下关于“Android图形自带以及新开发的控件以及方法”的自动化测试框架都在用哪种哈?
是手动在测试还是自动化的呢?
若是自动化的话都在用CTS在测试的么?有没有在用其他测试框架的啊?
多谢
作者: 四台索米    时间: 2018-11-9 10:21
嘉宾你好,您的经历非常的丰富。我想咨询下您,现在测试框架越来越多,如果来选择自己的测试框架,您这边有什么好的看法吗?
作者: 卡卡罗特    时间: 2018-11-9 17:46
四台索米 发表于 2018-11-9 10:21
嘉宾你好,您的经历非常的丰富。我想咨询下您,现在测试框架越来越多,如果来选择自己的测试框架,您这边有 ...

你好,
如今业内大部分公司都会选择开源框架作为主要的自动化测试工具。
相对于那些商用工具。开源的最大优势(免费呀免费!)在于对于自己公司的业务和测试需求能更好的做二次开发和个性化定制。

在选择和评估要使用的框架时,我会考虑但不局限于以下几方面:
    1、选择团队大部分成员都熟悉的编程语言,这样可以促使整个团队来对自动化测试进行开发和维护;
    2、如果包含知识传递,比如有业务人员和项目经理等非技术人员的参与,就得考虑框架中测试用例模块的可读性和易懂性,以便协作开发;
    3、测试场景的复杂度,如业务流程和系统界面等因素,对框架的易用性和协作性有哪些要求。对应的开发、管理、维护的投入成本;
    4、框架与被测系统的交互性。尤其在GUI层,确保系统容易被测试,比如给GUI元素增加标识、输出易于解析的文本、提供自动化接口等;
    5、对于版本控制和持续集成的支持;

之前看过一遍文章,对目前较好的几个测试框架做了介绍,觉得不错,搬运到此分享下:
Robot Framework
最流行的Python自动化测试框架,可以运行在Java和.NET环境。
支持跨平台,例如Windows、MacOS和Linux。
留有API扩展空间,支持表格式的测试数据语法和关键词驱动测试。

RedwoodHQ
大部分流行的编程语言都可以用来编写测试,例如Java、Python、C#和likewise。
有一个网站界面,在那里多个测试人员可以在一个平台上协作和运行测试用例。
有一个内置的IDE,可以在那里创建和修改测试用例,并且并行运行。


Jasmine
行为驱动开发框架,适用于任何使用JavaScript的地方。
可被用于Python和Ruby自动化测试。
可以并行运行客户端测试用例和服务端测试用例。


Pytest
适用于复杂度较低的小项目。
提供了测试用例的详细失败信息,可以快速准确地改正问题。
包含更多功能的插件和多样化的现有测试技术和测试用例,在它的社区有300多个插件可供选择。
可以将Pytest与诸如Selenium和Splinter之类的图形用户界面一起使用。

原文地址:
https://www.freelancinggig.com/blog/2018/04/20/python-frameworks-available-test-automation/

作者: dumb_dora    时间: 2018-11-12 09:48
大佬你好,请教一下,证券交易柜台这块业务的自动化框架和互联网行业相比,自动化测试框架选型上面能推荐一下么?谢谢
作者: 卡卡罗特    时间: 2018-11-12 14:56
dumb_dora 发表于 2018-11-12 09:48
大佬你好,请教一下,证券交易柜台这块业务的自动化框架和互联网行业相比,自动化测试框架选型上面能推荐一 ...

你好,不知道你说的“证券交易柜台”是那种系统架构,C/S or B/S?
如果是做UI自动化,可选的工具很多,QTP,TestComplete都可以胜任。如果是B/S架构,还可以用selenium自行开发,定制化效果更好。
如果是接口自动化测试的话,考虑到用的的协议估计不是那些通用协议,比如恒生电子就是自定义开发的交易接口协议,那只有自己开发对应的测试工具喽。
作者: dumb_dora    时间: 2018-11-12 16:10
卡卡罗特 发表于 2018-11-12 14:56
你好,不知道你说的“证券交易柜台”是那种系统架构,C/S or B/S?
如果是做UI自动化,可选的工具很多, ...

我们公司的业务确实不是通用协议,目前已有的测试框架是自己开发的,确实也存在前面提到的测试用例添加效率低下,测试数据准备繁琐,测试执行效率低下等若干问题,多些大佬的这些点拨,让我们有了努力的方向。
作者: 太鼓达人    时间: 2018-11-13 14:41
老师你好,看到你一门课程是关于爬虫的,我想问下如何判断爬虫采集内容是否违法? 这块一直比较敏感,望解答!我们公司也是做电商业务的。
作者: 小文0111    时间: 2018-11-13 14:45
老师问个小白问题,搭建测试框架之前需要掌握哪些测试知识,现在测试框架越来流行,但是对于我这个新人而已还是比较朦胧的时候。
作者: 卡卡罗特    时间: 2018-11-13 19:30
太鼓达人 发表于 2018-11-13 14:41
老师你好,看到你一门课程是关于爬虫的,我想问下如何判断爬虫采集内容是否违法? 这块一直比较敏感,望解答 ...

技术本身是不违法的。
不要去爬取个人相关信息。你懂的。
作者: 卡卡罗特    时间: 2018-11-13 19:41
小文0111 发表于 2018-11-13 14:45
老师问个小白问题,搭建测试框架之前需要掌握哪些测试知识,现在测试框架越来流行,但是对于我这个新人而已 ...

你好,欢迎加入测试大家庭~
类似问题之前应该有不少大大佬们都有做过指导,我这边就说几句自己的理解和看法吧:
首先熟悉和掌握测试工作的日常内容和流程。
然后在此基础上,学习1-2门编程语言,既可以加强自己的软件工程的认知和理解,还可以锻炼自己的动手能力。
开发测试工具和框架其实与软件开发工程同理,也会经历需求分析,架构设计、开发编码、调试运行再优化等几个阶段。
看得多听得多,都不如自己多动动手。
作者: 卡卡罗特    时间: 2018-11-13 19:43
dumb_dora 发表于 2018-11-12 16:10
我们公司的业务确实不是通用协议,目前已有的测试框架是自己开发的,确实也存在前面提到的测试用例添加效 ...

很高兴能对你有所启发或帮助,共勉之
作者: 虫王戮蛊    时间: 2018-11-14 09:36
热情的绿洲 发表于 2018-11-7 14:11
老师你好,在我们公司测试中,无论测试环境测试还是线上回归,都不可避免的会出现大量的垃圾数据。
测试环 ...

自动化测试时可以添加后交易来删除相应或还原相应数据
作者: 虫王戮蛊    时间: 2018-11-14 09:36
测试乞丐 发表于 2018-11-7 14:07
一直在思考这个问题:一个优秀的自动化测试框架应该具备哪些条件?希望嘉宾能够帮我解答这个困惑!

上面楼主都提到了啊,我觉得总结的很好
作者: 虫王戮蛊    时间: 2018-11-14 09:36
测试乞丐 发表于 2018-11-7 14:07
一直在思考这个问题:一个优秀的自动化测试框架应该具备哪些条件?希望嘉宾能够帮我解答这个困惑!

上面楼主都提到了啊,我觉得总结的很好
作者: 虫王戮蛊    时间: 2018-11-14 09:37
测试乞丐 发表于 2018-11-7 14:07
一直在思考这个问题:一个优秀的自动化测试框架应该具备哪些条件?希望嘉宾能够帮我解答这个困惑!

上面楼主都提到了啊,我觉得总结的很好。
作者: 一纸荒年    时间: 2018-11-14 10:26
您好老师,现在学习自动化测试框架 以下有几个问题想咨询下您:
想通过junit+selenium+Coverlipse+ant来搭建一整套自动化测试框架
1.如何录制脚本?
2.如何转换成junit脚本?
3.如何生成junit日志?
4.如何回放selenium及查看回放日志?
5.如何查看代码的覆盖率?
这几个问题 比较基础 覆盖面也有点广,如果老师这边有链接的话也可以给我参考下,谢谢!
作者: My_JIE    时间: 2018-11-14 10:35
老师你好,有一个appium的问题,想请教下?
appium 接入robot framework测试框架的问题,一直没搞明白,求助?
由于图片放不上去,只能手写描述了。
  1. open app
  2. ${capabilities}= Create Dictionary
  3. Set To Dictionary ${capabilities} browserName ios
  4. Set To Dictionary ${capabilities} version 6.1
  5. Set To Dictionary ${capabilities} platform Mac
  6. Set To Dictionary ${capabilities} app /code/5060/ivms-5060.app
  7. open Browser \ browser = ios remote_url =http://127.0.0.1:4723/wd/hub desired_capabilities=${capabilities}
复制代码
运行后弹出提示信息 selenium2Library上没有browser = ios这个方法。我看了下源码,没有ios这个方法。
请问大神们下我这个需要修改哪些地方

作者: 奥利咕噜囧勒嘿    时间: 2018-11-16 14:26
老师您好,您要是熟悉loadrunner的话可以帮帮我吗
我在用web_reg_save_param_ex的时候,


web_reg_save_param_ex(
"ParamName=temp",
"LB/IC/RE=\"id\":",
"RB/IC/RE=,\"name\"",
"Ordinal=all",
SEARCH_FILTERS,
LAST);


已经取到我要的id值,像这样


vuser_end.c(14): Notify: Saving Parameter "temp_43 = 778".
vuser_end.c(14): Notify: Saving Parameter "temp_44 = 779".
vuser_end.c(14): Notify: Saving Parameter "temp_45 = 780".
vuser_end.c(14): Notify: Saving Parameter "temp_46 = 781".
vuser_end.c(14): Notify: Saving Parameter "temp_count = 46".


但是我在用的这个参数的时候出现了问题,百度上说这些参数都放在temp里,这时temp是个数组参数,然后我用lr_paramarr_idx("{temp}",i)取temp里的值取不到,log里显示temp给我传的值是 vuser_end.c(29): Notify: Parameter Substitution: parameter "temp" = "HTTP/1.1 200 OK\r\nServer: nginx\r\nDate: Fri, 16 Nov 2018 01:24:05 GMT\r\nContent-Type: image/png;charset=UTF-8\r\nContent-Length: 20431\r\nConnection: keep-alive\r\nLast-Modif 这样一大串后面还有我没复制过来,并不是我要的id值,就卡在这了,我就想问为什么temp里变成了这个呢,关联函数给我返回的到底是不是个数组

作者: 卡卡罗特    时间: 2018-11-19 15:36
一纸荒年 发表于 2018-11-14 10:26
您好老师,现在学习自动化测试框架 以下有几个问题想咨询下您:
想通过junit+selenium+Coverlipse+ant来搭 ...

论坛里有大神早在14年就发过一篇帖子,包含了你的这些问题哦。
帮你把链接找到啦:
http://www.51testing.com/html/32/200632-866591.html
另外Youtube上还有视频教程,时长1小时40分,内容也是很详细的。
不过播主是印度人,所以这英语口音听起来会比较怪怪的……
至于怎么访问Youtube,嘿嘿,自己研究下?
链接也发给你:
https://www.youtube.com/watch?v=KAmII54wpAY

作者: 卡卡罗特    时间: 2018-11-19 15:39
My_JIE 发表于 2018-11-14 10:35
老师你好,有一个appium的问题,想请教下?
appium 接入robot framework测试框架的问题,一直没搞明白,求助 ...

ios不是要在mac系统下才能使用appium吗?
因为我也穷的买不起mac,所以暂时也没法亲自验证确认答复你。
不晓得回答是否和你的问题能对应上,不好意思了。
作者: 悠悠小仙仙    时间: 2018-11-22 13:24
老师你好,我想问下一个项目中自动化测试是否能有效的展开,自动化测试框架是关键所在是在哪里?
作者: MilgGtery    时间: 2018-11-22 13:30
老师你好,目前在学习自动化测试框架。
Serenity、Robot Framework、RedwoodHQ、Sahi、Galen Framework、Gauge这6个主流的框架。
我学习的编程语言是java,工具的话是 Selenium。但是框架太多,我想了解下如果目前在公司中哪种框架使用的比较多,像我这种情况的话应该怎么来学习?谢谢!
作者: My_JIE    时间: 2018-11-22 13:33
老师你好,用c#从零开始开发了一个自动化测试框架,请问这是什么水平?
背后的意思,老板该给我多少工资了,做出来象征性的给我涨了一千块
工具包含了功能测试,接口测试,性能测试三个模块,可以编辑用例,导入导出用例,监控测试过程,输出测试结果。
作者: applepen    时间: 2018-11-26 11:01
My_JIE 发表于 2018-11-22 13:33
老师你好,用c#从零开始开发了一个自动化测试框架,请问这是什么水平?
背后的意思,老板该给我多少工资了 ...

自己能编写框架66666
作者: bling123    时间: 2018-11-28 09:47
你好,在工作的途中执行脚本的时候一直卡这里就不运行了,网上说要修改等待时间什么的,没用,您看看这是什么原因呢?
python+appium+unittest


appium中:
> error: Unhandled error: TypeError: undefined is not a function
>     at [object Object].ADB.getPIDsByName (D:\Appium\loadspace\Appium\node_modules\appium\node_modules\appium-adb\lib\adb.js:1037:8)
>     at [object Object].ADB.killProcessesByName (D:\Appium\loadspace\Appium\node_modules\appium\node_modules\appium-adb\lib\adb.js:1079:8)
>     at [object Object].UiAutomator.start (D:\Appium\loadspace\Appium\node_modules\appium\lib\devices\android\uiautomator.js:29:12)
>     at [object Object].<anonymous> (D:\Appium\loadspace\Appium\node_modules\appium\lib\devices\android\android.js:115:37)
>     at D:\Appium\loadspace\Appium\node_modules\appium\node_modules\async\lib\async.js:607:21
>     at D:\Appium\loadspace\Appium\node_modules\appium\node_modules\async\lib\async.js:246:17
>     at iterate (D:\Appium\loadspace\Appium\node_modules\appium\node_modules\async\lib\async.js:146:13)
>     at D:\Appium\loadspace\Appium\node_modules\appium\node_modules\async\lib\async.js:157:25
>     at D:\Appium\loadspace\Appium\node_modules\appium\node_modules\async\lib\async.js:248:21
>     at D:\Appium\loadspace\Appium\node_modules\appium\node_modules\async\lib\async.js:612:34
>     at [object Object].androidCommon.initUnicode (D:\Appium\loadspace\Appium\node_modules\appium\lib\devices\android\android-common.js:878:5)
>     at D:\Appium\loadspace\Appium\node_modules\appium\node_modules\async\lib\async.js:607:21
>     at D:\Appium\loadspace\Appium\node_modules\appium\node_modules\async\lib\async.js:246:17
>     at iterate (D:\Appium\loadspace\Appium\node_modules\appium\node_modules\async\lib\async.js:146:13)
>     at D:\Appium\loadspace\Appium\node_modules\appium\node_modules\async\lib\async.js:157:25
>     at D:\Appium\loadspace\Appium\node_modules\appium\node_modules\async\lib\async.js:248:21
>     at D:\Appium\loadspace\Appium\node_modules\appium\node_modules\async\lib\async.js:612:34
>     at [object Object].<anonymous> (D:\Appium\loadspace\Appium\node_modules\appium\node_modules\appium-adb\lib\adb.js:180:9)
>     at ChildProcess.exithandler (child_process.js:742:7)
>     at ChildProcess.emit (events.js:110:17)
>     at maybeClose (child_process.js:1016:16)
>     at Process.ChildProcess._handle.onexit (child_process.js:1088:5) context: [POST /wd/hub/session {"capabilities":{"firstMatch":[{}],"alwaysMatch":{"platformName":"Android","appium:platformVersion":"7.0","appium:deviceName":"0123456789ABCDEF:5037","appium:appPackage":"com.njzx.care","appium:appAct]


Test_report说:
  File "D:\python\lib\http\client.py", line 297, in begin    version, status, reason = self._read_status()  File "D:\python\lib\http\client.py", line 266, in _read_status    raise RemoteDisconnected("Remote end closed connection without"urllib3.exceptions.ProtocolError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response',))

作者: bling123    时间: 2018-11-28 09:48
bling123 发表于 2018-11-28 09:47
你好,在工作的途中执行脚本的时候一直卡这里就不运行了,网上说要修改等待时间什么的,没用,您看看这是什 ...

脚本:

test_case1_njzx_login.py文件中:
## 实现守护宝app登录
#  包名和activity名:com.njzx.care/com.njzx.care.activity.MainActivity
# !/usr/bin/python
# encoding:utf-8
import time
import unittest
from appium import  webdriver

class test_login(unittest.TestCase):
    #  1、环境准备与还原:文件配置
    def setUp(self):
        desired_caps = {}
        desired_caps['platformName'] = 'Android'
        desired_caps['platformVersion'] = '7.0'
        desired_caps['deviceName'] = '0123456789ABCDEF:5037'
        # desired_caps['browserName'] = ''
        #  desired_caps['chromeOptions'] = {'androidProcess': 'com.tencent.mm:tools'}  # 驱动html5,必备
        desired_caps['appPackage'] = 'com.njzx.care'
        desired_caps['appActivity'] = 'com.njzx.care.activity.MainActivity'
        # desired_caps["unicodeKeyboard", "True"]  # 支持中文输入
        # desired_caps["resetKeyboard", "True"]  # 支持中文输入,必须两条都配置
        # desired_caps['automationName'] = 'Selendroid'#  link_text定位方式是Selendroid框架中的定位方式,因此appium若想采用,则需在代码加入
        desired_caps['newCommandTimeout'] = '100'  # 超时时间
        self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

    def tearDown(self):
        self.driver.quit()

    #  2、登录业务流程:
    #     (1)启动app
    #     (2)点击text = "您好,请登录"或者id  = "com.njzx.care:id/tv_helloname"进入登录界面
    #     (3)输入手机号码id = "com.njzx.care:id/et_username"和密码id = "com.njzx.care:id/et_password"
    #     (4)如果手机已经注册,可以直接登录;如果不存在,需要注册text= "快速注册"
    #     (5)点击登录id = "com.njzx.care:id/iv_login"
    def test_sendAndLogin(self):
        time.sleep(2)#  动态加载等待对象的时间,可以添加个WebDriverWait
        startLogin_text = self.find_element_by_text("您好,请登录")
        startLogin_text_id = self.find_element_by_id("com.njzx.care:id/tv_helloname")
        startLogin_text.click()
        time.sleep(2)
        text_num1 = input("请输入注册号码:")
        text_psd2 = input("请输入密码:")

        #  打开本地的用户名+ 密码存储文件
        user_info_file = open('user_info.txt', 'r')  # 用户名和密码存储文件
        user_info_list = user_info_file.readlines()  # 正确的用户名和密码存储队列
        correct_username = user_info_list[0].strip()  # 正确的用户名
        correct_password = user_info_list[1]  # 正确的密码
        user_info_file.close()

        if text_num1 == correct_username and text_psd2 == correct_password:
            print('账号存在,可以登录')
            time.sleep(2)
            self.find_element_by_id("com.njzx.care:id/et_username").send_keys(text_num1)
            self.find_element_by_id("com.njzx.care:id/et_password").send_keys(text_psd2)
        else:
            print('账号不存在,请重新注册!')
            # register = self.find_element_by_text("快速注册")
            # time.sleep(2)
            # # 注册id = com.njzx.care:id/et_phone
            # register_text = self.find_element_by_id("com.njzx.care:id/et_phone")
            # register_text.send_keys(number)
            # time.sleep(2)
            # self.find_element_by_id("com.njzx.care:id/img_submit")
            # time.sleep(2)
            # code_text = self.find_element_by_id("com.njzx.care:id/et_code")
            # code_text.send_keys(input("请输入验证"))
            # self.find_element_by_id("com.njzx.care:id/img_submit")
            return False

        time.sleep(2)
        submit = self.find_element_by_id("com.njzx.care:id/iv_login")
        submit.click()
        time.sleep(2)
        #  提交登陆之后,判断是否登陆成功
        # 方法1:可以判断某一个元素是否存在:
        #     如:“你好,请登录”这个元素是否存在isDisplayed():
        # try:
        #     get_user_info_message = self.find_element_by_id("com.njzx.care:id/tv_helloname").isDisplayed()
        #     print("登陆成功!")
        # except Exception as e:
        #     print("登录失败!",format(e))
        #  或者使用断言assert:
        try:
            self.find_element_by_id("com.njzx.care:id/ll_userinfo").click()# 进入个人信息界面
            time.sleep(2)
            info_message = self.find_element_by_id("com.njzx.care:id/tv_title").text  #  获取到元素中的文本信息
            correct_message = "个人信息"
            assert info_message == correct_message
            print("登陆成功")
        except Exception as e:
            print("登录失败!",format(e))

        # 方法2:可以判断只有登录成功才能出现的界面,如果存在,就表明登陆成功


testsuit_njzx.py文件中:

# !/usr/bin/python
# encoding:utf-8

import unittest
import test_case1_njzx_login
from HTMLTestRunner import HTMLTestRunner

#  测试用例集合:
if __name__ == '__main__':
    suite = unittest.TestSuite()  # unittest模块中的TestSuite()创建一个对象接收testcase
    suite.addTests(unittest.TestLoader().loadTestsFromNames(['test_case1_njzx_login.test_login']))
    with open('D:/HTMLReport.html', 'wb') as f:#  模式wb
        runner = HTMLTestRunner(stream=f,
                                title=' Test Report',
                                description='generated by HTMLTestRunner----黄亮.',
                                verbosity=2
                                )
        runner.run(suite)
作者: 卡卡罗特    时间: 2018-11-28 15:49
悠悠小仙仙 发表于 2018-11-22 13:24
老师你好,我想问下一个项目中自动化测试是否能有效的展开,自动化测试框架是关键所在是在哪里?

你好,自动化能否有效的开展,概括的讲可以从“测试用例的覆盖范围”,以及“测试执行效率”这两方面来进行考量,当然还可以加上如“自动化缺陷发现量与总缺陷量的占比”等相关统计数据来综合评估。
讲的口语化些,就是上了自动化后,产品或项目的测试范围有哪些变化或增量?执行时长比原来缩短了多少?有哪些缺陷是通过自动化测试才发现的?或者说是手工测试较难或难以发现的缺陷。
举个实际案例:
有次在调试自动化接口测试时,发现有个api接口在发送请求时,json传参里有很多和实际需求不相关的参数,虽然功能上能正常使用,也就是在做黑盒功能测试时不会觉得有什么问题,但实际上是增加了应用的资源开销。尤其在用户量达到一定量级后,性能上造成的影响就会暴露。于是提交了给开发做了优化。算是在做性能测试前提前排了个雷。
作者: 卡卡罗特    时间: 2018-11-28 15:56
MilgGtery 发表于 2018-11-22 13:30
老师你好,目前在学习自动化测试框架。
Serenity、Robot Framework、RedwoodHQ、Sahi、Galen Framework、G ...

你好,对java比较熟悉的话可以尝试下Jenkins,该框架结合基于Junit的TestNG,以及Selenium都可以很好的配套使用,网上有不少相关的教程和帖子可以观摩学习。
作者: 卡卡罗特    时间: 2018-11-28 16:22
bling123 发表于 2018-11-28 09:48
脚本:

test_case1_njzx_login.py文件中:

看不清楚。
建议从报错信息源头去跟踪排查。
比如从你帖出来的信息,可以看到报错点出在:
error: Unhandled error: TypeError: undefined is not a function
作者: 卡卡罗特    时间: 2018-11-28 16:23
bling123 发表于 2018-11-28 09:48
脚本:

test_case1_njzx_login.py文件中:

看不清楚。
建议从报错信息源头去跟踪排查。
比如从你帖出来的信息,可以看到报错点出在:
error: Unhandled error: TypeError: undefined is not a function
作者: bravestarr    时间: 2019-1-14 17:23
卡卡罗特 发表于 2018-11-7 17:31
条件允许的话,如果希望测试数据尽可能接近生产环境(这点我也比较赞同),可以考虑把生产库的数据全部或 ...

独立的自动化测试环境,在执行上还是很有必要的。认同这句话,问题是很多公司都不提供独立的自动化测试环境,经常见到的是,开发团队使用的测试环境A,手工测试和自动化测试共用测试环境B。
作者: bravestarr    时间: 2019-1-14 17:30
卡卡罗特 发表于 2018-11-7 17:16
因为以上这些问题还是比较发散式的,点题的目的主要也是为了引发大家的思考。
如果全部具体讲解的话,可 ...

测试数据准备通常放在自动化测试执行起始处。放在结束处还请举例。
作者: 18829068893    时间: 2020-6-24 16:36
bling123 发表于 2018-11-7 15:44
你好,我这里有一个关于app元素定位的问题:
定位到一个元素,如QQ中的“写说说”这个按钮(是一个半屏幕 ...

d(className="android.widget.LinearLayout", instance=2).click()




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2