51Testing软件测试网

 
 

常用链接

  • 我的随笔
  • 我的评论
  • 我参与的随笔

留言簿(3)

  • 给我留言
  • 查看公开留言
  • 查看私人留言

随笔档案

  • 2021年6月 (1)
  • 2021年3月 (1)
  • 2020年9月 (1)
  • 2020年3月 (1)
  • 2020年1月 (2)
  • 2019年12月 (3)
  • 2019年11月 (5)
  • 2019年10月 (1)
  • 2019年9月 (2)
  • 2019年8月 (14)
  • 2019年7月 (20)
  • 2019年6月 (15)
  • 2019年5月 (12)
  • 2019年4月 (19)
  • 2019年3月 (20)
  • 2019年2月 (9)
  • 2019年1月 (16)
  • 2018年12月 (17)
  • 2018年11月 (21)
  • 2018年10月 (16)
  • 2018年9月 (20)
  • 2018年8月 (22)
  • 2018年7月 (3)
  • 2018年6月 (1)
  • 2018年5月 (7)
  • 2018年4月 (1)
  • 2018年3月 (3)
  • 2018年2月 (6)
  • 2018年1月 (2)
  • 2017年9月 (8)
  • 2017年8月 (28)
  • 2017年7月 (3)
  • 2016年11月 (1)
  • 2016年6月 (1)
  • 2016年4月 (1)
  • 2016年2月 (2)
  • 2015年7月 (1)
  • 2015年5月 (1)
  • 2015年4月 (2)
  • 2015年3月 (1)
  • 2015年2月 (2)
  • 2015年1月 (6)
  • 2014年12月 (3)
  • 2014年11月 (3)
  • 2014年10月 (3)
  • 2014年9月 (2)
  • 2014年8月 (8)
  • 2014年7月 (16)
  • 2013年12月 (5)
  • 2013年11月 (1)
  • 2013年10月 (3)
  • 2013年9月 (2)
  • 2013年8月 (2)
  • 2013年7月 (3)
  • 2013年5月 (1)
  • 2013年4月 (2)
  • 2013年3月 (2)
  • 2013年2月 (3)
  • 2013年1月 (4)
  • 2012年12月 (4)
  • 2012年11月 (4)
  • 2012年10月 (3)
  • 2012年9月 (4)
  • 2012年8月 (3)
  • 2012年7月 (4)
  • 2012年6月 (2)
  • 2012年5月 (2)
  • 2012年4月 (1)
  • 2012年3月 (2)
  • 2012年2月 (2)
  • 2012年1月 (1)
  • 2011年12月 (3)
  • 2011年11月 (2)
  • 2011年10月 (1)
  • 2011年9月 (4)
  • 2011年8月 (3)
  • 2011年7月 (2)
  • 2011年6月 (4)
  • 2011年5月 (4)
  • 2011年4月 (2)
  • 2011年3月 (4)
  • 2011年2月 (4)
  • 2011年1月 (7)
  • 2010年12月 (7)
  • 2010年11月 (5)
  • 2010年10月 (4)
  • 2010年9月 (7)
  • 2010年8月 (7)
  • 2010年7月 (3)
  • 2010年6月 (3)
  • 2010年5月 (4)
  • 2010年4月 (4)
  • 2010年3月 (5)
  • 2010年2月 (3)
  • 2010年1月 (4)
  • 2009年12月 (3)
  • 2009年11月 (3)
  • 2009年10月 (1)
  • 2009年9月 (3)
  • 2009年8月 (2)
  • 2009年7月 (3)
  • 2009年6月 (1)
  • 2009年5月 (2)
  • 2009年4月 (4)
  • 2009年3月 (5)
  • 2009年1月 (1)
  • 2008年11月 (2)
  • 2008年7月 (5)
  • 2008年6月 (4)

文章分类

  • 行业资讯(45) (rss)
  • 软件业务知识(43) (rss)
  • 软件开发知识(33) (rss)
  • 软件测试工具(39) (rss)
  • 软件测试技术(157) (rss)
  • 软件测试管理(40) (rss)
  • 软件测试职业发展(57) (rss)

51testing软件测试网

搜索

  •  

最新评论

  • 1. re: 淘宝后台技术大揭秘,不看这篇你双十一要损失几个亿!
  • 关注官方公众号“Atstudy网校”,点击中间菜单栏“双11”,领取双十一技术内幕资料。
  • --51testing
  • 2. re: 软件测试流程的一点感悟
  • 提交缺陷时只需要描述现象即可,过多的分析可能会误导开发
  • --凡客诚品
  • 3. re: 软件测试流程的一点感悟
  • 阿达宿建德江阿斯顿
  • --凡客礼品卡
  • 4. re: 手机软件测试的经验总结
  • 很好啊~不错
  • --乐蜂网
  • 5. re: 手机软件测试的经验总结
  • 很好啊~
  • --罗莱家纺

阅读排行榜

  • 1. 软件测试流程的一点感悟(1091)
  • 2. 5年经验之谈:月薪3000到30000,测试工程师的变“行”记!(940)
  • 3. 测试自动化及软件测试工具的比较(857)
  • 4. 银行线上信贷系统如何做好接口测试?手把手教你接口工具Postman(825)
  • 5. 软件为什么要做异常测试?测试员必知的22个测试点总结!(806)

评论排行榜

  • 1. 软件测试流程的一点感悟(4)
  • 2. 软件测试的原则和经验 (4)
  • 3. 嵌入式软件测试技巧(2)
  • 4. 手机软件测试的经验总结 (2)
  • 5. 常用软件测试工具的分析与比较(1)

Powered by: 博客园
模板提供:沪江博客
IT博客 | 首页 | 发新随笔 | 发新文章 | 联系 | 聚合 | 管理

初学者为什么要学Python?python的30个操作难点总结!

人生苦短,我用 Python,不知道从什么时候开始,这句话开始流行。

多年来,Python 在各种流行编程语言中一直排名靠前。它几乎可以适用任何开发,它旨在提高程序员的开发效率而不在于他们编的代码。


Python 适用于网站、桌面应用开发,自动化脚本,复杂计算系统,科学计算,生命支持管理系统,物联网,游戏,机器人,自然语言处理等很多方面。


而且,即使对于那些从没有开发经验的人来讲,Python的代码也是简洁易懂的。

由于Python程序代码简单,所以与其他程序语言相比,后期的程序维护更容易,更舒心。从商业角度来看,需要的成本降低,程序员的效率提高。

这几天看了互联网上的大部分关于Python的资料,很多都只是最最基础的,还有很多难题,比如数据分析时数据庞大到一定程度这个不是一个人能解决的,还有人工智能,语意分析等等。

Python操作难点汇总(个人实践经验分享)

在我学习Python的这段时间我总结了自己的29个问题,具体如下:

1、在cmd下 盘与盘之间的切换 直接 D或d: 就好

2、查找当前盘或者文件下面的目录 直接 dir

3、想在一个盘下进去一个文件夹,用cd空格目标文件 cd p

4、写文件的第一个字母后 按tab键自动补全 如果有多个p开头的则在按tab 会在所有之间切换

5、d:切盘 dir 查找目录 cd 进去目标文件(相当于双击)

6、往上走一层 cd .. 走两层 cd ../..(之间有无空格都行)

7、用python打开一个预先用记事本打好的txt 则先打开python f:\Demo\hello.txt 这串代码即可

8、是什么样的文件就要用什么类型的后缀

9、每次运行都要找到python的路径比较麻烦,将python加入到环境变量中则可以直接调用程序,我的电 脑--属性--高级系统设置--高级--环境变量--找到path--将python的路径加进去即可

10、将任一个程序加入环境变量 单击程序图标右键--属性--复制‘目标'--将目标加入path(;分号一定 在英文状态下,然后复制,不用全复制,将.exe一串剪切下来),打开cmd,输入粘贴,即可打开程序。

11、变量的具体要有描述性,比如mike是一个name name=‘mike'让人一看就知道是一个名字,习惯

12、变量命名当有两个单词可以用下划线_分隔 student_number

13、用全部大写的变量名来代表常量。

14、用引号包起来的为字符串,他会在内存中占用一个位置,而变量名不占,它指向内存中的字符串

15、del删除变量 del age 即可 手动拆 强拆 或者指向其他内存

16、在py2x vision里 想要打印中文 则需要在前面加上u‘'表示把类型变成unicode 万国码

17、notepad++复制当前行 ctrl+D

18、在notepad++上改完一定要保存 在cmd中才能正确运行

19、在cmd中找文件路径 多用tab键去补全,在每一个盘下面都可以打pathon直接运行程序,后边也用tab

20、input('str') 则str: 此构成交互

21、cmd出错行数与notepad++相对应

22、在pad中有行操作,光标应在所在行的最后边(end)或者在此行上

23、判断相等则为== =为赋值

24、每一个句子后边要加上:表示一句完了

通过缩进来判断要执行接下来的哪些代码

25、tab !=(不等于) 4个空格

26、else不能单独出现 要与if 在同一级别 在中间不能有同一级别

27、最好每打一个tab自动成4个空格(原来tab与4个空格不一样,要空格都空个,要tab都tab,但官方 不建议tab),制表符为tab pad++ 设置 首选项 语言 制表符设置 转换为空格

28、视图 显示符号 显示空格与制表符

29、elif作为多种条件判断符 在if与else之间

总结:

现在的 Python 市场很像 2014 年的移动开发市场,那时候移动互联网也跟如今的人工智能一样,非常火爆。市场对于移动开发的需求非常的多,那时候你只要会在 Android 上写「hello world」,就可以找到工作。各大培训机构铺天盖地的宣传移动开发。

但随着移动市场这些年的发展,现在对于基础移动开发人员已经趋近饱和。如果你现在是一个刚入编程行业的人员,又刚好选择了移动开发的方向,那对不起,你很有可能找不到工作。

有时候你非常的努力但选错了方向,你的事业发展速度就会非常的缓慢。而有些人选对了方向,稍微做些事情,事业迅速发展。如今会Python ,你就已经比大部分人领先。

欢迎加入  51软件测试大家庭,在这里你将获得【最新行业资讯】,【免费测试工具安装包】,【软件测试技术干货】,【面试求职技巧】... 51与你共同学习,一起成长!期待你的加入: QQ                     群:                    755431660

posted @ 2019-01-03 17:29 51testing 阅读(138) | 评论 (0) | 编辑 收藏
 
测试大佬私藏的性能测试岗位常见面试题,拿走拿走别客气!

我从事软件测试及质量保障领域至今,已经有十几个年头了,从白盒自动化测试到黑盒自动化测试,从功能测试到性能测试、安全测试,从测试流程、测试框架到后来的测试管理、质量体系建设,深爱着这个行业,经常为能和小伙伴们攻克了一个技术小山头而激动兴奋, 也为了加班加点使命必达的完成了一个艰巨任务而感到欣慰。


我负责测试技术管理、团队管理也已经有8年多了,期间面试过的人少说也有一两千了。下面我就从面试中常见的问题来聊一聊性能测试的基本功:

一、基础篇

1、较为完整的性能测试的流程


2、性能测试的基础理论、常见术语

3、性能测试模型、类型

4、HTTP、TCP协议相关知识

5、连接池、线程相关知识

二、工具篇

1、Jmeter

①、Jmeter的工作原理是什么?

②、常用的元件、插件有哪些?各自的作用是什么?

③、几个典型的场景,如何基于jmeter设计测试脚本?

比如:参数化、关联、控制TPS、接口加密验签、阶梯式加压、集合点、检查点等;

④、是否会二次开发?如果会,怎么二次开发的(介绍大概过程和原因)?

2、Loadrunner

3、其他开源/商业性能测试工具

比如:Ngrinder、Locust、Wrk、Artillery等;

4、前端、服务器、数据库性能监测工具

三、系统架构篇

1、服务集群

2、负载均衡

负载均衡原理、实现方式

3、容量规划

4、缓存应用

缓存原理、缓存优点、缓存命中、缓存穿透、多层缓存

5、分布式框架

分布式的特点、面临的挑战:CAP理论(数据一致性、服务可用性、分区容错性)

6、全链路压测

关于全链路压测

四、服务器&中间件篇

1、JVM

JVM原理、启动参数配置、堆栈原理、垃圾回收原理、OOM原因和表现

2、Tomcat

配置、使用方法、启动参数配置

3、Nginx

配置、使用方法

4、Dubbo

服务注册、消息队列

5、RabbitMQ/Kafka

本身的特点、生产者、消费者如何管理

五、数据库篇

1、锁

2、索引

3、读写分离

4、分库分表

六、方案篇

1、设计性能测试方案需要考虑哪些问题?

时间成本、人力成本、环境&脚本可复用性、实现难度

2、针对某些情况,你会如何设计、优化方案?

七、案例篇

1、如何测试MQ?

2、压测中TPS上不去的原因分析?

3、测试环境和生产环境服务器配比如何选择?

服务器配置版本保持一致,容量测试后等量代换、考虑边际递减效应、容灾方案

4、发现瓶颈,如何分析?

自上而下,从局部到整体,瓶颈分析粒度

5、如何准备测试数据?如何防止数据污染?

生产数据备份、数据隔离、测试数据落入影子库、挡板、mock

6、性能优化的常见方法

关于性能优化之空间时间可靠性思考

八、常见4类问题汇总

问题一、接口测试要在什么环境下测试?

测试设备允许的情况下,尽量把测试的应用部署到测试服务器上面。并且按照生产环境的部署方式来搭建测试环境。

如果在生产环境通过接口交互的应用在不同服务器,测试环境也要把应用在不同服务器。生产环境使用了vpn,测试环境的服务器最好也是在vpn环境下。

问题二、压力测试工具能否安装在被测的WEB服务器上进行本地的压力测试?

一般要求是发压和被压机器分离,便于分析压测结果,最好压测和被压的机器放置在同一机房,降低网络及带宽带来的数据波动和因此导致的瓶颈。

这里无论发压和被压,都是会占用资源。当出现系统瓶颈时,如果两个在同一个机器,对你的分析会造成很大的影响。

如果你的上层请求是同内网下的同idc的调用方法,那么你可以选择同idc的机器进行发压参考。

当然,如果你的预期QPS很低,完全不会达到机器瓶颈,只是验证一些内存泄漏等简单并发问题,混布也未尝不可。

问题三、云平台的性能测试

云平台的性能测试和一般的性能测试也是差不多的,云平台的性能并发容量比较大,用户数多一点。

1.首先分析性能测试点如:发生频率非常高的,关键程度非常高的资源占用非常严重的等;

2.性能指标如:首页打开速度,支持最大在线用户,系统支持的并发用户数等;

3.工具的选择:JMeter,Loadrunner等。

问题四、如何设置才能保持用户始终在线;

1.录不同的场景在多个script里然后controllor里同时并发应该就行了。

2.登录后什么都不做,肯定要超时掉线的。那些保持在线的脚本,应该在action里面定时发送一些能够让服务器认为你仍然在线的请求,比如心跳请求,否则会掉线的。

另一种做法是你就保持思考时间不变,什么都不要发,但是让开发人员修改服务器端的超时时间,变得非常长,也可以达到不掉线的目的。

总结:

相信这些常见面试问题,在实际中很多人都会遇到。作为软件测试工程师,对面试问题的严谨,注意提升自己良好的沟通和表达能力,在面试过程中体现出扎实的软件测试基础知识,足够的耐心、细心、信心、责任心,善于自我总结、自我督促和不断学习的能力,相信大家都能在面试中有出色的表现,找到心仪的工作。

欢迎加入  51软件测试大家庭,在这里你将获得【最新行业资讯】,【免费测试工具安装包】,【软件测试技术干货】,【面试求职技巧】... 51与你共同学习,一起成长!期待你的加入: QQ                     群:                    755431660

posted @ 2019-01-02 17:34 51testing 阅读(154) | 评论 (0) | 编辑 收藏
 
预测|2019软件测试职业发展趋势,附BAT、TMD入职指南!

2018年即将过去,又要迎来新的一年。马上就要迎来金三银四跳槽季,现在开始各行业人才又萌生了一颗蠢蠢欲动的跳槽心。互联网行业日益兴盛,无疑成了跳槽的首选,吸引了越来越多的牛人加入其中,今天我们通过数据,帮助大家对各大互联网公司有一个比较概括的了解。


我们最终选取了50家互联网公司作为样本进行对比,选取来源主要是结合2018年互联网公司百强榜单和看准网上的实际评价数量,选取的公司logo拼图如下:


首先对比各项评价指标的TOP15:





可以看到,榜单中BAT在各项排名中都处于十分靠前的位置,网易也占据了多个榜单的靠前位置,腾讯霸占了所有排名的TOP1。

下面我们再来看一下面试难度,我们选取了面试难度评分的TOP15和BOTTOM15,该数据仅供参考,根据笔者的经验,同一个公司的不同部门不同岗位之间的难度差异也非常大。



在面试难度偏低的一些公司中,有许多非常不错的公司,该数据仅仅是一个参考,真正的面试还是要取决于求职者的实际能力,所谓会者不难,难者不会。真正的大牛无论是面对多么困难的面试,依然可以slay全场。

IT行业发展趋势

无论你毕业于什么专业,你同学朋友里肯定会有一个是想进入互联网大厂的!毕竟现在互联网发展迅猛,这个行业潜力无限好,风光又多金,有趣又新潮。

纵观BAT、TMD2019年小赵技术类岗位要求,其中,软件开发、技术运营、安全技术、技术研究要求应聘者必须掌握C/C++/JAVA等各种语言或者各种脚本语言,软件测试岗位对软件测试理论和方法,还有逻辑思维能力这些主观方面要求比较详细,且只是要求应聘者掌握一门编程语言,至于掌握哪门也没有具体要求。

由此可见,虽然软件测试也属于技术类,但是入行软件测试的门槛还是相对较低的,而薪资可一点都不低哦,不信的小伙伴可以去查询一下历年软件测试的平均薪资。




软件测试工程师个人发展

基本上测试的发展可以分为3类:

1、技术类

顾名思义就是专注于测试技术的方向,而测试将不仅仅停留在黑盒测试。更多的还要参与白盒测试和灰盒测试,因此必须有一定的计算机知识储备作为基础。由于门槛有比较高收入也会相对较高,也是未来测试发展方向之一。而纯做功能测试的人大多数将被渐渐淘汰,留下的都是些业务小能手。

技术类测试主要有以下3种测试职位:

一、自动化测试工程师

二、性能测试工程师

三、测试开发工程师

想往这方面发展的话需要掌握至少一门编程语言,也许有人会问自动化和性能测试工具那么多,会用工具不就可以了吗?的确工具可以做到入门级别的自动化和性能测试,但如果想做到更深层次的话还是需要手动改脚本代码,毕竟工具仅仅提供了基础的方法而已。当然通过工具入门也是非常有必要的,但最终还是需要通过编写脚本来完成相关测试的。

2、产品类

虽然说了技术类方向的好处,担也不是所有人都适合往这个方向发展,那么就可以转型向产品类发展。这其实也是一个不错的选择,毕竟做测试没有技术的话从长远来看终将被取代,不如早点实现转型,而且产品类职位也是需求量非常大的。

产品类主要有以下2种职位:

一、数据分析师

二、产品经理

想往这方面发展的话只需要利用好测试经验,在设计产品或者数据分析之中考虑到用户可能产生行为(就是测试思维),从而设计出更好的产品。这点相比于没有测试经验的人来说会有很大的优势,而且也更容易和开发打交道。因此产品类的转型是非常适合不想往技术类发展的测试人员的。

3、管理类

管理类也是一个很好的发展方向,但相对来说比前面2种都要难,需要具备很强的测试技术思想及大局观,而且考虑的事情非常多。所以很多人说做技术累但对应的是身累,做管理后对应的就是心累了。精神上的痛苦远远要超过身体上的痛苦。大多数管理类职位要求也很高,竞争压力也大,但收入绝对是比前2者要高的多。

管理类主要有以下2种职位:

一、测试主管

二、项目经理

想往这方面发展的话需要很强的综合能力,合理制定项目流程,人员的分配管理,质量的全局把控,团队沟通协作等等,这些远比学一门编程语言来的复杂。因此其实是要经过长时间的积累,培养自身的综合能力,当然这种机会有时候需要机遇和伯乐,不可强求。

总结:

1. 纯功能测试,越来越不好混了(必须得懂点服务器知识、网络知识、数据库知识、Linux知识、脚本知识了)。

2. 接口自动化测试,会明显的爆发(想快速迭代上线,必须有接口自动化作为保障)。

3. UI自动化测试,比重会逐步降低(会有更多专项自动化,或者云平台来支撑,以及第三方测试服务支撑)。

4. 性能测试,还是一样,人才稀缺(做好性能,并不是你理解的会几个性能测试工具,也许你根本没入门)。

5. 企业招人,综合技能要求会越来越高,那些混日子的同学,会越来越不好找工作 (从业者越来越多,本身的技术团队,对测试能力的要求越来越高,既而混日子会逐步把自己的工作混没的)。

6. 云测平台,会越来越专业化、越来越细分(已经是事实了)。

7. 云技术,是测试从业者必备知识(别说你不知道是什么,还完全没接触过)。

8.持续集成体系,会有越多越多的团队重视,会成为测试从业者必备知识,前期会是从业者的技能亮点(也算是必备技能了)。

9.对测试从业者的快速学习能力会越来越高。

欢迎加入  51软件测试大家庭,在这里你将获得【最新行业资讯】,【免费测试工具安装包】,【软件测试技术干货】,【面试求职技巧】... 51与你共同学习,一起成长!期待你的加入: QQ                     群:                    755431660

posted @ 2018-12-26 17:41 51testing 阅读(90) | 评论 (0) | 编辑 收藏
 
别人Python都玩腻了,而你却连安装工具库都搞不清楚!

熟练掌握计算机语言是从事软件测试的基础。尽管C、Java、Perl、R和Python等都有自己的优势,且在不同的测试项目中得到广泛使用。但是,对于测试初学者而言,快速掌握Java或Python是比较快的编程进阶之路。相对而言,Python更易上手,代码的可读性也更强。因此,现在越来越多的工具、库是基于Python编写的。


那么Python究竟能做什么?

1、Web应用开发

Python经常被用于Web开发。比如,通过mod_wsgi模块,Apache可以运行用Python编写的Web程序。Python定义了WSGI标准应用接口来协调Http服务器与基于Python的Web程序之间的通信。

一些Web框架,如Django,TurboGears,web2py,Zope等,可以让程序员轻松地开发和管理复杂的Web程序。

2、操作系统管理、服务器运维的自动化脚本

在很多操作系统里,Python是标准的系统组件。

大多数Linux发行版以及NetBSD、OpenBSD和Mac OS X都集成了Python,可以在终端下直接运行Python。

有一些Linux发行版的安装器使用Python语言编写,比如Ubuntu的Ubiquity安装器,Red Hat Linux和Fedora的Anaconda安装器。Gentoo Linux使用Python来编写它的Portage包管理系统。

Python标准库包含了多个调用操作系统功能的库。通过pywin32这个第三方软件包,Python能够访问Windows的COM服务及其它Windows API。使用IronPython,Python程序能够直接调用.Net Framework。一般说来,Python编写的系统管理脚本在可读性、性能、代码重用度、扩展性几方面都优于普通的shell脚本。

3、科学计算

NumPy,SciPy,Matplotlib可以让Python程序员编写科学计算程序。

4、桌面软件

PyQt、PySide、wxPython、PyGTK是Python快速开发桌面应用程序的利器。

5、服务器软件(网络软件)

Python对于各种网络协议的支持很完善,因此经常被用于编写服务器软件、网络爬虫。第三方库Twisted支持异步网络编程和多数标准的网络协议(包含客户端和服务器),并且提供了多种工具,被广泛用于编写高性能的服务器软件。

6、游戏

很多游戏使用C++编写图形显示等高性能模块,而使用Python或者Lua编写游戏的逻辑、服务器。相较于Python,Lua的功能更简单、体积更小;而Python则支持更多的特性和数据类型。

7、构思实现,产品早期原型和迭代

YouTube、Google、Yahoo!、NASA都在内部大量地使用Python。

Python安装其他包、工具、库的方法

安装完Python之后,在写Python程序时经常需要调用一些Python库,例如下面的代码中调用了多种库,这些python的库都需要自己安装。

下面就总结了几种常用的给python安装运行库的方法

(1)是用pip install 方法在线安装(通常安装了Python时会自动安装pip 工具)

1.打开cmd窗口

2.进入Python安装目录下的Scripts文件夹

3. pip install "库名称"

下面的命令是在cmd窗口中使用pip install语句在线安装numpy库的例子:(其中C:\Users\john\AppData\Local\Programs\Python\Python35是我的Python安装位置,需要改成你们自己的)


(2)下载whl文件,自己离线安装

1.在网上下载Python相关库的安装whl文件,复制到python安装目录下的Scripts文件夹。

2.在cmd窗口中执行下面语句进行安装:

pip3.5 install C:\Users\john\AppData\Local\Programs\Python\Python35\Scripts\pip-9.0.1-py2.py3-none-any.whl

语句说明:因为我安装的python版本是python3.5所以这里使用的是pip3.5,Python3.6使用的是python3.6,另外也可以直接在python安装目录下的Scripts文件夹下看使用什么;


”C:\Users\john\AppData\Local\Programs\Python\Python35\Scripts\pip-9.0.1-py2.py3-none-any.whl“是我离线安装包的路径和名称;

注意:要确保上面的Scripts文件夹路径在系统变量 path中,如果没有需要手动添加(一般安装完python后会自动添加这个环境变量)

3.注意下载whl文件时要选择适合自己电脑版本的whl文件。

如何查看本机Python支持的安装包版本,在cmd窗口执行以下语句:


运行后会打印出本机python支持的安装包版本,根据这个下载适合自己版本的whl安装文件:


(3)安装了mingw和git之后,用git下载Python库的源码,编译源文件,install python 库。

说明:因为一些运行库不是专门的python库,只是提供了一个python接口供Python调用,所以普通的pip install方法无法成功安装。例如XGBoost。

(4)如果安装了 PyCharm这个python的IDE,可以在他的菜单界面中在线安装或者卸载一些Python的运行库。

1.打开PyCharm,在菜单栏中选择 File->Default Settings ,其中的Project Interpreter:


这个界面会列出当前已经安装的python运行库,选中其中一个可以升级或删除。

2.在上面的界面中选择 加号 图标,会出现在线安装运行库的界面,可以在线搜索运行库并安装:


总结:

9:00

你打开电脑,双击各部门交上来的周报,轻车熟路地开始了crtlC,ctrlV工作,把表格统计在一起。

15:00

你发现投资部的表格里多了一个字段,导致你表格结构全错了,你很恼火……

16:30

重新整理好后,你舒了一口气,和往常一样你点开了数据透视表……然后屏幕灰了……

16:34

屏幕仍然灰着,你的心也灰了一些,意识开始发呆:每次数据都重复洗一遍,还这么慢,要是有一劳永逸的方法就好了。

一劳永逸的方法当然有。

那就深度挖掘Python吧,你总会有意想不到的收获!


posted @ 2018-12-25 17:29 51testing 阅读(85) | 评论 (0) | 编辑 收藏
 
最全的HTTP响应状态码列表:除了404,HTTP状态码还有啥?

HTTP是一个应用层协议,虽然在2015年已推出HTTP/2版本,并被主要的web浏览器和web服务器支持。

它的主要特点可概括如下:

支持客户/服务器模式。

简单快速:客户向服务器请求服务时,只需传送请求方法和路径。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。

灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。

无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。为了解决这个问题, Web程序引入了Cookie机制来维护状态。

另外,HTTP请求报文和响应报文都是由开始行(对于请求消息,开始行就是请求行,对于响应消息,开始行就是状态行),消息报头(可选),空行(只有CRLF的行),消息正文(可选)组成。


那么作为软件测试员,了解一些服务器返回的HTTP状态的意思是必不可少的,只有弄清楚这些状态码,工作中才会得心应手,下面我们就来全面的了解下HTTP状态码:

响应状态码

状态代码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。

1xx:指示信息--表示请求已接收,继续处理。

2xx:成功--表示请求已被成功接收、理解、接受。

3xx:重定向--要完成请求必须进行更进一步的操作。

4xx:客户端错误--请求有语法错误或请求无法实现。

5xx:服务器端错误--服务器未能实现合法的请求。

常用状态码:

1xx - 信息提示

这些状态代码表示临时的响应。客户端在收到常规响应之前,应准备接收一个或多个1xx 响应。

· 100 - Continue 初始的请求已经接受,客户应当继续发送请求的其余部分。 

· 101 - Switching Protocols 服务器将遵从客户的请求转换到另外一种协议。

2xx - 成功

这类状态代码表明服务器成功地接受了客户端请求。

· 200 - OK 一切正常,对GET和POST请求的应答文档跟在后面。 

· 201 - Created 服务器已经创建了文档,Location头给出了它的URL。 

· 202 - Accepted 已经接受请求,但处理尚未完成。 

· 203 - Non-Authoritative Information 文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝,非权威性信息。

· 204 - No Content 没有新文档,浏览器应该继续显示原来的文档。如果用户定期地刷新页面,而Servlet可以确定用户文档足够新,这个状态代码是很有用的。 

· 205 - Reset Content 没有新的内容,但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容。 

· 206 - Partial Content 客户发送了一个带有Range头的GET请求(分块请求),服务器完成了它。

3xx - 重定向

客户端浏览器必须采取更多操作来实现请求。例如,浏览器可能不得不请求服务器上的不同的页面,或通过代理服务器重复该请求。

· 300 - Multiple Choices 客户请求的文档可以在多个位置找到,这些位置已经在返回的文档内列出。如果服务器要提出优先选择,则应该在Location应答头指明。 

· 301 - Moved Permanently 客户请求的文档在其他地方,新的URL在Location头中给出,浏览器应该自动地访问新的URL。 

· 302 - Found 类似于301,但新的URL应该被视为临时性的替代,而不是永久性的。注意,在HTTP1.0中对应的状态信是“Moved Temporatily”。出现该状态代码时,浏览器能够自动访问新的URL,因此它是一个很有用的状态代码。注意这个状态代码有时候可以和301替换使 用。有的服务器返回301,有的则返回302。严格地说,我们只能假定只有当原来的请求是GET时浏览器才会自动重定向。请参见307。

· 303 - See Other 类似于301/302,不同之处在于,如果原来的请求是POST,Location头指定的重定向目标文档应该通过GET提取。 

· 304 - Not Modified 客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。

· 305 - Use Proxy 客户请求的文档应该通过Location头所指明的代理服务器提取(HTTP 1.1新)。 

· 307 - Temporary Redirect 和302(Found)相同。许多浏览器会错误地响应302应答进行重定向,即使原来的请求是POST,即使它实际上只能在POST请求的应答是303时 才能重定向。由于这个原因,HTTP 1.1新增了307,以便更加清除地区分几个状态代码:当出现303应答时,浏览器可以跟随重定向的GET和POST请求;如果是307应答,则浏览器只能跟随对GET请求的重定向。

4xx - 客户端错误

这些状态代码表示,请求可能出错,已妨碍了服务器对请求的处理。

· 400 - Bad Request (错误请求) 服务器不理解请求的语法。 

· 401 - Unauthorized (未授权) 请求要求进行身份验证。登录后,服务器可能会返回对页面的此响应。应答中会包含一个WWW-Authenticate头,浏览器据此显示用户名字/密码对话框,然后在填写合适的Authorization头后再次发出请求。IIS 定义了许多不同的 401 错误,它们指明更为具体的错误原因。这些具体的错误代码在浏览器中显示,但不在 IIS 日志中显示:

· 401.1 - 登录失败。

· 401.2 - 服务器配置导致登录失败。

· 401.3 - 由于 ACL 对资源的限制而未获得授权。

· 401.4 - 筛选器授权失败。

· 401.5 - ISAPI/CGI 应用程序授权失败。

· 401.7 – 访问被 Web 服务器上的 URL 授权策略拒绝。这个错误代码为 IIS 6.0 所专用。

· 403 - Forbidden(已禁止) 服务器拒绝请求。通常由于服务器上文件或目录的权限设置导致。禁止访问:IIS 定义了许多不同的 403 错误,它们指明更为具体的错误原因:

· 403.1 - 执行访问被禁止。

· 403.2 - 读访问被禁止。

· 403.3 - 写访问被禁止。

· 403.4 - 要求 SSL。

· 403.5 - 要求 SSL 128。

· 403.6 - IP 地址被拒绝。

· 403.7 - 要求客户端证书。

· 403.8 - 站点访问被拒绝。

· 403.9 - 用户数过多。

· 403.10 - 配置无效。

· 403.11 - 密码更改。

· 403.12 - 拒绝访问映射表。

· 403.13 - 客户端证书被吊销。

· 403.14 - 拒绝目录列表。

· 403.15 - 超出客户端访问许可。

· 403.16 - 客户端证书不受信任或无效。

· 403.17 - 客户端证书已过期或尚未生效。

· 403.18 - 在当前的应用程序池中不能执行所请求的 URL。这个错误代码为 IIS 6.0 所专用。

· 403.19 - 不能为这个应用程序池中的客户端执行 CGI。这个错误代码为 IIS 6.0 所专用。

· 403.20 - Passport登录失败。这个错误代码为 IIS 6.0 所专用。

· 404 - Not Found(未找到) 服务器找不到请求的网页。例如,如果请求是针对服务器上不存在的网页进行的,那么,服务器通常会返回此代码。 

· 404.0 -(无) – 没有找到文件或目录。

· 404.1 - 无法在所请求的端口上访问 Web 站点。

· 404.2 - Web 服务扩展锁定策略阻止本请求。

· 404.3 - MIME 映射策略阻止本请求。

· 405 - Method Not Allowed 请求方法(GET、POST、HEAD、DELETE、PUT、TRACE等)对指定的资源不适用,用来访问本页面的 HTTP 谓词不被允许(方法不被允许)

· 406 - Not Acceptable 指定的资源已经找到,但它的MIME类型和客户在Accpet头中所指定的不兼容,客户端浏览器不接受所请求页面的 MIME 类型。 

· 407 - Proxy Authentication Required (需要代理授权) 此状态代码与 401(未授权)类似,但却指定了请求者应当使用代理进行授权。如果服务器返回此响应,那么,服务器还会指明请求者应当使用的代理。

· 408 - Request Timeout 在服务器许可的等待时间内,客户一直没有发出任何请求。客户可以在以后重复同一请求。

· 409 - Conflict (冲突) 服务器在完成请求时发生冲突。服务器必须包含有关响应中所发生的冲突的信息。服务器在响应与前一个请求相冲突的 PUT 请求时可能会返回此代码,同时会提供两个请求的差异列表。

· 410 - Gone 所请求的文档已经不再可用,而且服务器不知道应该重定向到哪一个地址。它和404的不同在于,返回407表示文档永久地离开了指定的位置,而404表示由于未知的原因文档不可用。

· 411 - Length Required (需要有效长度) 服务器不会接受包含无效内容长度标头字段的请求,除非客户发送一个Content-Length头。

· 412 - Precondition Failed 请求头中指定的一些前提条件失败。

· 413 – Request Entity Too Large 目标文档的大小超过服务器当前愿意处理的大小。如果服务器认为自己能够稍后再处理该请求,则应该提供一个Retry-After头。

· 414 - Request URI Too Long URI太长。 

· 415 – 不支持的媒体类型。

· 416 – Requested Range Not Satisfiable 服务器不能满足客户在请求中指定的Range头。

·417 – 执行失败。

· 423 – 锁定的错误。

5xx - 服务器错误

这些状态代码表示,服务器在尝试处理请求时发生内部错误。这些错误可能是服务器本身的错误,而不是请求出错。

· 500 - Internal Server Error(服务器内部错误) 服务器遇到错误,无法完成请求。 

· 500.12 - 应用程序正忙于在 Web 服务器上重新启动。

· 500.13 - Web 服务器太忙。

· 500.15 - 不允许直接请求 Global.asa。

· 500.16 – UNC 授权凭据不正确。这个错误代码为 IIS 6.0 所专用。

· 500.18 – URL 授权存储不能打开。这个错误代码为 IIS 6.0 所专用。

· 500.100 - 内部 ASP 错误。

· 501 - Not Implemented(尚未实施) 服务器不具备完成请求的功能。例如,当服务器无法识别请求方法时,服务器可能会返回此代码。

· 502 - Bad Gateway(错误网关) 服务器作为网关或代理,从上游服务器收到了无效的响应。

· 502.1 - CGI 应用程序超时。

· 502.2 - CGI 应用程序出错。

· 503 - Service Unavailable (服务不可用) 目前无法使用服务器(由于超载或进行停机维护)。通常,这只是一种暂时的状态。

· 504 - Gateway Timeout (网关超时) 服务器作为网关或代理,未及时从上游服务器接收请求。

· 505 - HTTP Version Not Supported (HTTP 版本不受支持) 服务器不支持请求中所使用的 HTTP 协议版本。


posted @ 2018-12-24 18:11 51testing 阅读(131) | 评论 (0) | 编辑 收藏
 
这些appium常用元素定位技巧,你掌握了几种?

今天跟大家分享下Appium的元素定位的一些小技巧。

Appium对于处理原生的android应用直接通过uiautomatorviewer.bat这个工具来获取元素定位。


在开始appium元素定位的话题之前,首先让我们了解下appium的一些基础知识:

一、测试对象

appium 是一个自动化测试开源工具,支持iOS和 Android平台上的原生应用,web应用和混合应用。

移动原生应用:单纯用ios或者android开发语言编写的、针对具体某类移动设备、可直接被安装到设备里的应用,一般可通过应用商店获取;

移动web应用:使用移动浏览器访问的应用(appium支持iOS上的Safari和Android上的 Chrome),不需要下载到设备上,而是通过浏览器直接访问;

混合应用:同时使用网页语言与程序语言开发,通过应用商店区分移动操作系统分发,用户需要安装使用的移动应用。

二、支持平台及语言

appium是跨平台的,支持OSX,Windows以及Linux系统。它允许测试人员在不同的平台(iOS,Android)使用同一套API来写自动化测试脚本,这样大大增加了iOS和Android测试套件间代码的复用性 

appium支持多语言,采用C/S设计模式,只要满足client能够发送http请求给server即可

三、元素定位

1.格式:find_element_by_定位方式(value)

我根据手机自带的计算器来解释


通过id定位

通过工具获取到按钮的 resource-id

driver.find_element_by_id('resource-id')

实例: driver.find_element_by_id(' com.android.bbkcalculator:id/clear')

通过class定位

通过工具获取到按钮的class

driver.find_element_by_class_name('class')

实例: driver.find_element_by_class_name(' android.widget.ImageButton ')

通过text定位

appium1.5及之后的版本废弃了name属性(如name=百度一下,需要使用uiautomator的定位方式,使用text的内容)

driver.find_element_by_android_uiautomator("text(\中文\)")

实例:driver.find_element_by_android_uiautomator ("text(\"百度一下\")")

备注:需要确认这个中文是当前页面唯一值,否则还是定位不到,注意写法,不是直接把中文复制进去

通过xpath定位

driver.find_element_by_xpath("xpath内容 ")

实例:driver.find_element_by_xpath("//android.widget.FrameLayout/android.widget.ImageButton[4]")

以下方式暂时没有用到,如果有问题以后会更改

通过accessibility_id

在UI Automator Viewer界面上并没有找到这个字段,这个对应的字段是content-desc

driver.find_element_by_accessibility_id("accessibility_id")

没有找到实例,要是自己写自动化的APP碰到了,可以用用

通过css_selector定位(webview)

只适用于webview的html页面,继承自webdriver,与pc版本的UI测试一致

driver.find_element_by_css_selector()

通过link_text定位(webview)

只适用于webview容器中的html页面,继承自webdriver,与pc版本的UI测试一致

driver.find_element_by_link_text()

通过name定位

只适用于webview容器中的html页面,继承自webdriver,与pc版本的UI测试一致

driver.find_element_by_name()

2.定位元素的另一种写法:find_element(by,value)

find_element_by_方式(value)实际调用的都是find_element(by,value)

需要导入这个包:from selenium.webdriver.common.by import By

例如:定位id为ag2的元素

方式一:driver.find_element_by_id("ag2”)

方式二:driver.find_element(By.ID,"ag2")

这个操作的好处是可以直接把操作的by和value放到一个元组里,然后调用通用方法来传参获得元素结果。

cateid=(By.ID,"ag2")

driver.find_element(*cateid).click()

by的操作可以是:

By.ID 相当于by_id

By.CLASS_NAME 相当于by_class_name

By.XPATH 相当于by_xpath

By.NAME 相当于by_name

By.TAG_NAME 相当于by_tag_name

By.CSS_SELECTOR 相当于by_css_selector

By.LINK_TEXT 相当于by_link_text

3.find_elements_by_定位方式(value)返回元素数组

用法与find_element_by_方式(value)一致,但是返回一个数组。可以通过数组的索引来访问具体的某个结果。

例如:通过class_name定位到多个元素,我想点击第一个元素

driver.find_elements_by_class_name("android.widget.RelativeLayout”)[0].click()

4.返回元素数组的另一种写法:find_elements(by,value)

用法与find_element(by,value)一致,但是返回一个数组。可以通过数组的索引来访问具体的某个结果。

例如:通过class_name定位到多个元素,我想点击第一个元素

driver.find_elements(By.CLASS_NAME,"android.widget.RelativeLayout”)[0].click()

5.通过元素定位元素

可以先找到某个元素,然后再进一步定位元素

find_element_by_class_xpath(“xxx”).find_element_by_name(“yyy")

四、元素操作

找到元素后可以对元素进行的操作,例如上面讲的进一步定位元素

1.click()

//点击操作

也可以用tab实现点击操作

driver.find_element_by_id("com.wuba.zhuanzhuan:id/ae8").click()

2.clear()

//清空输入框内容

driver.find_element_by_id("com.wuba.zhuanzhuan:id/ij").clear()

3.send(xx)

//输入框内输入内容

driver.find_element_by_id("com.wuba.zhuanzhuan:id/ij").send_keys("test content")

4.text

//获得元素的text内容

print(driver.find_element_by_xpath(" //android.widget.LinearLayout[1]//xxx").text)

四、总结

1、Appium跨平台,支持Android和IOS自动化测试。 

2、Appium支持多语言,如java、Object-C、JavaScript、Php、Python、Ruby、C#、Clojure等等 

3、支持原生应用,web应用和混合应用 

4、仅仅支持UI测试

欢迎加入  51软件测试大家庭,在这里你将获得【最新行业资讯】,【免费测试工具安装包】,【软件测试技术干货】,【面试求职技巧】... 51与你共同学习,一起成长!期待你的加入: QQ                     群:                    755431660

posted @ 2018-12-21 17:31 51testing 阅读(143) | 评论 (0) | 编辑 收藏
 
3分钟了解Appium:使用appium做Android手机自动化测试!

网上写Appium相关资料的文章已经多如牛毛,今天我所提到的内容或许是你不太了解的,希望能在3分钟时间为各位看官带来不一样的收获~~

Appium这个听起来既生疏也熟悉的自动化测试工具,比起原生的UiAutomator可能是异常的不起眼,可是却是有自身独当一面的能力,可以完成许多高难度作业,完成UiAutomator不可能完成的一些任务,可以说appium丰富了UiAutomator的功能,使UiAutomator可以完成更多的任务。

Appium到底有哪些优势会让我们优先选择它去做自动化呢?


一、一句话概括Appium

一款应用于移动端的自动化测试框架,支持跨平台应用,Native、Hybird、Mobile Web都支持。其特点概括一下:

跨平台只要一套代码

不需要设置签名,不污染源代码

不需要项目源代码就可以测试

多语言支持

可支持多种通用框架

完全开源,社区活跃

二、初步认识appium工作过程

1.appium有C/S模式

2.appium是基于webdriver协议对移动设备自动化api扩展而成的,所有具有和webdriver一样的特性,比如多语言支持。

3.webdriver是基于http协议的,第一连接会建立一个session会话,并通过post发送一个json告知服务端相关测试信息。

4.对于Android来说,4.2以后是基于UiAutomator框架实现查找注入事件的,4.2以前则是instrumentation框架的,并封装成一个叫Selendroid提供服务。

5.客户端只需要发送http请求实现通讯,意味着客户端就是多语言支持的。

6.appium服务端是node.js写的,所以安装那个平台都是先安装node,然后npm install -g appium(需要FQ)。

三、环境搭建

步骤:

1.java开发环境JDK

2.android SDK(platform/platform tools/tools/build tools)

3.python下载安装(pip)

4.appium下载安装(服务端+客户端)

5.安装appium-python-client

6.安装unittest

第一步

安装JDK,安装完成后配置环境变量。


cmd下java -version检查环境变量是否配置成功。

第二步

安装Android SDK(安卓软件开发包),测试Android手机必然是要安装Android SDK。

下载地址:http://tools.android-studio.org/index.php/sdk/

解压后将文件夹添加到环境变量中,添加环境变量,必须创建一个名为ANDROID_HOME的变量。

双击SDK Manager,选装工具。必装:Tools文件夹下Android SDK Platform-tools和Android SDK Build-tools,Android SDK Tools可以选择是否更新,建议网速OK直接更新。GoogleFQ安装:Extras文件夹下所有的全部安装。




Path环境变量中添加ANDROID_HOME、tools、platform-tools、build-tools目录。保存修改。

环境变量配置完成后,连接安卓手机,并将Android手机的开发者选项-USB调试打开。

在CMD下执行,adb devices,出现下图样式则代表通过adb命令,获取到了连接在电脑上Android手机的UDID。

adb devices在获取连接的安卓手机时,一定会遇到很多坑,这里我们梳理下可能会遇到的坑。

1、手机USB调试一定要打开。

2、多找两根USB线,排除线的问题。

3、多换几个USB接口,排除USB个别接口不好使问题(如:3.0 与 2.0)

4、驱动程序,通过设备管理器查看是否安装驱动或驱动不是最新。

5、更新adb_usb.ini文件,少数电脑不能识别Android手机时,可以将设备管理器下的Android手机的VID、PID增加到adb_usb.ini文件中。

将VID、PID中“_”后的4位数增加到adb_usb.ini下(注:adb_usb.ini默认在C盘当前用户家目录下的.android目录下)

理论上这些操作都操作一遍后,基本adb devices就可以找到Android手机了。

第三步

安装node.js,之后就可以直接通过npm安装Appium。(注:npm类似于Python的pip,一个非官方包管理器)

官方下载地址:https://nodejs.org/en/download/

根据自己的操作系统下载不同版本的node.js

node.js的安装一路傻瓜式next就可以了,安装成功后会自动添加环境变量。

安装成功后,检测下npm是否可用。

第四步

安装appium服务端,可通过cmd 下输入 npm install -g appium 进行安装。

如果npm install -g appium特别慢,无法下载时,可以用国内的镜像npm --registryhttp://registry.cnpmjs.orginstall -g appium

安装如果失败可以尝试通过cnpm安装appium

通过npm命令安装cnpm

npm install -g cnpm --registry=https://registry.npm.taobao.org

通过cnpm安装appium

cnpm install -g appium --no-cache

安装成功后,通过appium -v 查看当前appium版本,直接输入appium则启动appium server端。

如果仍无法下载appium服务端,那就只能在Appium官方网站上下载操作系统相应的Appium版本。

https://bitbucket.org/appium/appium.app/downloads/

当前最新版本为 AppiumForWindows_1_4_16_1.zip ,注意这是一个 Windows 版本,如果你的电脑为MAC请下载 appium-1.5.3.dmg 。

再来提供一个百度网盘的下载链接:https://pan.baidu.com/s/1Y4pD3fjjeKJNv_6E7seQBQ

我们以 Windows 为例,将下载的 AppiumForWindows.zip 进行解压,点击 appium-installer.exe 进行安装。

双击启动,appium server 界面如下。

最后,打开Windows命令提示符,输入“appium-doctor”命令,如果出现以下提示,说明你Appium所需要的各项环境都已准备完成。

注:如果提示:“appium-doctor”不是内部或外部命令,找到Appium的安装目录,例如:

C:\Program Files\Appium\node_modules\.bin

添加到环境变量path下面。

第五步

安装appium客户端,用于抓取app上定位信息。


双击安装,安装成功后左面会有一个appium的快捷方式。

到这里Windows-Android-appium的所有环境就已经搭建完成了。

总结:

Appium目前是一种比较先进的测试工具,可以覆盖到UiAutomator所涉及的各个方面,还能完成webview的自动化测试,但是部署环境较复杂,而且出现很多的异常情况很难去定位到问题,同时网上资料也比较匮乏,导致其普及范围不是很广,希望这篇文章可以帮助需要用到appium工具的同学,快速越过搭建环境这一关,快速投入到混合型App的自动化测试当中。

欢迎加入  51软件测试大家庭,在这里你将获得【最新行业资讯】,【免费测试工具安装包】,【软件测试技术干货】,【面试求职技巧】... 51与你共同学习,一起成长!期待你的加入: QQ                     群:                    755431660

posted @ 2018-12-20 17:45 51testing 阅读(139) | 评论 (0) | 编辑 收藏
 
大牛们是如何写出那些高质量、高性能的SQL查询语句的?

想要写出高质量、高性能的SQL查询语句:

一、首先要搞明白什么叫执行计划?

执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句如果用来从一个 10万条记录的表中查1条记录,那查询优化器会选择“索引查找”方式,如果该表进行了归档,当前只剩下5000条记录了,那查询优化器就会改变方案,采用“全表扫描”方式。

可见,执行计划并不是固定的,它是“个性化的”。产生一个正确的“执行计划”有两点很重要:

(1)SQL语句是否清晰地告诉查询优化器它想干什么?

(2)查询优化器得到的数据库统计信息是否是最新的、正确的?


二、统一SQL语句的写法

对于以下两句SQL语句,程序员认为是相同的,数据库查询优化器认为是不同的。

select*from dual

select*From dual

其实就是大小写不同,查询分析器就认为是两句不同的SQL语句,必须进行两次解析。生成2个执行计划。所以作为程序员,应该保证相同的查询语句在任何地方都一致,多一个空格都不行!

三、SQL语句编写注意问题

下面就某些SQL语句编写注意问题做一下详细的介绍。在这些where子句中,即使某些列存在索引,但是由于编写了劣质的SQL,系统在运行该SQL语句时也不能使用该索引,而同样使用全表扫描,这就造成了响应速度的极大降低。

1.IS NULL 与 IS NOT NULL

不能用null作索引,任何包含null值的列都将不会被包含在索引中。即使索引有多列这样的情况下,只要这些列中有一列含有null,该列就会从索引中排除。也就是说如果某列存在空值,即使对该列建索引也不会提高性能。

任何在where子句中使用is null或is not null的语句优化器是不允许使用索引的。

2.避免使用不兼容的数据类型。

不兼容的数据类型代表着全表检索数据的类型转换,访问将变为全表扫描

select * from employee where last_name = 100;注last_name为varchar类型

3.联接列

对于有联接的列,即使最后的联接值为一个静态值,优化器是不会使用索引的。我们一起来看一个例子,假定有一个职工表(employee),对于 一个职工的姓和名分成两列存放(FIRST_NAME和LAST_NAME),现在要查询一个叫比尔.克林顿(Bill Cliton)的职工。

下面是一个采用联接查询的SQL语句,

select * from employss where first_name||''||last_name ='Beill Cliton';

上面这条语句完全可以查询出是否有Bill Cliton这个员工,但是这里需要注意,系统优化器对基于last_name创建的索引没有使用。

当采用下面这种SQL语句的编写,Oracle系统就可以采用基于last_name创建的索引。

*** where first_name ='Beill' and last_name ='Cliton';

4. 通配符(%)开头的like语句

目前的需求是这样的,要求在职工表中查询名字中包含cliton的人。可以采用如下的查询SQL语句:

select * from employee where last_name like '%cliton%'这里由于通配符(%)在搜寻词首出现,所以Oracle系统不使用last_name的索引。然而当通配符出现在字符串其他位置时,优化器就能利用索引。在下面的查询中索引得到了使用:

select * from employee where last_name like 'c%'

5.索引字段上进行运算会使索引失效。

尽量避免在WHERE子句中对字段进行函数或表达式操作,这将导致引擎放弃使用索引而进行全表扫描。

eg:SELECT * FROM T1 WHERE F1/2=100 应改为: SELECT * FROM T1 WHERE F1=100*2

6. Order by语句

ORDER BY语句决定了Oracle如何将返回的查询结果排序。Order by语句对要排序的列没有什么特别的限制,也可以将函数加入列中(象联接或者附加等)。任何在Order by语句的非索引项或者有计算表达式都将降低查询速度。

仔细检查order by语句以找出非索引项或者表达式,它们会降低性能。解决这个问题的办法就是重写order by语句以使用索引,也可以为所使用的列建立另外一个索引,同时应绝对避免在order by子句中使用表达式。

7. NOT

我们在查询时经常在where子句使用一些逻辑表达式,如大于、小于、等于以及不等于等等,也可以使用and(与)、or(或)以及not(非)。NOT可用来对任何逻辑运算符号取反。下面是一个NOT子句的例子:

... where not (status ='VALID')

如果要使用NOT,则应在取反的短语前面加上括号,并在短语前面加上NOT运算符。NOT运算符包含在另外一个逻辑运算符中,这就是不等于(<>)运算符。换句话说,即使不在查询where子句中显式地加入NOT词,NOT仍在运算符中,见下例:

... where status <>'INVALID';

对这个查询,可以改写为不使用NOT:

select * from employee where salary<3000 or salary>3000;

虽然这两种查询的结果一样,但是第二种查询方案会比第一种查询方案更快些。第二种查询允许Oracle对salary列使用索引,而第一种查询则不能使用索引。

8. IN和EXISTS

有时候会将一列和一系列值相比较。最简单的办法就是在where子句中使用子查询。在where子句中可以使用两种格式的子查询。

第一种格式是使用IN操作符:

... where column in(select * from ... where ...);

第二种格式是使用EXIST操作符:

... where exists (select 'X' from ...where ...);

我相信绝大多数人会使用第一种格式,因为它比较容易编写,而实际上第二种格式要远比第一种格式的效率高。在Oracle中可以几乎将所有的IN操作符子查询改写为使用EXISTS的子查询。

第二种格式中,子查询以‘select 'X'开始。运用EXISTS子句不管子查询从表中抽取什么数据它只查看where子句。这样优化器就不必遍历整个表而仅根据索引就可完成工作(这里假定在where语句中使用的列存在索引)。相对于IN子句来说,EXISTS使用相连子查询,构造起来要比IN子查询困难一些。

通过使用EXIST,Oracle系统会首先检查主查询,然后运行子查询直到它找到第一个匹配项,这就节省了时间。Oracle系统在执行IN子查询时,首先执行子查询,并将获得的结果列表存放在一个加了索引的临时表中。在执行子查询之前,系统先将主查询挂起,待子查询执行完毕,存放在临时表中以后再执行主查询。这也就是使用EXISTS比使用IN通常查询速度快的原因。

同时应尽可能使用NOT EXISTS来代替NOT IN,尽管二者都使用了NOT(不能使用索引而降低速度),NOT EXISTS要比NOT IN查询效率更高。

9.应尽量避免在 where 子句中使用or来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,

如:select id from employee where num=10 or num=20

可以这样查询:select id from employee where num=10 union all select id from employeewhere num=20

10.应尽量避免在 where 子句中对字段进行表达式操作

这将导致引擎放弃使用索引而进行全表扫描。如:select id from t where num/2=100应改为:select id from t where num=100*2

11.应尽量避免在where子句中对字段进行函数操作

这将导致引擎放弃使用索引而进行全表扫描。如:select id from t where substring(name,1,3)=’abc’ ,name以abc开头的id应改为:

select id from t where name like ‘abc%’

12.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

13.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。

14. 索引并不是越多越好

索引固然可以提高相应的select的效率,但同时也降低了insert 及update的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。

15.尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。

16.尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。

17.任何地方都不要使用select * fromt,用具体的字段列表代替“*”,不要返回用不到的任何字段。

四、总结:

通过这些查询优化方法,我们设法将查询从8秒降低到2秒,并且将查询次数从4次减少到1次。需要说明的是,这些查询时间是在我们开发环境运行时记录的,生产环境速度会更快。

这对追踪查询缓慢及其修复等问题是一个有用的指南。优化查询看起来可能像一个可怕的任务,但只要你尝试一下,并取得一些初步的胜利,你就会开始找到错误,并希望做出进一步改善。

欢迎加入  51软件测试大家庭,在这里你将获得【最新行业资讯】,【免费测试工具安装包】,【软件测试技术干货】,【面试求职技巧】... 51与你共同学习,一起成长!期待你的加入: QQ                     群:                    755431660

posted @ 2018-12-18 17:42 51testing 阅读(86) | 评论 (0) | 编辑 收藏
 
目前最受欢迎的12个Python web框架,你用过几个?

Python作为胶水语言,随AI时代来临备受追捧。其发展方向有很多的,比如:爬虫、数据分析、自动化测试、人工智能、运维还有web开发等。

Python程序员有很多很好的选择来创建Web应用程序和API;Django,Weppy,Bottle和Flask引领潮流。

如果正在开发一个Web应用程序并且已经选择使用Python作为构建它的语言,那么这是一个明智的选择。Python的开发成熟度,强大的库以及广泛的实际应用使其成为Web开发的必需。


其实,Python开发web在国内可能没那么盛行,但在国外却发展迅猛。国内有些知名网站,像知乎、网易、豆瓣都是用Python开发的;国外有Quora(社交问答网站)、Google、Pinterest(图片社交分享网站)。

所以,今天分享一下比较出名的12个Python web框架。

1.Django

Django是一个开源的Web应用框架,由Python写成,支持许多数据库引擎,可以让Web开发变得迅速和可扩展,并会不断的版本更新以匹配Python最新版本,如果是新手程序员,可以从这个框架入手。


Django为人所称道的地方主要有:

完美的文档,Django的成功,很大一部分原因要归功于Django近乎完美的官方文档

2、全套的解决方案,Django提供全套的解决方案,基本要什么有什么,而且全部Django自己造,开发网站应手的工具Django基本都给你做好了,因此开发效率是不用说的,出了问题也算好找,不在你的代码里就在Django的源码里。

3、强大的URL路由配置,Django让你可以设计出非常优雅的URL,在Django里你基本可以跟丑陋的GET参数说拜拜。

4、自助管理后台,admin interface是Django里比较吸引眼球的一项contrib,让你几乎不用写一行代码就拥有一个完整的后台管理界面。

5、系统紧耦合,如果你觉得Django内置的某项功能不是很好,想用喜欢的第三方库来代替是很难的,比如下面将要说的ORM、Template。要在Django里用SQLAlchemy或Mako几乎是不可能,即使打了一些补丁用上了也会让你觉得非常非常别扭。

6、Template功能比较弱,不能插入Python代码,要写复杂一点的逻辑需要另外用Python实现Tag或Filter。

Django是走大而全的方向,注重的是高效开发,它最出名的是其全自动化的管理后台:只需要使用起ORM,做简单的对象定义,它就能自动生成数据库结构、以及全功能的管理后台。

2.CubicWeb

CubicWeb被称为“一个支持重用和面向对象设计的语义Web应用程序框架。”这是一个有趣的系统,强调使用抽象和可重用的代码块称为“多维数据集”,但对于某些开发人员来说可能过于抽象或特殊。

多维数据集是具有模式(数据模型),实体(编程逻辑)和视图的软件组件。通过组合多个立方体,每个立方体执行自己的任务,可以通过重用自己的代码和其他代码来编写软件应用程序。

3.Web2py

Web2py是一个用Python语言编写的免费的开源Web框架,旨在敏捷快速的开发Web应用,具有快速、可扩展、安全以及可移植的数据库驱动的应用,遵循LGPLv3开源协议。

Web2py提供一站式的解决方案,整个开发过程都可以在浏览器上进行,提供了Web版的在线开发,HTML模版编写,静态文件的上传,数据库的编写的功能。其它的还有日志功能,以及一个自动化的admin接口。


4.Weppy

Weppy感觉就像Flask的简约风格和Django的完整性之间的中间标记。虽然开发Weppy应用程序具有Flash的直接性,但Weppy具有Django中的许多功能,如数据层和身份验证。因此,Weppy适用于从极其简单到适度复杂的应用程序。

5.Zope2

Zope不适用于简单的RESTful API(每Bottle或Flask),甚至不适用于具有交互性的基本网站(à la Django)。相反,它意味着是一个完整的企业级应用程序服务器堆栈,类似于Java产品。该文档将该框架描述为“对组件开发人员,整合者和Web设计人员最有用。”一个主要的第三方产品Plone CMS使用Zope作为其基础,并作为Zope持续开发的主要驱动力。

6.Bottle

Bottle是一个简单高效的遵循WSGI的微型python Web框架。说微型,是因为它只有一个文件,除Python标准库外,它不依赖于任何第三方模块。

Bottle可以被认为是一种迷你烧瓶,因为它比其他“微框架”更加紧凑和简洁。由于其占地面积最小,Bottle非常适合包含在其他项目中或快速交付REST API等小型项目。

7.CherryPy

CherryPy是一种用于Python的、简单而非常有用的Web框架,其主要作用是以尽可能少的操作将Web服务器与Python代码连接,其功能包括内置的分析功能、灵活的插件系统以及一次运行多个HTTP服务器的功能,可与运行在最新版本的Python、Jython、Android上。

8.Falcon

如果正在构建基于REST的API而不是其他任何东西,那么Falcon提供的绝对必要。它的设计精简而快速,几乎没有标准库之外的依赖关系。

Falcon获得“轻薄”标签的原因很大一部分与框架中的代码行数无关。这是因为Falcon在应用程序上几乎没有任何结构。

Falcon还采用了理智的开箱即用默认设置,因此安装时几乎不需要修改。

Falcon对API的关注意味着用传统的HTML用户界面构建Web应用程序几乎没有。

Falcon的文档与其他框架相比比较细长,但仅仅因为它的覆盖范围较小。用户指南包括所有主要功能的正式逐步演练,以及一个快速入门部分,可让您查看带或不带注释的示例代码。

9.Flask

Flask是一个轻量级的Web应用框架, 使用Python编写。基于 WerkzeugWSGI工具箱和Jinja2模板引擎,使用 BSD 授权。

Flask也被称为 “microframework” ,因为它使用简单的核心,用 extension 增加其他功能。Flask没有默认使用的数据库、窗体验证工具。然而,Flask保留了扩增的弹性,可以用Flask-extension加入这些功能:ORM、窗体验证工具、文件上传、各种开放式身份验证技术。

Flask 很轻,花很少的成本就能够开发一个简单的网站。非常适合初学者学习。Flask 框架学会以后,可以考虑学习插件的使用。例如使用 WTForm + Flask-WTForm 来验证表单数据,用 SQLAlchemy + Flask-SQLAlchemy 来对你的数据库进行控制。

Flask是轻量级的,但是扩展性非常良好(Github 上 37000 多个 star 就知道群众的选择不无道理),可以让我们在开发的时候 定制专属的功能。

10.Pyramid

Pyramid是一款非常通用的开源web框架。作为一个框架,它的首要任务是让开发者创建web应用变得简单。web应用的类型并不重要,可以是一个电子表单、一个企业内部网或者是一个社交平台。Pyramid非常通用,可以在各种各样的情况下使用它。

小而轻,Pyramid比Django更接近Flask甚至Falcon。因此,它非常适合于将现有Python代码公开为REST API,或者为开发人员完成大部分繁重任务的Web项目提供核心的任务。

Pyramid支持Python 2和Python 3,但不使用Python 3的异步语法。

11.Tornado

Tornado是使用Python编写的一个强大的、可扩展的Web服务器。它在处理严峻的网络流量时表现得足够强健,但却在创建和编写时有着足够的轻量级,并能够被用在大量的应用和工具中。

Tornado的特点:

作为Web框架,是一个轻量级的Web框架,类似于另一个Python web框架Web.py,其拥有异步非阻塞IO的处理方式。

作为Web服务器,Tornado有较为出色的抗负载能力,官方用nginx反向代理的方式部署Tornado和其它Python web应用框架进行对比,结果最大浏览量超过第二名近40%。

Tornado走的是少而精的方向,注重的是性能优越,它最出名的是异步非阻塞的设计方式。


12.Wheezy.web

Wheezy.web是Web框架的Flask/Bottle/Pyramid模型:小巧轻便,专注于提供高速和高并发性。这个功能集的核心是小的,但它的创建者已经为它配备了各种必备功能。

Wheezy的开发似乎已经停滞不前,因为该项目的最后一次提交都记录在2015年。这对于保持与新Python功能的兼容性并不是好兆头。

总结:

上述我们分析了12个框架。其中五个:Django,CubicWeb,Web2py,Weppy和Zope2,采用“控件”方法,包含你可以想象的Web应用程序所需的大多数功能。其余七个框架:Bottle,CherryPy,Falcon,Flask,Pyramid,Tornado,和Wheezy.web,提供更简约的外观,交易批量和完整性,简单易用。

关于框架选择的误区:

在框架的选择问题上,许多人很容易就陷入了下面两个误区中而不自知:哪个框架最好?世上没有最好的框架,只有最适合你自己、最适合你的团队的框架。编程语言选择也是一个道理,你的团队Python最熟就用Python好了,如果最熟悉的是Ruby那就用Ruby好了,编程语言、框架都只是工具,能多、快、好、省的干完活就是好东西。

过分关注性能——其实大部分人是没必要太关心框架的性能的,因为你开发的网站根本就是个小站,能上1万的IP的网站已经不多了,上10万的更是很少很少。在没有一定的访问量前谈性能其实是没有多大意义的,因为你的CPU和内存一直就闲着呢。

欢迎加入  51软件测试大家庭,在这里你将获得【最新行业资讯】,【免费测试工具安装包】,【软件测试技术干货】,【面试求职技巧】... 51与你共同学习,一起成长!期待你的加入: QQ                     群:                    755431660

posted @ 2018-12-17 17:51 51testing 阅读(78) | 评论 (0) | 编辑 收藏
 
知识普及:黑盒测试、白盒测试、灰盒测试之间的区别

黑盒测试

软件的黑盒测试意味着测试要在软件的接口处进行。

这种方法是把测试对象看做一个黑盒子,测试人员完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序的功能是否符合它的功能说明。

因此黑盒测试又叫功能测试或数据驱动测试。


通俗方式举例说明:

小明从商场的某一个入口进入,你在商场外面等待,并不知道商场内发生了什么,只知道正确的结果是,小明带着一堆商品从某一个出口(可以与入口相同)出来。

这是原定正确的情况,不出错我们就不需要管商场里面发生了什么,否则,在多次逛商场(多次黑盒测试)之中,发生无法达到原定正确的情况,例如小明与人争执、小明没带钱、小明有问题需要与自己协商等情况的发生,就需要测试人员进行检查了。

白盒测试

软件的白盒测试是对软件的过程性细节做细致的检查。

这种方法是把测试对象看做一个打开的盒子,它允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。通过在不同点检查程序状态,确定实际状态是否与预期的状态一致。

因此白盒测试又称为结构测试或逻辑驱动测试。

通俗方式举例说明:

小明从商场的某一个入口进入,你随着陪同进入商场,全程陪伴,观察小明购物的每个细节,了解其走过的每一步,发生的每个小情况,然后,你抱着一堆商品陪着小明从某一个出口出来。

灰盒测试

灰盒测试,是介于白盒测试与黑盒测试之间的。

可以这样理解,灰盒测试关注输出对于输入的正确性,同时也关注内部表现,但这种关注不象白盒那样详细、完整,只是通过一些表征性的现象、事件、标志来判断内部的运行状态,有时候输出是正确的,但内部其实已经错误了。

这种情况非常多,如果每次都通过白盒测试来操作,效率会很低,因此需要采取这样的一种灰盒的方法。

灰盒测试与黑盒测试的区别

如果某软件包含多个模块,当你使用黑盒测试时,你只要关心整个软件系统的边界,无需关心软件系统内部各个模块之间如何协作。而如果使用灰盒测试,你就需要关心模块与模块之间的交互。这是灰盒测试与黑盒测试的区别。

灰盒测试与白盒测试的区别

但是,在灰盒测试中,你还是无需关心模块内部的实现细节。对于软件系统的内部 模块,灰盒测试依然把它当成一个黑盒来看待。而白盒测试则不同,还需要再深入地了解内部模块的实现细节。所以,这是灰盒测试与黑盒测试的区别。

黑盒测试、白盒测试的区别

白盒测试的优点 

1、能仔细考虑软件的实现。 

2、可检测代码中的每条分支和路径。 

3、揭示隐藏在代码中的错误。 

4、对代码的测试比较彻底。

白盒测试的缺点 

1、昂贵。 

2、无法检测代码中遗漏的路径和数据敏感性错误

3、不验证规格的正确性。

黑盒测试的优点 

1、对于子系统甚至系统,效率要比白盒测试高。 

2、测试人员不需要了解实现的细节,包括特定的编程语言。 

3、测试人员和编程人员彼此独立。 

4、从用户的角度进行测试,很容易理解和接受。 

5、有助于暴露规格的不一致或有歧义的问题。 

6、测试用例可以在规格完成后马上进行。

黑盒测试的缺点 

1、只有一小部分输入被测试到,要测试每个可能的输入几乎不可能。 

2、没有清晰、简明的规格,测试用例很难设计。 

3、如果测试人员不被告知开发人员已经执行过的用例,在测试数据上会存在不必要的重复。 

4、有很多程序路径没有被测试到。 

5、不能直接针对特定程序段测试,而这些程序段可能很复杂,有可能隐藏更多的问题。 

6、大部分和研究相关的测试都是直接针对白盒测试的。

总结:

总而言之,言而总之,采用什么样的方法去测试,需要公司和项目组成员根据实际情况去制定。

灰盒测试是一个很不错的选择,其优点明显而缺点容易克服。朋友们在测试时,可以尝试用一用,看看效果如何。

欢迎加入  51软件测试大家庭,在这里你将获得【最新行业资讯】,【免费测试工具安装包】,【软件测试技术干货】,【面试求职技巧】... 51与你共同学习,一起成长!期待你的加入: QQ                     群:                    755431660

posted @ 2018-12-14 17:29 51testing 阅读(108) | 评论 (0) | 编辑 收藏
 
仅列出标题
共55页: First 11 12 13 14 15 16 17 18 19 Last