拉风的大熊猫 · java如何获取文件的创建时间_java获取 ...· 2 月前 · |
俊秀的葫芦 · 记者手记:埃塞俄比亚,后会有期!--国际--人民网· 1 年前 · |
挂过科的烤面包 · 输出流转输入流_51CTO博客_java输出 ...· 1 年前 · |
坐怀不乱的金针菇 · 源服务器未能找到目标资源的表示或者是不愿公开 ...· 1 年前 · |
贪玩的野马 · 无法将 匿名方法 ...· 1 年前 · |
Linux与查找相关的命令主要有以下4个:whereis、locate、find、which。其中find 不常用,whereis与locate经常使用,因为whereis与locate是利用数据库来查找数据,而find直接查找硬盘,速度较慢。which则是在PATH变量指定的路径中搜索指定的系统命令的位置。下面讲一下各自的用法 whereis whereis 命令只能对用户程序名称的搜索,即:定位/返回与指定名字匹配的二进制文件、源文件和帮助手册文件所在的路径。 whereis查找的速度非常快,这是因为linux系统会将系统内的所有文件都记录在一个数据库文件中,当使用whereis和locate时,会从数据库中查找数据,而不是像find命令那样,通 过遍历硬盘来查找,效率自然会很高。 但是该数据库文件并不是实时更新,默认情况下时一星期更新一次,因此,我们在用whereis和locate 查找文件时,有时会找到已经被删除的数据,或者刚刚建立文件,却无法查找到,原因就是因为数据库文件没有被更新。 whereis [-bmsu] 文件或者目录名 -b: 只找二进制格式的文件 -m: 只找在说明文件manual 路劲下的文件 -s: 只找source 源文件 -u: 查找不在上述三个选项中的其他特殊文件 root@test config]# whereis find find: /bin/find /usr/bin/find /usr/share/man/man1/find.1.gz [root@test config]# whereis -b find find: /bin/find /usr/bin/find [root@test config]# whereis -m find find: /usr/share/man/man1/find.1.gz [root@test config]# whereis -s find find: [root@test config]# whereis -u find find: /bin/find /usr/bin/find /usr/share/man/man1/find.1.gz locate 使用范围比whereis大的多,只需要部分文件名就可以进行模糊查询,同时locte还可以通过-r选项使用正则表达式,功能十分强大。与whereis一样 locate使用的索引数据库里的信息并不一定是实时有效的,可以使用updatedb命令更新索引数据库 locate [-ir] keyword 例如:查询passwd命令,查找包含passwd字符的文件,显示前3条记录 [root@oracledb ahome]# locate passwd|head -n 5 /etc/passwd /etc/passwd- /etc/pam.d/passwd 命令遍历当前工作目录及其子目录,在硬盘上遍历查找,非常耗硬盘资源,能用which、whereis和locate就不要用find。 find [option] [path1 path2 ……] [filename] 参数说明: 时间查找参数: -atime n: 将n*24小时内access过的文件列出来 -ctime n: 将n*24小时内状态发生改变的文件列出来 -mtime n: 将n*24小时内被修改过的文件列出来 -newer file: 把比file还要新的文件列出来 名称查找参数: -gid n: 寻找群组ID为n的文件 -group name: 寻找群组名称为name的文件 -uid n: 寻找拥有者ID为n的文件 -user name: 寻找拥有者名称为name的文件 -name file: 寻找文件名为file的文件(可以使用通配符) which 执行which命令时,which会在当前环境变量PATH中依次寻找能够匹配所找命令名字的可执行文件名,不加-a选项,返回第一个匹配的可执行文件的路径,否则依次返回满足条件的所有可执行文件的路径名。 一般用于查找命令/可执行文件所在的路径。有时候可能在多个路径下存在相同的命令,该命令可用于查找当前所执行的命令到底是哪一个位置处的命令。 以下是比较
测试用例的编写可不简单,写一份专业的测试用例,是所有测试工作者考虑的内容,其实用例的编写是可以通过一些思路来进行,不少比较成熟的公司为了提升用例的专业性,就会有自己的用例库,包括流程、关注点,以及自己定义的模板。 第一步、UI体验测试 1.风格、样式、颜色是否协调 2. 界面布局是否整齐、协调(保证全部显示出来的,尽量不要使用滚动条 3. 界面操作、标题描述是否恰当(描述有歧义、注意是否有错别字)。 4. 操作是否符合人们的常规习惯(有没有把相似的功能的控件放在一起,方便操作) 5. 提示界面是否符合规范(不应该显示英文的cancel、ok,应该显示中文的确定等) 6. 界面中各个控件是否对齐 7. 日期控件是否可编辑 8. 日期控件的长度是否合理,以修改时可以把时间全部显示出来为准 9. 查询结果列表列宽是否合理、标签描述是否合理 10. 查询结果列表太宽没有横向滚动提示 11. 对于信息比较长的文本,文本框有没有提供自动竖直滚动条 12. 数据录入控件是否方便 13. 有没有支持Tab键,键的顺序要有条理,不乱跳 14. 有没有提供相关的热键 15. 控件的提示语描述是否正确 16. 模块调用是否统一,相同的模块是否调用同一个界面 17. 用滚动条移动页面时,页面的控件是否显示正常 18. 日期的正确格式应该是XXXX-XX-XX或XXXX-XX-XXXX:XX:XX 19. 页面是否有多余按钮或标签 20. 窗口标题或图标是否与菜单栏的统一 21. 窗口的最大化、最小化是否能正确切换 22. 对于正常的功能,用户可以不必阅读用户手册就能使用 23. 执行风险操作时,有确认、删除等提示吗 24. 操作顺序是否合理 25. 正确性检查:检查页面上的form, button, table, header, footer,提示信息,还有其他文字拼写,句子的语法等是否正确。 26. 系统应该在用户执行错误的操作之前提出警告,提示信息. 27. 页面分辨率检查,在各种分辨率浏览系统检查系统界面友好性。 28. 合理性检查:做delete, update, add, cancel, back等操作后,查看信息回到的页面是否合理。 29. 检查本地化是否通过:英文版不应该有中文信息,英文翻译准确,专业。 30.背景灰度冻结 第二步、功能完整性测试 1.使用所有默认值进行测试 2.根据所有产品文档、帮助文档中描述的内容要进行遍历测试 3.输入判断 4.所有界面出现是和否的逻辑,要测试 5.异常处理 6.敏感词 7.根据需求文档的流程图遍历所有流程图路径 8.根据程序内容,遍历if elif else switch的逻辑点要遍历 9.界面各种控件测试 第三步、业务流程测试 业务流程,一般会涉及到多个模块的数据,所以在对业务流程测试时,首先要保证单个模块功能的正确性,其次就要对各个模块间传递的数据进行测试,这往往是容易出现问题的地方,测试时一定要设计不同的数据进行测试。 如某一功能模块具有最基本的增删改查功能,则需要进行以下测试: 1.单项功能测试(增加、修改、查询、删除) 2.增加——>增加——>增加 (连续增加测试) 3.增加——>删除 4.增加——>删除——>增加 (新增加的内容与删除内容一致) 5.增加——>修改——>删除 6.修改——>修改——>修改 (连续修改测试) 7.修改——>增加(新增加的内容与修改前内容一致) 8.修改——>删除 9.修改——>删除——>增加 (新增加的内容与删除内容一致) 10.删除——>删除——>删除 (连续删除测试) 第四步、容错机制测试 1.输入系统不允许的数据作为输入。 2.把某个相关模块或者子系统停掉,验证对当前系统的影响。 3.配置文件删除或者配置错误。 4.数据库注入错误数据。 第五步、常规性测试 1.系统不间断运行(7*24),验证是否内存泄露、系统其他资源是否存在泄露 2.如果很紧急上线,可以跑一晚上或者周末跑两天。 一般压力很大的情况下,数据库连接数问题、内存泄露问题会曝露的比较快但是死锁可能不能体现,所以要看系统重要性,如12306稳定性则最好7*24小时 第六步、性能测试 1.连接速度测试 用户连接到Web应用系统的速度根据上网方式的变化而变化,他们或许是电话拨号,或是宽带上网。当下载一个程序时,用户可以等较长的时间,但如果仅仅访问一个页面就不会这样。如果Web系统响应时间太长(例如超过5秒钟),用户就会因没有耐心等待而离开。 另外,有些页面有超时的限制,如果响应速度太慢,用户可能还没来得及浏览内容,就需要重新登陆了。而且,连接速度太慢,还可能引起数据丢失,使用户得不到真实的页面。 2.负载测试 负载测试是为了测量Web系统在某一负载级别上的性能,以保证Web系统在需求范围内能正常工作。负载级别可以是某个时刻同时访问Web系统的用户数量,也可以是在线数据处理的数量。例如:Web应用系统能允许多少个用户同时在线?如果超过了这个数量,会出现什么现象?Web应用系统能否处理大量用户对同一个页面的请求? 3.压力测试 负载测试应该安排在Web系统发布以后,在实际的网络环境中进行测试。因为一个企业内部员工,特别是项目组人员总是有限的,而一个Web系统能同时处理的请求数量将远远超出这个限度,所以,只有放在Internet上,接受负载测试,其结果才是正确可信的。 进行压力测试是指实际破坏一个Web应用系统,测试系统的反映。压力测试是测试系统的限制和故障恢复能力,也就是测试Web应用系统会不会崩溃,在什么情况下会崩溃。黑客常常提供错误的数据负载,直到Web应用系统崩溃,接着当系统重新启动时获得存取权。 压力测试的区域包括表单、登陆和其他信息传输页面等 第七步、交互体验测试 1.系统界面的控件是否可以通过tab键遍历,并且顺序合理 2.主要功能的入口和操作是否易于理解 3.界面是否布局合理,功能是否易于查找和使用 4.操作步骤 5.操作习惯 6.有足够的提示信息,且信息文字描述准确 第八步、兼容性测试 兼容性测试不只是指界面在不同操作系统或浏览器下的兼容,有些功能方面的测试,也要考虑到兼容性, 包括操作系统兼容和应用软件兼容,可能还包括硬件兼容 比如涉及到ajax、jquery、javascript等技术的,都要考虑到不同浏览器下的兼容性问题。 除了上面所说的这些测试以外,还有算法测试、配置测试、安全性测试等等,在工作中不断总结和分析,形成自己的功能测试框架,当你把这份工作做起来以后,对于你自己对于测试团队而言都是一份很有价值的事情,你的测试思路也会变得更全面
linux系统中,可以利用grep查看指定的内容, 比如:grep “123” test.log //查看test.log中包含123字符的日志 如果想查看指定内容上下几行,可以用参考下面的用法: $grep -10 ‘123’ test.log//打印匹配行的前后10行 或 $grep -C 10 ‘123’ test.log//打印匹配行的前后10行 或 $ grep -A 10 -B 10 ‘123’ test.log //打印匹配行的前后10行 $grep -A 10 ‘123’ test.log //打印匹配行的后10行 $grep -B 10 ‘123’ test.log//打印匹配行的前10行 其他例子: //显示既匹配 ‘123’又匹配 ‘456’的行 grep ‘123’ test.log| grep ‘456’ //搜索test.log中满足123的内容的行号 grep -n ‘123’ test.log //查看test.log指定行号后的内容,比如50行 tail -n +50 test.log //查看test.log的第50行到100行 sed -n ‘50,100p’ test.log#记得p字母 详细用法可以查考:http://blog.csdn.net/lychbeyond/article/details/41042483
设置断点修改Request Fiddler最强大的功能莫过于设置断点了,设置好断点后,你可以修改httpRequest的任何信息包括host, cookie或者表单中的数据。设置断点有两种方法: 第一种:打开Fiddler 点击Rules-> Automatic Breakpoint ->Before Requests(这种方法会中断所有的会话) 消除命令:点击Rules-> Automatic Breakpoint ->Disabled 第二种: 在命令行中输入命令: bpubefore blog.csdn.net (这种方法只会中断blog.csdn.net) 消除命令: 在命令行中输入命令 bpubefore 设置断点修改Response 有两种方法: 第一种:打开Fiddler 点击Rules-> Automatic Breakpoint ->After Response (这种方法会中断所有的会话) 消除命令: 点击Rules-> Automatic Breakpoint ->Disabled 第二种: 在命令行中输入命令: bpuafter www.baidu.com (这种方法只会中断www.baidu.com) 消除命令:在命令行中输入命令 bpuafter 1、手机抓包的时候报443错误,有两种情况; 未安装证书:解决方法是安装证书 已安装证书:证书失效,在fiddler点击Tools—>Options—>HTTPS —–>actions,选择Reset all Certificates,然后重新在手机上下载证书打开fiddler,选择菜单Tools—>Options,在options弹出框选择https,勾选下图选项: 首次点击会弹出是否信任fiddler证书和安全提示,直接点击yes就行 设置connections,允许远程连接 点击Tools—>Options->Connections,勾选allow remote computers to connect,默认监听端口为8888(下图Fiddler listens on port就是端口号),若端口被占用可以设置成其他的,配置好后要重新启动fiddler,具体配置如下图: 移动端设置(Android&ios) 这里以安卓手机为例,ios设置类同 首先要知道pc端的ip地址,可以在cmd里面输入ipconfig或者网络共享中查询到,比如我的是:10.244.71.235 ,端口号:8888(Connections中配置的端口号) 手机和电脑连接同一个网络,打开手机浏览器,输入http://ip:端口号,例如:http://10.244.71.235:8888,点击前往 放大些,只需点击下图的红框链接: 随便输入一个名字,点击确认即可 如果点击确认的时候要求输入密码,就设置一个手机密码,后面不用的时候也可以删除掉 设置WiFi代理 选择链接的WiFi,选择高级或者更多设置,选择手动,输入pc的ip地址和fiddler中配置的端口号 这时候操作手机,fillder上就显示请求信息了 抓包结束后的操作: 1.停止电脑对手机的网络监控 系统设置-wifi,找到代理,去掉即可; 2.删除手机中证书 安卓系统设置—安全—收信任的凭证—用户,点击证书删除即可; 3.删除手机上密码 手机系统—安全—密码,删除系统密码即可;
问题描述:前端时间用pinpoint采集数据保存到Hbase,脏数据比较多,想清空数据库重新测试,发现Hbase清空表只能先删除表再重建,不能只清空数据;删除后重建表的时候就报Table already exists,用list查看发现表已经被删了,所以懵逼了~ 1、通过./hbase zkcli命令进入zookeeper client模式 2、输入ls /hbase/table命令看到zombie table 3、使用rmr /hbase/table/TABLE_NAME命令删除zombie table 4、重启Hbase 如果是直接rmr /hbase会报非空错误:rmr /hbase Node not empty: /hbase/ 所以需要再进一级去删除 首先在list的时候,没有显示之前建的表,也就是没有感知到之前建的表,但是create时候却感知到了之前建的表,所以很自然需要看一下list和create的时候,server执行的逻辑。只要清楚了这个逻辑,问题便一清二楚了。 1、list时server端的逻辑其实很简单。list的时候master端执行的逻辑的入口函数是listTableDescriptors。核心代码如下: // request for all TableDescriptors Collection<HTableDescriptor> htds; if (namespace != null && namespace.length() > 0) { htds = tableDescriptors.getByNamespace(namespace).values(); } else { htds = tableDescriptors.getAll().values(); for (HTableDescriptor desc: htds) { if (includeSysTables || !desc.getTableName().isSystemTable()) { descriptors.add(desc); 可以看到是从tableDescriptors中获取的,而tableDescriptors是根据hbase在hdfs中路径的描述 this.tableDescriptors = new FSTableDescriptors( this.conf, this.fs, this.rootDir, !canUpdateTableDescriptor(), false); 然后可以看到这些信息是从hbase在hdfs中的rootpath下的data目录中获取表相关信息的。所以,list的时候当然看不见之前的表了。 2、create table的时候,在server端最终会使用createTableHandler或者createTableProcedure来处理建表的逻辑。在createTableProcedure中正式建表之前,会调用prepareCreate函数。 private boolean prepareCreate(final MasterProcedureEnv env) throws IOException { final TableName tableName = getTableName(); if (MetaTableAccessor.tableExists(env.getMasterServices().getConnection(), tableName)) { setFailure("master-create-table", new TableExistsException(getTableName())); return false; // During master initialization, the ZK state could be inconsistent from failed DDL // in the past. If we fail here, it would prevent master to start. We should force // setting the system table state regardless the table state. boolean skipTableStateCheck = !(env.getMasterServices().isInitialized()) && tableName.isSystemTable(); if (!skipTableStateCheck) { TableStateManager tsm = env.getMasterServices().getAssignmentManager().getTableStateManager(); if (tsm.isTableState(tableName, true, ZooKeeperProtos.Table.State.ENABLING, ZooKeeperProtos.Table.State.ENABLED)) { LOG.warn("The table " + tableName + " does not exist in meta but has a znode. " + "run hbck to fix inconsistencies."); setFailure("master-create-table", new TableExistsException(getTableName())); return false; return true; 在14行,通过TableStateManager会检查zookeeper对应的表状态是不是enable的,检查zk中的路径是hbase root path下的table目录。由于zk还是之前的zk,所以之前建的表信息还在,很自然这时候会检查已经存在,如是报了Table already exits的错误。Log提示中说用hbck去检查,但是貌似检查不出来是不一致的。 问题解决思路: 本来想通过hbck去检查,然后修复的,但是貌似hbck检查不出来。所以只是简单暴力的把zk中对应的table删除,然后create就没问题了。
pinpoint是开源在github上的一款APM监控工具,它是用Java编写的,用于大规模分布式系统监控。它对性能的影响最小(只增加约3%资源利用率),安装agent是无侵入式的,只需要在被测试的Tomcat中加上3句话,打下探针,就可以监控整套程序了。这篇Blog主要是想记录一下它安装的过程,方便日后查阅。 我安装它用到的2台 CentOS6.8 虚拟机,一台主要部署pinpoint的主程序,一台模拟测试环境。配置如下: JDK下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html pinpoint下载地址: https://github.com/naver/pinpoint 或者下载整合以后的(推荐) 链接: http://pan.baidu.com/s/1c2couDM 密码: afvb 1、环境配置 1.1 获取需要的依赖包 进入home目录,创建一个”pp_res”的资源目录,用来存放需要安装的包 mkdir /home/pp_res cd /home/pp_res/ 使用xftp等类似的工具,将需要的文件上传到Linux虚拟机中,主要要传的文件都在百度网盘下载的pp_res中 jdk7 — Java运行环境 hbase-1.0 — 数据库,用来存储监控信息 tomcat8.0 — Web服务器 pinpoint-collector.war — pp的控制器 pinpoint-web.war — pp展示页面 pp-collector.init — 用来快速启动pp-col,不要也可以 pp-web.init — 用来快速启动pp-web,不要也可以 是用ls或者ll命令查看是否上传成功 [root@test2 pp_res]# ll total 218088 -rw-r--r--. 1 root root 9277365 Jul 17 11:05 apache-tomcat-8.0.36.tar.gz -rw-r--r--. 1 root root 103847513 Jul 17 11:05 hbase-1.0.3-bin.tar.gz -rw-r--r--. 1 root root 16984 Jul 17 11:05 hbase-create.hbase -rw-r--r--. 1 root root 6621915 Jul 17 11:05 pinpoint-agent-1.5.2.tar.gz -rw-r--r--. 1 root root 31339914 Jul 17 11:05 pinpoint-collector-1.5.2.war -rw-r--r--. 1 root root 54505168 Jul 17 11:05 pinpoint-web-1.5.2.war -rw-r--r--. 1 root root 17699306 Jul 17 11:05 zookeeper-3.4.6.tar.gz 1.2 配置jdk1.7 这套APM系统主要是用jdk1.7来进行部署的,首先要配置jdk的环境变量 cd /home/pp_res/ tar -zxvf jdk-7u79-linux-x64.tar.gz mkdir /usr/java mv jdk1.7.0_79/ /usr/java/jdk17 配置java环境变量 vi /etc/profile 将下列复制到profile的最后一行中 export JAVA_HOME=/usr/java/jdk17 export PATH=$PATH:$JAVA_HOME/bin 让环境变量生效 source /etc/profile 测试java的环境变量是否配置好了 [root@localhost pp_res]# java -version java version "1.7.0_79" Java(TM) SE Runtime Environment (build 1.7.0_79-b15) Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode) 2. 安装Hbase pinpoint收集来的测试数据,主要是存在Hbase数据库的。所以它可以收集大量的数据,可以进行更加详细的分析。 1、将Hbase解压,并且放入指定目录 cd /home/pp_res/ tar -zxvf hbase-1.0.3-bin.tar.gz mkdir -p /data/service mv hbase-1.0.3/ /data/service/hbase 2、修改hbase-env.sh的JAVA_HOME环境变量位置 cd /data/service/hbase/conf/ vi hbase-env.sh 在27行左右的位置,修改如下 export JAVA_HOME=/usr/java/jdk17/ 3、修改Hbase的配置信息 vi hbase-site.xml 在结尾修改成如下,这里我们指定Hbase本地来存储数据,生产环境将数据建议存入HDFS中。 <configuration> <property> <name>hbase.rootdir</name> <value>file:///data/hbase</value> </property> </configuration> 4、启动hbase cd /data/service/hbase/bin ./start-hbase.sh 查看Hbase是否启动成功,如果启动成功的会看到”HMaster”的进程 [root@localhost bin]# jps 12075 Jps 11784 HMaster 5、初始化Hbase的pinpoint库 执行pinpoint提供的Hbase初始化语句,这时会初始化一会。 ./hbase shell /home/pp_res/hbase-create.hbase 执行完了以后,进入Hbase ./hbase shell 进入后可以看到Hbase的版本,还有一些相关的信息 2016-11-15 01:55:44,861 WARN [main] util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using built in-java classes where applicableHBase Shell; enter 'help<RETURN>' for list of supported commands. Type "exit<RETURN>" to leave the HBase Shell Version 1.0.3, rf1e1312f9790a7c40f6a4b5a1bab2ea1dd559890, Tue Jan 19 19:26:53 PST 2016 hbase(main):001:0> 输入”status ‘detailed’”可以查看刚才初始化的表,是否存在 hbase(main):001:0> status 'detailed' version 1.0.3 0 regionsInTransition master coprocessors: [] 1 live servers localhost:50887 1478538574709 requestsPerSecond=0.0, numberOfOnlineRegions=498, usedHeapMB=24, maxHeapMB=237, numberOfStores=626, numberOfStorefiles=0, storefileUncom pressedSizeMB=0, storefileSizeMB=0, memstoreSizeMB=0, storefileIndexSizeMB=0, readRequestsCount=7714, writeRequestsCount=996, rootIndexSizeKB=0, totalStaticIndexSizeKB=0, totalStaticBloomSizeKB=0, totalCompactingKVs=0, currentCompactedKVs=0, compactionProgressPct=NaN, coprocessors=[MultiRowMutationEndpoint] "AgentEvent,,1478539104778.aa1b3b14d0b48d83cbf4705b75cb35b7." numberOfStores=1, numberOfStorefiles=0, storefileUncompressedSizeMB=0, storefileSizeMB=0, memstoreSizeMB=0, storefileIndexSizeMB=0, readRequestsCount=0, writeRequestsCount=0, rootIndexSizeKB=0, totalStaticIndexSizeKB=0, totalStaticBloomSizeKB=0, totalCompactingKVs=0, currentCompactedKVs=0, compactionProgressPct=NaN, completeSequenceId=-1, dataLocality=0.0 也可以登录web,来查看HBase的数据是否初始化成功 HbaseWeb : http://10.244.76.136:16010/master-status HBase脚本介绍 hbase-create.hbase - 创建pinpoint必须的表。 hbase-drop.hbase - 删除pinpoint必须的所有表 hbase-flush-table.hbase - 刷新所有表 hbase-major-compact-htable.hbase- 压缩主要的所有表 3. 安装pinpoint-collector 3.1 部署war包 解压Tomcat,将Tomcat重命名移动到指定位置 cd /home/pp_res/ tar -zxvf apache-tomcat-8.0.36.tar.gz mv apache-tomcat-8.0.36/ /data/service/pp-col 修改pp-col的Tomcat的配置,主要修改端口,避免与pp-web的Tomcat的端口冲突。我在原本默认的端口前都加了1,下面是替换的shell命令。 【注意】最后一条是将tomcat的私有ip开放,需要将localhost替换成本机的ip,我本机的网卡是默认的,如果你本机的网卡不是eth0,需要进行相关的修改。或者直接用”vi”进去,修改localhost cd /data/service/pp-col/conf/ sed -i 's/port="8005"/port="18005"/g' server.xml sed -i 's/port="8080"/port="18080"/g' server.xml sed -i 's/port="8443"/port="18443"/g' server.xml sed -i 's/port="8009"/port="18009"/g' server.xml sed -i 's/redirectPort="8443"/redirectPort="18443"/g' server.xml sed -i "s/localhost/`ifconfig eth0 | grep 'inet addr' | awk '{print $2}' | awk -F: '{print $2}'`/g" server.xml 部署pinpoint-collector.war包 【注意:如果没有unzip命令,可以 “yum install unzip” 】 cd /home/pp_res/ rm -rf /data/service/pp-col/webapps/* unzip pinpoint-collector-1.5.2.war -d /data/service/pp-col/webapps/ROOT 启动Tomcat cd /data/service/pp-col/bin/ ./startup.sh 查看日志,是否成功启动 tail -f ../logs/catalina.out 3.2 配置快速启动 配置快速启动需要修改pp-collector.init的路径( pp-collector在网盘里面有 ),可以”vi”进去,大概在18,24,27行处,修改相关的路径。我这边为了方便,直接就用替换的shell做了,如果路径与我的不一致,需要将路径修改成自己的路径。 cd /home/pp_res sed -i "s/JAVA_HOME=\/usr\/java\/default\//JAVA_HOME=\/usr\/java\/jdk17\//g" pp-collector.init sed -i "s/CATALINA_HOME=\/data\/service\/pinpoint-collector\//CATALINA_HOME=\/data\/service\/pp-col\//g" pp-collector.init sed -i "s/CATALINA_BASE=\/data\/service\/pinpoint-collector\//CATALINA_BASE=\/data\/service\/pp-col\//g" pp-collector.init 将文件赋予”执行”的权限,把它放到”init.d”中去。以后就可以restart快速重启了。 chmod 711 pp-collector.init mv pp-collector.init /etc/init.d/pp-col # 测试一下restart [root@localhost pp_res]# /etc/init.d/pp-col restart Stoping Tomcat Using CATALINA_BASE: /data/service/pp-col/ Using CATALINA_HOME: /data/service/pp-col/ Using CATALINA_TMPDIR: /data/service/pp-col//temp Using JRE_HOME: /usr/java/jdk17/ Using CLASSPATH: /data/service/pp-col//bin/bootstrap.jar:/data/service/pp-col//bin/tomcat-juli.jar waiting for processes to exitStarting tomcat Using CATALINA_BASE: /data/service/pp-col/ Using CATALINA_HOME: /data/service/pp-col/ Using CATALINA_TMPDIR: /data/service/pp-col//temp Using JRE_HOME: /usr/java/jdk17/ Using CLASSPATH: /data/service/pp-col//bin/bootstrap.jar:/data/service/pp-col//bin/tomcat-juli.jar Tomcat started. Tomcat is running with pid: 1190
$ git clone http[s]://example.com/path/to/repo.git/ $ git clone ssh://example.com/path/to/repo.git/ $ git clone git://example.com/path/to/repo.git/ $ git clone /opt/git/project.git $ git clone file:///opt/git/project.git $ git clone ftp[s]://example.com/path/to/repo.git/ $ git clone rsync://example.com/path/to/repo.git/ SSH协议还有另一种写法。 $ git clone [user@]example.com:path/to/repo.git/ 通常来说,Git协议下载速度最快,SSH协议用于需要用户认证的场合。各种协议优劣的详细讨论请参考官方文档。 git remote 为了便于管理,Git要求每个远程主机都必须指定一个主机名。git remote命令就用于管理主机名。 不带选项的时候,git remote命令列出所有远程主机。 $ git remote origin 使用-v选项,可以参看远程主机的网址。 $ git remote -v origin git@github.com:jquery/jquery.git (fetch) origin git@github.com:jquery/jquery.git (push) 上面命令表示,当前只有一台远程主机,叫做origin,以及它的网址。 克隆版本库的时候,所使用的远程主机自动被Git命名为origin。如果想用其他的主机名,需要用git clone命令的-o选项指定。 $ git clone -o jQuery https://github.com/jquery/jquery.git $ git remote jQuery 上面命令表示,克隆的时候,指定远程主机叫做jQuery。 git remote show命令加上主机名,可以查看该主机的详细信息。 $ git remote show <主机名> git remote add命令用于添加远程主机 $ git remote add <主机名> <网址> git remote rm命令用于删除远程主机。 $ git remote rm <主机名> git remote rename命令用于远程主机的改名。 $ git remote rename <原主机名> <新主机名> git fetch 一旦远程主机的版本库有了更新(Git术语叫做commit),需要将这些更新取回本地,这时就要用到git fetch命令。 $ git fetch <远程主机名> 上面命令将某个远程主机的更新,全部取回本地。 git fetch命令通常用来查看其他人的进程,因为它取回的代码对你本地的开发代码没有影响。 默认情况下,git fetch取回所有分支(branch)的更新。如果只想取回特定分支的更新,可以指定分支名。 $ git fetch <远程主机名> <分支名> 比如,取回origin主机的master分支。 $ git fetch origin master 所取回的更新,在本地主机上要用”远程主机名/分支名”的形式读取。比如origin主机的master,就要用origin/master读取。 git branch命令的-r选项,可以用来查看远程分支,-a选项查看所有分支。 $ git branch -r origin/master $ git branch -a * master remotes/origin/master 上面命令表示,本地主机的当前分支是master,远程分支是origin/master。 取回远程主机的更新以后,可以在它的基础上,使用git checkout命令创建一个新的分支。 $ git checkout -b newBrach origin/master 上面命令表示,在origin/master的基础上,创建一个新分支。 此外,也可以使用git merge命令或者git rebase命令,在本地分支上合并远程分支。 $ git merge origin/master $ git rebase origin/master 上面命令表示在当前分支上,合并origin/master。 git pull git pull命令的作用是,取回远程主机某个分支的更新,再与本地的指定分支合并。它的完整格式稍稍有点复杂。 $ git pull <远程主机名> <远程分支名>:<本地分支名> 比如,取回origin主机的next分支,与本地的master分支合并,需要写成下面这样。 $ git pull origin next:master 如果远程分支是与当前分支合并,则冒号后面的部分可以省略。 $ git pull origin next 上面命令表示,取回origin/next分支,再与当前分支合并。实质上,这等同于先做git fetch,再做git merge。 $ git fetch origin $ git merge origin/next 在某些场合,Git会自动在本地分支与远程分支之间,建立一种追踪关系(tracking)。比如,在git clone的时候,所有本地分支默认与远程主机的同名分支,建立追踪关系,也就是说,本地的master分支自动”追踪”origin/master分支。 Git也允许手动建立追踪关系。 git branch --set-upstream master origin/next 上面命令指定master分支追踪origin/next分支。 如果当前分支与远程分支存在追踪关系,git pull就可以省略远程分支名。 $ git pull origin 上面命令表示,本地的当前分支自动与对应的origin主机”追踪分支”(remote-tracking branch)进行合并。 如果当前分支只有一个追踪分支,连远程主机名都可以省略。 $ git pull 上面命令表示,当前分支自动与唯一一个追踪分支进行合并。 如果合并需要采用rebase模式,可以使用–rebase选项。 $ git pull --rebase <远程主机名> <远程分支名>:<本地分支名> 如果远程主机删除了某个分支,默认情况下,git pull 不会在拉取远程分支的时候,删除对应的本地分支。这是为了防止,由于其他人操作了远程主机,导致git pull不知不觉删除了本地分支。 但是,你可以改变这个行为,加上参数 -p 就会在本地删除远程已经删除的分支。 $ git pull -p # 等同于下面的命令 $ git fetch --prune origin $ git fetch -p git push git push命令用于将本地分支的更新,推送到远程主机。它的格式与git pull命令相仿。 $ git push <远程主机名> <本地分支名>:<远程分支名> 注意,分支推送顺序的写法是<来源地>:<目的地>,所以git pull是<远程分支>:<本地分支>,而git push是<本地分支>:<远程分支>。 如果省略远程分支名,则表示将本地分支推送与之存在”追踪关系”的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。 $ git push origin master 上面命令表示,将本地的master分支推送到origin主机的master分支。如果后者不存在,则会被新建。 如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。 $ git push origin :master # 等同于 $ git push origin --delete master 上面命令表示删除origin主机的master分支。 如果当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略。 $ git push origin 上面命令表示,将当前分支推送到origin主机的对应分支。 如果当前分支只有一个追踪分支,那么主机名都可以省略。 $ git push 如果当前分支与多个主机存在追踪关系,则可以使用-u选项指定一个默认主机,这样后面就可以不加任何参数使用git push。 $ git push -u origin master 上面命令将本地的master分支推送到origin主机,同时指定origin为默认主机,后面就可以不加任何参数使用git push了。 不带任何参数的git push,默认只推送当前分支,这叫做simple方式。此外,还有一种matching方式,会推送所有有对应的远程分支的本地分支。Git 2.0版本之前,默认采用matching方法,现在改为默认采用simple方式。如果要修改这个设置,可以采用git config命令。 $ git config --global push.default matching $ git config --global push.default simple 还有一种情况,就是不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机,这时需要使用–all选项。 $ git push --all origin 上面命令表示,将所有本地分支都推送到origin主机。 如果远程主机的版本比本地版本更新,推送时Git会报错,要求先在本地做git pull合并差异,然后再推送到远程主机。这时,如果你一定要推送,可以使用–force选项。 $ git push --force origin 上面命令使用–force选项,结果导致远程主机上更新的版本被覆盖。除非你很确定要这样做,否则应该尽量避免使用–force选项。 最后,git push不会推送标签(tag),除非使用–tags选项。 $ git push origin --tagswar文件 下载地址:http://mirrors.jenkins-ci.org/war/latest/jenkins.war 下载放到Tomcat\webapps目录下,启动tomcat即可 或者用命令 java -jar jenkins.war msi安装 下载地址:http://ftp.yz.yamagata-u.ac.jp/pub/misc/jenkins/windows-stable/ 选择最新的下载,解压运行jenkins.msi即可 安装过后就是服务在后台运行,查看位置是:控制面板–服务,可在列表中查看 作为服务运行的时候,web测试等是在后台运行的,不能够查看到浏览器的具体操作,出错不容易定位问题。 有两种方法解决这个问题: (1)windows的控制面板–管理工具–服务。找到 jenkins服务,先停用,然后修改启动类型为禁用。 (2)手动启动jenkins.war。定位到jenkins.war文件所在的文件夹。执行Java -jar jenkins.war。 (3)重新进jenkins,创建job,然后构建执行就OK。 (需要重新安装插件。) 可以做成一个bat文件,以后每次启动jenkins,双击运行这个bat文件就可以了 语句如下: echo "Jenkins CI automation testting" java -jar "C:\Program Files (x86)\Jenkins\jenkins.war" pause 注意问题: (1)通过这种方式启动jenkins,之前以windows service 启动jenkins的数据都丢失了,需要重新创建job。 (2)之前以windows service 启动jenkins中安装的插件也没有了,需要重新安装所需插件。 war运行转成服务的也有两个方法: 下载个msi安装成服务 具体操作可参考官方文档 地址:https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins+as+a+Windows+service
方法1: svn merge回滚 1) 先 svn up,保证更新到最新的版本,如2106; 2) 然后用 svn log ,查看历史修改,找出要恢复的版本,如2105 。如果想要更详细的了解情况,可以使用svn diff -r 2105:2106 [文件或目录]; 3) 回滚到版本号2105:svn merge -r 2106:2105 [文件或目录],注意版本号之间的顺序,这个叫反向合并; 4) 查看当前工作版本中的文件,如test.cpp和版本号10中文件的差别:svn diff -r 2105 test.cpp, 有差别则手动改之; 5) 若无差别,则提交:svn ci -m“back to r 2105,xxxxx” [文件或目录]。这时svn库中会生成新的版本,如21。 方法2: 用svn up 前2步如方法1,然后直接 svn up -r 2105。当前的工作版本就是版本2105了。但是注意,这时svn库中会并不会生成新的版本,下次在本地svn up之后,还是会回到之前的版本。 SVN命令介绍 1、将文件checkout到本地目录 svn checkout path(path是服务器 上的目录) 例如:svn checkout svn://192.168.1.1/pro/domain 简写:svn co 2、往版本库中添加新的文件 svn add file 例如:svn add test.php(添加test.php) svn add *.php(添加当前目录下所有的php文件) 3、将改动的文件提交到版本库 svn commit -m “LogMessage“ [-N] [–no-unlock] PATH(如果选择了保持锁,就使用–no-unlock开关) 例如:svn commit -m “add test file for my test“ test.php 简写:svn ci 4、加锁/解锁 svn lock -m “LockMessage“ [–force] PATH 例如:svn lock -m “lock test file“ test.php svn unlock PATH 5、更新到某个版本 svn update -r m path svn update如果后面没有目录,默认将当前目录以及子目录下的所有文件都更新到最新版本 。 svn update -r 200 test.php(将版本库中的文件test.php还原到版本200) svn update test.php(更新,于版本库同步。如果在提交的时候提示过期的话,是因为冲突,需要先update,修改 文件,然后清除svn resolved,最后再提交commit) 简写:svn up 6、查看文件或者目录状态 1)svn status path(目录下的文件和子目录的状态,正常状态不显示) 【?:不在svn的控制中;M:内容被修改;C:发生冲突;A:预定加入到版本库;K:被锁定】 2)svn status -v path(显示文件和子目录状态) 第一列保持相同,第二列显示工作版本号,第三和第四列显示最后一次修改的版本号和修改人。 注:svn status、svn diff和 svn revert这三条命令在没有网络的情况下也可以执行的,原因是svn在本地的.svn中保留了本地版本的原始拷贝。 简写:svn st 7、删除 文件 svn delete path -m “delete test fle“ 例如:svn delete svn://192.168.1.1/pro/domain/test.php -m “delete test file” 或者直接svn delete test.php 然后再svn ci -m ‘delete test file‘,推荐使用这种 简写:svn (del, remove, rm) 8、查看日志 svn log path 例如:svn log test.php 显示这个文件的所有修改记录,及其版本号的变化 9、查看文件详细信息 svn info path 例如:svn info test.php 10、比较差异 svn diff path(将修改的文件与基础版本比较) 例如:svn diff test.php svn diff -r m:n path(对版本m和版本n比较差异) 例如:svn diff -r 200:201 test.php 简写:svn di 11、将两个版本之间的差异合并到当前文件 svn merge -r m:n path 例如:svn merge -r 200:205 test.php(将版本200与205之间的差异合并到当前文件,但是一般都会产生冲突,需要处理一下) 12、SVN 帮助 svn help svn help ci —————————————————————————— 以上是常用命令,下面写几个不经常用的 —————————————————————————— 13、版本库下的文件和目录列表 svn list path 显示path目录下的所有属于版本库的文件和目录 简写:svn ls 14、创建纳入版本控制下的新目录 svn mkdir: 创建纳入版本控制下的新目录。 用法: 1、mkdir PATH… 2、mkdir URL… 创建版本控制的目录。 1、每一个以工作副本 PATH 指定的目录,都会创建在本地端,并且加入新增 调度,以待下一次的提交。 2、每个以URL指定的目录,都会透过立即提交于仓库中创建。 在这两个情况下,所有的中间目录都必须事先存在。 15、恢复本地修改 svn revert: 恢复原始未改变的工作副本文件 (恢复大部份的本地修改)。revert: 用法: revert PATH… 注意: 本子命令不会存取网络,并且会解除冲突的状况。但是它不会恢复 被删除的目录 16、代码 库URL变更 svn switch (sw): 更新工作副本至不同的URL。 用法: 1、switch URL [PATH] 2、switch –relocate FROM TO [PATH…] 1、更新你的工作副本,映射到一个新的URL,其行为跟“svn update”很像,也会将 服务器上文件与本地文件合并。这是将工作副本对应到同一仓库中某个分支或者标记的 2、改写工作副本的URL元数据,以反映单纯的URL上的改变。当仓库的根URL变动 (比如方案名或是主机名称变动),但是工作副本仍旧对映到同一仓库的同一目录时使用 这个命令更新工作副本与仓库的对应关系。 例子:svn switch –relocate http://10.244.6.11/portal http://www.mysvn.com/myportal 17、解决 冲突 svn resolved: 移除工作副本的目录或文件的“冲突”状态。 用法: resolved PATH… 注意: 本子命令不会依语法来解决冲突或是移除冲突标记;它只是移除冲突的 相关文件,然后让 PATH 可以再次提交。 18、输出指定文件或URL的内容。 svn cat 目标[@版本]…如果指定了版本,将从指定的版本开始查找。 svn cat -r PREV filename > filename (PREV 是上一版本,也可以写具体版本号,这样输出结果是可以提交的) 19、 查找工作拷贝中的所有遗留的日志文件,删除进程中的锁 。 当Subversion改变你的工作拷贝(或是.svn 中 的任何信息),它会尽可能的小心,在修改任何事情之前,它把意图写到日志文件中去,然后执行log文件中的命令,然后删掉日志文件,这与分类帐的文件系统 架构类似。如果Subversion的操作中断了(举个例子:进程被杀死了,机器死掉了),日志文件会保存在硬盘上,通过重新执行日志文 件,Subversion可以完成上一次开始的操作,你的工作拷贝可以回到一致的状态。 这就是svn cleanup 所作的:它查找工作拷贝中的所有遗留的日志文件,删除进程中的锁。如果Subversion告诉你工作拷贝中的一部分已经“锁定 ”了,你就需要运行这个命令了。同样,svn status 将会使用L 显示锁定的项目: $ svn status L somedir M somedir/foo.c svncleanup svn status M somedir/foo.c 20、 拷贝用户的一个未被版本化的目录树到版本库。 svn import 命令是拷贝用户的一个未被版本化的目录树到版本库最快的方法,如果需要,它也要建立一些中介文件。 svnadmincreate/usr/local/svn/newrepos svn import mytree file:///usr/local/svn/newrepos/some/project Adding mytree/foo.c Adding mytree/bar.c Adding mytree/subdir Adding mytree/subdir/quux.h Committed revision 1. 在上一个例子里,将会拷贝目录mytree 到版本库的some/project 下: $ svn list file:///usr/local/svn/newrepos/some/project bar.c foo.c subdir/ 注意,在导入之后,原来的目录树并没有 转化成工作拷贝,为了开始工作,你还是需要运行svn checkout 导出一个工作拷贝。 另附:为SVN 加入Email通知 可以通过Subversion的Hook脚本的方式为SVN 加入邮件列表功能 编译安装了Subversion后 在源码的tools 下有一个comm-email.pl的Perl脚本,在你的档案目录下有一个hooks目录,进入到hooks目录把post-commit.tmpl 改名为post-commit并给它可执行的权限。 更改post-commit脚本 把comm-email.pl脚本的决对路径加上,否则 SVN 找不到comm-email.pl REPOS="$1" REV="$2" /usr/local/svn /resp/commit-email.pl "$REPOS" "$REV" email@address1.com email@address2.com #log-commit.py --repository "$REPOS" --revision "$REV" 最后一行是用来记日志的 我不用这个功能 所以注释掉了
-M –metadata name:value 给最顶层测试套件设置metadata (主要体现在测试报告中) a) example: –metadata version:1.2 -G –gettag tag * 给所有执行的测试 case设置给出的tag -t –test name * 根据测试case的名字或全面去选择运行。 a) 名字是大小写和空格不敏感的,同时也可以用* 匹配所有case, ?可以匹配任意字符 b) 如果用 * 和 ?运行, 在控制台是有问题的,请查看 –escape 和 –argumentfile 参数 -s –suite name * 根据选择的case 名字运行测试套件,只有测试case 在对应的测试套件中并且符合筛选标准的,才能和–test, –include 或 – exclude 同时使用时,name 参数和 –test 的name 参数标准类似。也可以使用”.” 这个符号作为父节点名的分隔符: a) 例如:-s X.Y 选择父节点是 X 的 Y 测试套件。 -i –include tag * 根据给出的tag 名去选择运行测试案例。 name 参数和–test 的参数类似。 tag 是大小写和空格不敏感的,它可以使用 “*” 和 “?” 作为通配符。 Tags 和 模式可以用 AND、OR 和 NOT 关键字连接: a) 例如:–include foo –include bar* b) –include fooANDbar* -e –exclude tag * 不运行带这些给出标签的案例。其余规则和 –include 相同 -R –rerunfailed output 从之前失败的输出文件中选择失败的案例重新执行。 a) 选择相同的案例需要用分别单独使用–test 参数 –runfailed output (RF 2.8.4 版本以后已经被–rerunfailed 替代) -c –critical tag * 案例给予Tag被认为是重要的。 如果没有设置重要标签,那么所有的案例都被认为是重要的。 Tag 可以赋予一个模式例如 –include -n –noncritical tag * 被赋予Tag 的案例,被认为是不重要的,即使他被设置了critical 标签。 Tag 可以用模式来表达例如: –include test* -v –variable name:value * 在测试数据中设置变量。 只支持 scalar 变量,变量名不需要带’′.请参考–escape参数去使用特殊字符和–variablefile参数去设置更多功能的变量,同样可以使用list变量。−a)例如:–variablestr:Hello=>{str}=’Hello’ b) -v str:Hello_World -E space:_ =>str=′HelloWorld′−c)−vx:−vy:42=>{x}=”,${y}=’42’ -V –variablefile path * 变量文件的路径: a) 样例文件: b) 等同于: -d –outputdir dir 存放输出文件的路径。默认目录是测试案例执行的目录,给出的目录也是相对于案例执行的目录,除非设置的目录是绝对路径。 -o –output file XML 输出文件,给出路径,和 –log , –report , –xunit , and –debugfile, 相似,基于 –outputdir 的目录,除非给出的是绝对路径。 其他输出文件都是基于案例执行后的xml 输出文件生成的。 XML 输出文件也可以为以后的robot 工具提供数据。可以给出 NONE 字符串禁止这个功能,同时还会禁止 log (日志) 和 report (报告) 功能。 -l –log file HTML 日志文件。 可以给出 NONE 禁止输出,默认输出 log.html a) 例如:–log mylog.html b) -l NONE -r –report file HTML 报告文件。可以赋予 NONE 禁止输出,默认输出:report.html。 类似于 –log 参数。 -x –xunit file xUnite 兼容性 测试文件。 除非特别声明,否则不会被创建。 a) –unitfile file (已经废弃 用 –xunit 代替) b) –xunitskipnoncritical 标记非重要案例在 xUnit 输出结果中跳过。 -b –debugfile file 运行期间的调试文件,除非特别声明,否则不被创建。 -T –timestampoutputs 当使用这个参数时,时间戳格式 ‘YYYYMMDD-hhmmss’ 将被应用于所有输出文件名的基本名和扩展名之间。 a) 例如: -T -o ouputxml -r report.html -l none b) 创建文件:ouput-20161023-121011.xml 和 report-20161023-121012.xml c) –splitlog 分割日志文件成小文件,用浏览器打开更清晰 d) –logtitle title 生成日志的标题。默认标题是测试套件的名字。 所有测试标题中的下划线都被转换成空格。 e) –reportbackgroud colors 测试报告的背景设置。 i. ‘all_passed:critical_passed:failed’ 或者 ‘passed:failed’ 颜色和代码都可以。 例如:–reportbackgroud green:yellow:red –reportbackgroud #00E:#E00 -L –loglevel level 设置日志级别。可用级别:TRACE,DEBUG,INFO (默认级别). WARN,NONE(no loging)。使用语法:LOGLEVEL:DEFAULT a) 例子:–loglevel DEBUG b) –loglevel DEBUG:INFO –suitestatleve level 在日志和测试报告中显示多少层。 默认显示所有层. a) 例子:–suitestatlevel 3 –tagstatinclude tag * 只在测试套件统计和测试细节在日志和报告中显示匹配的TAG。Tag默认在所有测试案例中显示。给出的Tag 可以写成一个简单的模式(参考 –test 例子) –tagstatexclude tag * 只在 按测试套件统计和测试细节的log 和测试报告中不显示匹配的TAG. 这个选项不能和 –tagstatinclude 一起使用,类似 –exclude 和 –include 同时使用。 –tagstatcombine tags:name * 根据tag 创建综合统计,这些统计会被添加到按TAG 统和匹配的测试案例细节中。 如果可选项 name 没有给出,综合统计的名字会从指定的tags 里面获取。 Tags 将结合–include 给出的规则一起使用。 a) 例子: –tagstatcombine requrement-* b) —tagstatcombine tag1ANDtag2:My_name –tagdoc pattern:doc * 为符合条件的tag 添加文档说明。文档会显示在测试细节中,同样也会以 工具提示的形式显示在’Statistics by Tag’ 中。 模式可以包含 * 匹配所有,和’?’ 匹配任意单个字符。 文档可以包含格式,类似于 –doc 选项。 a) 例子: –tagdoc mytag:My_documentation b) –tagdoc regression:*See*_http://info.html c) –tagdoc owner-*:Original_author –tagstatlink pattern:link:title * 在按tag统计中添加额外的连接地址。pattern 可以包含 * 匹配所有 和 ? 匹配任意字符。字符串通配符表达式可以用 %N 这种语法应用在连接 和 标题中。N 是从第几位开始匹配。 在标题中下划线会被自动转换成空格。 a) 例子:–tagstatlink mytag:http://my.domain:Link b) –tagstatlink bug-*:http:/tracker/id=%1:Bug_Tracker –removekeywords all|passed|for|wuks|name: * 从生成的日志文件中移除关键字数据。 关键中如果包含警告则不会被移除,除非选项参数是all . a) all: 从所有关键字中移除数据 b) passed: 从成功的测试案例和套件中移除关键字数据。 c) for: 从for循环成功的迭代中移除关键字数据。 d) wuks: 移除所有处理最后失败的关键字, 包含在’BuiltIn.Wait Until Keyword Succeds’ e) name:: 从符合匹配模式的关键字中移除数据。模式会针对关键字全面做匹配。 i. 例如:’MyLib.Keyword’,’resource.Secdon Keyword’ f) 大小写,空格,下划线不敏感, 可以包含 * 和 ? 作为通配符。 i. 例子:–removekeywords name:Lib.HugeKw ii. –removekeywords name:myresource.* –flattenkeywords for|foritem|name: * Flattens matching keywords in the generated log file. Matching keywords get all log messages from their child keywords and children are discarded otherwise. a) for: flatten for loops fully b) foritem: flatten individual for loop iterations c) name:: flatten matched keywords using same matching rules as with i. ‘–removekeywords name:’ –listener class * 一个用于监视测试执行的类。 获取通知的示例当一个测试案例开始和结束时。监听类的参数可以跟在类名后面,用 ‘:’ 作为分隔符。 a) 例如:–listener MyListenerClass:arg1:arg2 –warnonskippedfiles 如果使用了该选项,跳过的测试数据文件会在控制台和日志文件中产生一个可见 的警告信息。默认的跳过的文件只会产生一个信息基本的系统日志信息。 –nostatusrc 设置返回码为0 不管测试案例中的失败。错误码正常返回。 –runemptysuite 如果顶层测试套件为空也同样执行。如果和–include/–exclude 一起使用时,如果没有匹配的测试案例,这种场景下很有用。 –dryrun 验证测试数据并且执行测试,以便测试库关键字不执行。 –exitonfailure 任何 critical 基本的案例失败,停止测试。 –exitonerror 当发生任何错误就停止测试 –skipteardownonexit 如果测试执行暂停,就跳过teardown 退出。 –randomize all|suites|tests|none 随机执行。 a) all: 随机执行测试套件和测试案例。 b) suites: 随机执行测试套件 c) tests: 随机执行测试案例。 d) none: 不随机执行,默认。 e) 使用语法 ‘VALUE:SEED’ 赋予一个用户随机种子,必须是整数。 i. –randomize all ii. –randomize tesets:1234 –runmode mode * 2.8版本已经废弃,请分别独立使用:–dryrun, –exitonfailure,–skipteardownonexit, 或者 –randomize 选项代替。 -W –monitorwidth chars 监视器的输出宽度。 默认是 78 -C –monitorcolors auto|on|ansi|off 在控制台使用颜色输出。 a) auto: 当输出没有重定向时使用颜色输出。 b) on: 总是使用颜色。 c) ansi: 想on 参数一样,但是在windows 使用ANSI 颜色。 d) off: 禁止颜色 e) 注意Jpython 在windows 不显示颜色。 -K –monitormarkers auto|on|off 当顶层关键字在测试案例中结束时,在控制台显示 ‘.’ 成功 或 ‘F’ 失败。 和–monitorcolors 参数的用法一直。 -P –pythonpath path * 添加额外的路径(directories,ZIPs,JARs)去搜索测试库当他们被导入时。多个路径可以用: 做分隔符。 a) 例子:–pythonpath libs/ b) –pythonpath /opt/testlibs:mylibs.zip:yourlib c) -E star:STAR -P lib/STAR.jra -P mylib.jar -E –escape what:with * 在控制台有问题的转移字符。 a) what 代表转移字符的名字,with 是要转移成的字符 b) 需要谨慎选择和使用转移字符。 c) amp <&>,apos<’>,at<@>,bslash<>,colon<:>,comma<,>,curly1<{>,curly2<}>,dollar
开始学习jmeter的使用,以后会一步步的写出来,记录自己的成长之路,也希望对跟我一样初学者有些帮助。 温馨提示:默认在window环境下,jmeter GUI可视窗口 第一步、官方下载jmeter并解压,点击下载 第二步、检查Java环境,建议安装jdk1.7或更高版本 第三步、找到bin目录下的jmeter.bat,双击打开可视GUI界面 第四步、编写demo脚本 访问我的博客:http://blog.csdn.net/huashao0602 1、添加线程组 线程数:虚拟用户数,一个虚拟用户占用一个进程或线程。设置多少虚拟用户数在这里也就是设置多少个线程数 Ramp-Up Period(in seconds):设置的虚拟用户数需要多长时间全部启动。如果线程数为10 ,Ramp-Up Period为100,那么就是100秒钟内启动10个线程。每一个线程都会在上一个线程启动10秒钟后才开始运行;设置为0则表示同时启动(注:Ramp-Up Period(in secods)不能设置太小的数值,否则会一开始就给服务器过大的压力;也不能设置太大的数值,否则第一个线程已经执行完了,最后一个还没启动的情况)刚开始Ramp-Up值可以等于总线程数,之后再作调整 循环次数:每个线程发送请求的次数,如果线程数为20 ,循环次数为100 ,那么每个线程发送100次请求。总请求数为20*100=2000 。如果勾选了“永远”,那么所有线程会一直发送请求,一到选择停止运行脚本。 启动时间:线程运行的起始时间 结束时间:线程运行的结束时间 持续时间:设置了持续时间则启动时间会失效 启动延迟:设置了启动延迟则结束时间会失效 线程数1000循环1次与线程数10循环100次的区别:线程数1000循环1次可以选择并发;线程数10循环100次是类似于长时间施加压力 2、添加HTTP请求并设置 网址中域名后面没有端口时,使用的是默认端口:http 默认端口80,https默认端口443 (端口号参数,不填为默认端口) 3、添加http信息头管理器并设置 csdn只接受浏览器发的请求,所以要用到浏览器头信息( 不加这个头,csdn返回403的哦,响应被拒) 下面是pythom脚本里常用的,你可以选择一个拷贝过去 my_headers = [ 'Mozilla/5.0 (Windows NT 5.2) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.122 Safari/534.30', 'Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0', 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET4.0E; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C)', 'Opera/9.80 (Windows NT 5.1; U; zh-cn) Presto/2.9.168 Version/11.50', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1', 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET4.0E; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C)'] header = {"User-Agent": random.choice(my_headers)} 4、添加查看结果树 点击查看结果 1. html响应可以选择html格式,响应数据可视化了(调试必备组件) 2.正式测试的时候请勾选仅日志错误,仅记录出错的请求,以免保存多了,jmeter jvm oom(内存溢出),这点要谨记 5、添加聚合报告 tps(吞吐量)表征系统性能,系统的好坏可以用这个评估 90%Line是满足需求响应时间的重要指标,如果用户需求说是响应时间不小于5s,那么这个5秒就是90%Line(并非平均响应时间哦)(要求高的系统,可以选择95%Line【其余5%高响应时间可以理解为小概率事件,一般用户不容易触发】) 个人心得:学东西别管后面要用到什么技术之类的,拿起来就是干,等需要的时候学就是
突然又看了王帆的演讲,“不要等到来不及了,不要等到没有机会了。就像所有的父母都不愿意缺席孩子的成长,我们也不应该缺席他们的衰老。”一直自诩理性的自己,却被狠狠的击中了心底的软弱。 做一个怎样的子女 我是一个80后,顾名思义,80后就是指1980年到1989年出生的人。但是在中国,我们80后还有一层比较特殊的含义,它其实是指在上世纪八十年代初中国正式实施计划生育政策之后出生的第一代独生子女。 我们一出生,就得了一个国家级证书,叫独生子女证。这个证可以保证我们能够独享父母的宠爱,但是这个证,也要求我们要承担赡养父母的全部责任。最开始我是觉得,如果想做一个好女儿,那我肯定得掐很多的钱,然后让我爸妈过上特别好的生活。 我从上大学开始就经济独立,我所有的假期都在工作,所以我的父母几乎一整年都见不到我两次。对于很多像我这样在外求学工作打拼的独生子女来说,咱们的父母都变成了空巢老人。有一天,我妈给我打电话说,早上你爸坐在床边,在那掉眼泪,说想女儿了。你知道我当时第一反应是什么吗?哟,至于吗?您这大老爷们还玻璃心哪,天天给自己加戏在那。 但是后来有一次我回家,那个下午,我永远记得。老爸侧坐在窗前,虽然依旧虎背熊腰,但腰板没以前直了,头发也没以前挺了,他摆弄着窗台上的花儿说了一句:“爸爸没有妈妈了。”爸爸没有妈妈了,大家觉得这句话在表达什么?悲伤?软弱?求呵护?我只记得我小时候如果梦到我妈妈不要我了,我就会哭醒,我特别难过,但我从来都没有想过:爸爸没有妈妈了是一种什么样的感觉呢?我发现这个在我印象当中无比坚不可摧高大威猛的男人,突然间老了。 爸爸没有妈妈了,表达的不是悲伤,也不是软弱,而是依赖。父母其实是我们每个人最大的依赖,而当我们的父母失去了他们的父母,他们还能依赖谁呢?所以在那一刻我才意识到,父母比任何时候都需要我,而且他们后半辈子能依赖的只有我。 我得养他陪他,把我所有的爱都给他,就像他一直对我那样,我要让他知道,即使你没有妈妈了,你还有我。所以从那以后,我愿意适当地推掉一些工作、聚会,我挤时间多回家,我陪他们去旅行而不再是把钱交到旅行社,让别人带他们去吧。因为我明白了一点,赡养父母,绝对不是把钱给父母让他们独自去面对生活,而应该是我们参与他们的生活,我们陪伴他们享受生活。 所以,我每次回家,就会带我妈去洗浴中心享受一把。有一次我正给我妈吹头发,旁边一位阿姨说:“你女儿真孝顺。”我妈说:“大家都说女儿是小棉袄,我女儿羽绒服!”幸亏没说军大衣。那阿姨说:“我儿子也特孝顺,在美国,每年都回来带我们去旅游。”说着吧阿姨还把手机掏出来了,给我妈看照片,说你看我儿子多帅,一米八五大个,年薪也好几十万。 我当时有点觉得话锋不对,为什么呢?当一位阿姨向你的妈妈展示他儿子的照片,并且报上了身高体重年薪的时候,笑的都是相过亲的,你懂的。就在这个时候,阿姨说了一句让我们全场人都傻了的话,她说,可惜不在了,不在了。原来就在去年,阿姨唯一的儿子在拉着他们老两口在旅行的高速公路上,车祸身亡。 在那一刻,我真的不知道说什么去安慰那位阿姨,我就想伸出手去抱抱她。可当我伸出手的那一刻,阿姨的眼泪就开始哗哗地往下流。我抱着她,我能感受到她那种身体的颤抖,我也能够感受到她是多么希望有个孩子能抱一抱她。也就是从那一刻我特别地害怕,我不是害怕父母离开我,我怕我会离开他们。而且经过这件事,我对于一句话的理解有了更深入的这样的感觉,叫做“身体发肤受之父母,不敢毁伤”,原来我只觉得这句话应该是我应该珍惜自己的身体,珍惜自己的生命,别让爸妈担心,对吧?但是现在我发现,不仅如此,我们对待别人,也要这样。 因为每一个人,都意味着一个家! 所以我现在每一次在跟父母的时候,我都会紧紧地抱抱他们,在他们脸上亲一下。可能像拥抱亲吻这种事,对于我们大多数中国父母来讲都一开始是拒绝的,但是请大家相信我,只要你坚持去做,你用力地把她搂过来,你狠狠地在她脸上亲一下,慢慢地她就会习惯。像我现在走的时候,我妈就自然地把脸送过来。这样他们就会知道,你在表达爱。 我想作为独生子女,我们确实承担着赡养父母的全部压力,但是我们的父母承担着世界上最大的风险,可是他们从不言说,也不展现自己的脆弱。你打电话他们说家里一切都好的时候他们真的好吗? 作为子女,我们要善于看穿父母的坚强,这件事越早越好,不要等到来不及了,也不要等到没有机会了,就像所有的父母都不愿意缺席子女的成长,我们也不应该缺席他们的衰老。 龙应台有一篇《目送》,她在结尾告诉我们,不必追。可是今天我想告诉大家,我们就得追,而且我们要从今天开始追!提早追!大步追!至亲至情,不应该是看着彼此渐行渐远的背影,而应该是你养我长大,我陪你变老。
读写配置文件在实际应用中具有十分强大的功能,python 读写配置文件ConfigParser模块是python自带的读取配置文件的模块.通过他可以方便的读取配置文件。 比如配置文件内容如下: [EMAIL] mail_host = smtp.exmail.qq.com mail_user = xiaoxi@xyd.cn 其中[ ] 中的EMAIL是这段配置的名字下面mail_host ,mail_user 都是属性 python主要代码: import ConfigParser config=ConfigParser.ConfigParser() with codecs.open('config.ini','w') as conf: config.readfp(conf) #读取配置信息 mail_host =config.get('EMAIL','mail_host') mail_user =config.get('EMAIL','mail_user') print mail_host print mail_user #写入配置信息 config.set('EMAIL','mail_pass','male') config.set('EMAIL','mail_port','25') 也可以自己封装一下,怎么简便怎么来嘛 配置文件: python脚本:
下载地址: https://github.com/serhatbolsu/robotframework-appiumlibrary 或者appiumlibrary下载(这个是我上传的,建议去官网下载最新版本) 与其他安装库一样,cmd到appiumlibrary目录下,运行命令:python setup.py install进行安装 验证如下: Android环境搭建 1、JDK安装 网上下载最新的JDK安装包,并配置环境变量: 添加JAVA_HOME变量,值:Jdk的安装路径,如:D:\Java\jdk1.8 添加CLASSPATH变量: .;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar 修改path变量: %JAVA_HOME%\bin; 检查JAVA环境是否配置好,进入CMD命令行,输入java或javac,可以看到好多的命令提示,说明成功了。 2、ADT安装 下载:可搜索android-sdk-windows,下载后解压即可, 环境变量配置:设置ANDROID_HOME 系统变量为你的 Android SDK 路径,并把tools和platform-tools两 个目录加入到系统的 Path路径里。 ANDROID_HOME 值: D:\AutoTest\adt\sdk 设置Path值: %ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools 3、配置虚拟机 推荐用 genymottion,还是比较好用的,速度比较快,也可以用真机进行测试 appium的安装 有两种方法,一种在线安装,一种是下载客户端 1、在线安装 安装Node.js,默认或者自定义安装都可以 安装结束后进入cmd,输入node -v查看版本号验证是否安装成功 然后输入npm install -g appium 或者 npm –registry http://registry.cnpmjs.org install -g appium (推荐这种,npm的国内镜像) cmd里输入appium,提示Welcome to appium说明安装成功 检查appium所需的环境是否OK(这步很重要) 进入Cmd命令行,输入appium-doctor ,出现以下提示,All Checks were successful ,说明环境成功。 2、下载客户端 可以去appium官网下载 Appium官网http://appium.io/ 去官网下载Windows服务端 https://bitbucket.org/appium/appium.app/downloads/ 解压安装包即可使用 3、安装appium-python-client:(这步很重要) pip install Appium-Python-Client 启动appium—启动模拟器或者连上真机—启动RF RF脚本如下 Open Application http://localhost:4723/wd/hub platformName=Android ... platformVersion=5.1.1 deviceName=8a604f0e app=${CURDIR}${/}123.apk ... appWaitActivity=com.xyd.raincredit.view.activity.sys.StartGuidActivity ... unicodeKeyboard=true resetKeyboard=true python脚本: des = {} des['platformName'] = 'Android' des['platformVersion'] = '5.1.1' des['deviceName'] = '8a604f0e' des['app'] = "d:\\TEST-DEMO\\666.apk" des['unicodeKeyboard'] = 'true' des['resetKeyboard'] = 'true' des['automationName'] = 'appium' options = {} options['androidProcess']="com.tencent.mm:appbrand1" des['ChromeOptions.CAPABILITY']=options driver = webdriver.Remote('http://localhost:4723/wd/hub', des) time.sleep(8) driver.swipe(1000, 1000, 300, 1000, 1000)
学习做自动化的同学一开始都是偏向于UI自动化,自己这些时间也写过很多:python的,Java的,以及RF关键字驱动的。。。 今天就说下UI自动化的一些东西吧,希望对大家有些帮助,少走些弯路。 测试生命中三大幻觉: 今天能发布 明天能发布 UI自动化实现了,测试就可以不用测了 正是第三点赋予了UI自动化测试错误的价值。让UI自动化测试验证UI, 利用图片比较去做自动验证,甚至利用截图定位按钮。真是找死的节奏呀。 UI自动化应该做的事情是什么呢? 1. 验证逻辑而非UI UI的验证会引入大量的不稳定因素。换句话说,像当年的测试大牛段念说的,你跑过了UI自动化,你就相信没问题了吗?不会相信,原因是啥?因为聪明的你会发现,你验证的东西越多,例如界面的每个按钮,颜色,排布,互联网应用变化最大的就是UI, 你的用例就越不稳定,所以你最终肯定不会验证全部UI。那结果就是”然并卵”了, 你根本不会相信这个用例真的通过了。因此给大家定个UI自动化能做的,验证逻辑(另外一种说法,说这种叫功能自动化)。什么叫验证逻辑?例如验证qq是否登录成功,验证到了好友列表,就是登录成功,甚至有登录成功的日志都可以,怎么稳定怎么行。 2. 代替大量的UI重复操作 简单来说就是UI自动化你要投入5元,只是执行4次,每次赚5毛的话,那你还亏3元的问题。什么时候会大量呢?像手机apk, 编译百个市场的包,每个包要验证核心功能。或者像性能UI自动化监控,同一个用例为了多次采样,也会执行多次。还有每日构建,集成,都可以。关键点就是用次数来增加价值,UI自动化能帮你确保不出死人的问题,如登录不了,登录了又卡死,或者是监控UI之外的其他,如性能。这些都有机会让其价值高于成本的。 最大难点:维护 无间道: 出来混,迟早要还的。 这句话,最好用来说明,为什么自动化测试构造得越快越随便,未来的维护成本也就越大。更甚者,脚本依赖录制得来的,这是找死的节奏。 无数的故事告诉我,很多UI自动化都是死在一开始就写或者录一堆脚本,结果每天都要花大量时间排查错误,错误有脚本错误,有功能的变更,有bug,甚至问题是随机出现的,但是无论你的问题或者是功能的问题,反正你排查错误的时间是花进去了,哪怕你不用改脚本。 所以这里看来,要解决维护的难点,终极招数就是不要碰UI自动化。其实很多大牛都是说不要做UI自动化的,或者这个事情不是最高优先级,但是现实是,大家都做了,优先级还不低。所以当然不说不做了,要做就只能要狠狠地干一场,要成功,不要失败。 记得有句话是这样的:如果你不喜欢做一件事,那么就去努力的做好它。下面给大家有两点建议,一是策略,二是技术。 策略上:维护成本的控制,脚本要慢慢上,先做核心的BVT,人均维护的脚本1~2个,定目标,如稳定运营1个月,后面增加的脚本要在测试环境稳定跑上一周,才能切换到正式环境。 组织培训,知识分享,分享写自动化遇到的坑,沉淀最佳的实践,让大家知道写UI自动化也是在自我提升,而不是简单的工作任务。 技术上:降低维护成本的方法如下 脚本里不要有坐标,图像识别这些,想都别想,想都别想,想都别想!这些都是不稳定的因素。 脚本里不要有sleep。sleep就是UI自动化的稳定性的克星,绝对不能有。一方面,如果帮助建立或者直接使用UI自动化测试等待界面稳定的阻塞方法,例如waitForIdle,等待控件出现和消失的方法,如waitForInvisiable之类的。另外一种,就是封装一个timeout的类,里面包含重试和sleep的策略,让脚本直接使用。反正,不要单单看到sleep。 要用脚本要基于面向对象。脚本不需要编译,调试方便,学习门槛低,像python,能使用的库也丰富。所以自动化测试最佳的使用Python,再配合pydev、pycharm,用起来还是很舒服的。而说到面向对象,它有个作用,就是通过隔离变化来提升代码的可维护性。说多了,可能你都不明白, 我举个例子来说说, 用了面向对象的UI自动化脚本的样子(python的哈)。 app = Application("XYD") loginPanel = app.launch() buddylistPanel = loginPanel.login("18223292304","123456") aioPanel = buddylistPanel.findAndOpenAIO("18223292304") aioPanel.sendMsg("hi") 好,这个伪脚本,有什么特点呢?对,没有见到控件。控件要封装到界面类里面(RF所说的关键字)。具体一下说,自动化脚本的隔离变化基本上可以分四个层次: a. 用例逻辑,通常有个用于继承的TestCaseBase, 用来封装用例的逻辑,类似teardown, setup,run之类。 b. 业务逻辑,通常就是继承TestCaseBase,用例实现的本身。封装业务逻辑的变化。 c. 界面逻辑,通常就是界面类,例如上面的LoginPanel。隔离了控件与业务逻辑,让控件位置,ID的变化,可以控制在界面类中。 d. 控件驱动,通常就是基本的获取控件树,检索控件。封装控件获取方式。 控件定位要用类似XPath的方式。这种方式的好处就是方便阅读,把复杂的位置描述封装到一条短短的字符串里面了。(有些朋友误会了,是XPATH,是类似XPATH的东西,但是要把他比较复杂的部分去掉,只支持属性,节点的简单定位就行。不然跟正则表达式一样,又是一对学习成本了) 通过分Step的脚本化繁为简。UI自动化脚本都有个特色。长~!一个脚本通常我们希望验证好几点,登录,打开聊天窗口就不容易了,因此除了验证发消息,我们还希望可以发图,发表情,那么这个时候,最好可以把用例分割成几个Step。出了问题,就集中排查某个Step的日志就OK了。补充一下,大家肯定想个一个问题,每个用例都要独立的,要互不影响,重新登录,为了稳定,多补点时间我不在意,但是现实你有发现这些时间会增加用例出错之后的修复,验证的时间成本。所以“分Step”无疑意思是给大家一个合并用例来提升用例执行速度,但是又不影响用例与用例之间的独立性。这个也是为什么我提出数据分离,模块化脚本的原因,可能一开始大家会很痛苦,越写就会发现越简单。。。 不要再给UI操作/验证本身压力了。例如输入文本这些操作,也没有必要用键盘事件来触发,如果你是注入方式的,获取到控件对象,直接setText吧,这样会稳定很多。还有端到端的UI自动化,如QQ发消息到另外一端的QQ的测试,我们就可以利用网络协议,发送消息,另外一端用UI验证接收消息。 定时重启手机和电脑,出错的用例再跑一次,可能会帮助回避一些问题,可以做,但是不能以此来麻木自己对错误的敏感的感觉。 稳定你的环境,这些环境包括网络,系统,账号资源,电脑/手机。 a.网络, 假如我们的UI自动化是验证功能逻辑的,那网络就一定要被牢牢地控制,独立的路由器,并且监控着网络情况,如果存在严重的丢包和断连,这信息一定要及时同步出来,甚至可以自动控制你的用例,在网络差时暂停,网络回复后再跑。 b. 系统, 系统经常有各种更新的弹窗,特别是IOS。利用网络,屏蔽这些无用的推送把。android则是找个稳定的ROM。 c. 账号资源,有很多软件账号资源都是不能重用的,或者重用了之后,用例之间会相互影响。这里需要有账号资源池的概念,类似SVN, 通过CGI, 来取了资源,可以加锁,还回去,再解锁。 d. 手机与电脑,肯定不能长时间运行,不然他们也会发脾气。所以定期重启手机和电脑,似乎是必不可少的一步。 UI自动化测试的未来 有很多人问, UI自动化应不应该投入,有没有前途?这个问题没有绝对的,要看项目的类型,像做Android手机的,因为项目相对来说比较稳定,CTS本身就有一定的用例量,几千个UI自动化测试,都能维护过来,而且通过率极高。做前端应用的,像我们PC QQ,开发在控件唯一标识的问题上,给予了不少支持,因此用例的量和稳定性也是非常高。说虚一点的,如果这个事情至上而下都是支持的,想做的,投入的方向没有错,价值认识正确,肯定是有积极的产出的。另外,UI自动化是测试生来无法回避的一种能力,可以不依赖他,但是你需要他。 That’s all: UI自动化是一种能力,常常无法回避。 UI自动化会给人幻觉,要看清现实与价值。 UI自动化最适合一句话,喜欢是放肆,爱是克制。而克制是UI自动化能发挥作用的关键。
if isinstance(item, (list, dict, tuple)): item = json.dumps(item, ensure_ascii=False, encoding='cp936') except UnicodeDecodeError: item = json.dumps(item, ensure_ascii=False, encoding='cp936') except: except: 扩展:其中的cp936可用utf-8或者gbk编码格式去替换 也可以下载unic.py文件替换掉 下载地址:unic.py 修改后运行脚本显示结果如下:
上次解决了python中文用户名的问题,最近用RF发现也有这个问题,报UTF-8的错误 错误日志: 1、首先创建c:\Robotframework\temp\文件夹(也可以是其他非中文的文件夹路径,在脚本对应的地方修改即可) 在python-path\Lib\site-packages\robotide\contrib\testrunner\目录下的testrunner.py中添加指定的temp路径 def _create_temporary_directory(self): self._output_dir = tempfile.mkdtemp(".d", "RIDE","c:\\Robotframework\\temp") atexit.register(self._remove_temporary_directory) 默认路径是windows用户目录下,当用户名为中文时就会出现编码错误,这里直接把它指向了新建的文件夹就可以了
System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "") 点击运行就可以解决,但是jenkins重启的话这个就需要再次输入 2、 彻底解决方案 方法一:在之前的启动方式:java -jar jenkins.war,现在需要加上一些参数 windows系统: java -Dhudson.model.DirectoryBrowserSupport.CSP= -jar jenkins.war mac和linux: nohup java -Dhudson.model.DirectoryBrowserSupport.CSP= -jar jenkins.war & 用了nohup,这样不用担心进程窗口关闭Jenkins也关闭的问题。 修改jenkins.xml如下 <arguments>-Xrs -Xmx256m -Dhudson.model.DirectoryBrowserSupport.CSP= -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar "%BASE%\jenkins.war" --httpPort=8080 --webroot="%BASE%\war"</arguments>setuptools下载地址:https://pypi.python.org/pypi/setuptools pip下载地址:https://pypi.python.org/pypi/pip 先安装setuptools,再安装pip,安装方法就是到解压文件夹下执行命令 python setup.py install 安装成功后,打开cmd输入pip,点击回车,就可以看到pip的相关命令和解释 pip list :查看安装库列表 pip9.0以上版本会出现这个红色的信息,这个不是错误,可以不用理会,你也可以按照提示加入–format=legacy或者–format=columns,两者只是显示不同,如下: pip install XXX:安装库 pip uninstall XXX:卸载库 pip list –outdated:查看可更新库列表 pip install -U XXX 或者 pip install –update XXX:更新库 pip search XXX:查找库 pip show XXX:显示库信息 指定下载源 很多时候用pip 联网install 库的时候会安装不成功,这个时候需要用-i指定国内的下载源 pip install xlrd -i https://pypi.douban.com/simple/ 目前国内好用的下载源有: http://pypi.v2ex.com/simple/ http://pypi.douban.com/simple/ https://pypi.tuna.tsinghua.edu.cn/simple http://mirrors.aliyun.com/pypi/simple/
最近搭建python环境时遇到:UnicodeDecodeError: ascii codec can t decode byte 0xe0 …这个错误, 究其原因是因为用了电脑设置用户的时候设置了中文名称 解决方法如下: 修改ntpath.py文件中的编码方式 路径:C:\Python27\Lib\ntpath.py (”C:\Python27\“为python的安装路径) 添加编码方式: import sys reload(sys) sys.setdefaultencoding('cp936') 如果其他库报这个错误,也可以在相应的py文件中添加这个方法
进入节点管理界面:系统管理–》管理节点 点击新建节点进入节点配置页 节点名称:建议使用字母、数字或字母和数字的组合。最好见名知意。不建议使用标点符号和中文(中文命名没有问题,但Job中无法引用) 下一步配置 of executors:最大同时构建数量(根据机器的性能定,单颗四核cpu建议不要超过5)【必须为数字】 Remote FS root(远程工作目录):如果目录不存在,会自动创建目录。你必须对该目录有读写权限,不然会报错:hudson.util.IOException2: Failed to copy xxxx Launch method(启动方法):运行方式有四个选项。建议选择第1、2种方式配置。详细如下: 1、【推荐】Launch slave agents on Unix machines via SSH 在Unix(包括Linux)机器上通过SSH通道连接节点 (适用于Unix和Linux) Host:节点主机的ip地址 Credentials:凭据(如果为空或者不可选择,请在系统管理→Manage Credentials中配置。Manage Credentials的配置非常简单,这里就不在描述了。Manage Credentials配置完成后,需刷新节点配置页面才会显示。) Port:端口默认22 JavaPath:[可选]JDK路径,默认和master节点相同。路径必须指定到Java程序,如:/path/bin/java JVM Options:[可选]JVM可选参数 Prefix Start Slave Command:[可选]不知道干什么用的参数 Suffix Start Slave Command:[可选]不知道干什么用的参数 测试可以使用Unix命令,会自动拼接在[SSH] Starting slave process:[Prefix Start Slave Command] cd ‘/path’ && /path/bin/java -jar slave.jar [Suffix Start Slave Command] 2、【推荐】Launch slave agents via Java Web Start 通过Java Web Start连接节点 (适用于所有支持Java程序的系统) Tunnel connection through:[可选]在端口转发这种情况下使用 JVM options:[可选]JVM可选参数 这种方法的缺点:如果该节点宕机了,主节点无法自动重启它。 注意:如果找不到该选项,请参考最后的问题解决方法 3、Launch slave via execution of command on the Master 通过主节点的控制台连接节点 在写内容前吐槽一下Jenkins的帮助,说的云里雾里的。应该去看该选项下Launch command的帮助。 Jenkins的开发者考虑到某些企业可能有N++ 个节点(N>=你猜!)。如果在界面配置,那么升级版本之类的操作会很麻烦。所以允许你使用shell脚本去配置管理节点(貌似很方便的样子)。具体的脚本需要你自己写。 Launch command:Unix运行脚本的命令,如:sh aaa.sh 4、【不建议使用】Let Jenkins control this Windows slave as a Windows service 让Jenkins节点添加到Windows服务中 这个选项比Launch slave agents via Java Web Start添加为服务更加稳定(帮助文档是这么说的)。采用这种运行方式,那么这个系统不能登录任何用户。这种配置方式是非常的麻烦和折腾。具体请查看 点我去看帮助 Administrator user name:域\管理员账号 Password:密码 Host:节点主机IP或者域名 Run service as: Use Local System User:使用本地系统用户 Log on using a different account:使用不同的用户登录 User name:账号 Password:密码 Use Administrator account given above:使用上面的用户登录 Path to java executable:[可选]JDK路径。必须指定到Java程序,如:C:\Windows\system32\java.exe JVM options:[可选]JVM可选参数 Availability: 1、Keep this slave on-line as much as possible:尽可能保持节点在线【推荐】 2、Take this slave on-line according to a schedule:根据时间表在线(类似于Linux的定时任务) Startup Schedule:类似于Linux定时任务的时间,如下: # every fifteen minutes (perhaps at :07, :22, :37, :52) H/15 * * * * # every ten minutes in the first half of every hour (three times, perhaps at :04, :14, :24) H(0-29)/10 * * * * # once every two hours every weekday (perhaps at 10:38 AM, 12:38 PM, 2:38 PM, 4:38 PM) H 9-16/2 * * 1-5 # once a day on the 1st and 15th of every month except December H H 1,15 1-11 * 如果使用 H Jenkins会自动提前一段时间连接节点,避免出现同一时间高并发的问题 Scheduled Uptime:超过任务时间后延迟多少分钟离线。如果此数值大于在线总时间(单位:分),就会一直保持在线【必须为数字】 Keep on-line while jobs are running:当有Job在构建时(到达离线时间了)继续保持在线 3、Take this slave on-line when in demand and off-line when idle:让Jenkins根据需求自动连接或者离线 In demand delay:告诉Jenkins如果有Job需要在此节点构建,需要在任务队列等待多长时间才会进入任务状态进行构建【必须为数字】 Idle delay:告诉Jenkins多少分钟内如果没有Job需要构建就离线【必须为数字】 可以配置JDK、GIT等工具列表 节点的配置完成后,点击Save保存。进入节点的连接: 1、Launch slave agents on Unix machines via SSH点击保存后会自动连接。 2、Launch slave agents via Java Web Start 有两种连接方式: Launch agent from browser 载文件slave-agent.jnlp文件,双击打开。一般用在Windows系统上,需要javaws.exe(在Java的bin目录中可以找到)程序才能打开。如果提示错误,请卸载JDK后重新安装。成功启动如下图所示: 点击左上角的File选择Install as a service就可以添加为Windows的服务了(默认开机自动启动)。 Run from agent command line 下载slave.jar到本地,然后进入存放slave.jar的目录,打开cmd,复制粘贴并运行 java -jar slave.jar -jnlpUrl http://xxxxx 即可启动。通常直接把slave.jar文件放到C:\Users\Administrator用户目录下面,这样打开cmd就可以执行了 1、找不到Launch slave agents via Java Web Start 这个选项 点击系统管理—>Configure Global Security 把禁用换成随机选取或者指定端口就可以 2、两种连接方式的区别: slave-agent.jnlp,slave.jar slave-agent.jnlp:后台运行 slave.jar:可显示#yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker 2、下载并编译git 下载、解压 # wget https://www.kernel.org/pub/software/scm/git/git-1.8.3.1.tar.gz # tar xzf git-1.8.3.1.tar.gz 编译并验证 #cd git-1.8.3.1 # make prefix=/usr/local/git all # make prefix=/usr/local/git install # echo "export PATH=$PATH:/usr/local/git/bin" >>/etc/bashrc # source /etc/bashrc # git --version 生成公钥并配置到git服务器上 生成公钥方法 登录git服务器,点击setting 然后选择模块加入公钥 测试是否能正常clone项目 # git clone git@git.jjhh.com:/data/git/project.git jenkins配置Git Plugin 1、安装插件Git Plugin 2、配置git路径(刚linux上安装的git客户端路径) 点击系统设置,选择 配置git job中配置git插件 1、如果提示没有git命令则需要配置环境,可以把jenkins环境和linux环境的同步一下: linux下运行:# echo $PATH 拷贝到jenkins系统变量下 2、git没有权限 把私钥拷贝到git配置中
# wget https://www.python.org/ftp/python/2.7.10/Python-2.7.10.tgz --no-check-certificate 2、安装python # tar zxvf Python-2.7.10.tgz 在编译前先建一个文件夹python27(作为Python的安装路径,以免覆盖老的版本) # mkdir /usr/local/python27 在解压缩后的目录下编译安装 # ./configure --prefix=/usr/local/python27 # make altinstall # ./configure --prefix=/usr/local/python2.7.10 # make && make install 此时没有覆盖老版本,再将原来/usr/bin/python链接改为别的名字 # mv /usr/bin/python /usr/bin/python_old 再建立新版本python的链接 ln -s /usr/local/python27/bin/python2.X /usr/bin/python 注意:2.x改为自己安装的python版本 3、验证版本 查看python版本信息 # python --version
#ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): (直接回车) Enter passphrase (empty for no passphrase): (直接回车) Enter same passphrase again: (直接回车) Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: 06:96:6b:56:0c:33:a4:24:16:8c:06:35:9b:98:8b:e7 root@localhost.localdomain 2、在root/.ssh目录下生成密钥对 id_rsa和id_rsa.pub 其中id_rsa是私钥,id_rsa.pub是公钥。 3、将公钥直接copy到10的/root/.ssh目录下 #scp id_rsa.pub root@192.168.1.10:/root/.ssh 4、将10机器上的id_rsa.pub改名为authorized_keys #cd /root/.ssh #mv id_rsa.pub authorized_keys 5、密钥设置成功。5ssh访问10无需密码成功 #ssh 192.168.1.10
Builtin:包含经常需要的关键字。自动导入无需import,因此总是可用的 Dialogs:提供了暂停测试执行和从用户的输入方式。 Collections:提供一组关键词处理Python列表和字典。 OperatingSystem:允许执行各种操作系统相关的任务。允许执行各种操作系统相关的任务,使各种操作系统相关的任务在robotframework正在运行的系统中执行。 Remote:远程库接口的一部分。没有自己的任何关键字,作为robotframework和测试库之间的代理的特殊库。实际测试库可以在不同的机器上运行,可以使用任何编程语言支持XML-RPC协议的实现。 Screenshot:提供关键字来捕获和存储桌面的截图。 String:用于处理字符串并验证它们的内容的库,用于生成、修改和验证字符串 Telnet:支持连接到Telnet服务器上打开的连接执行命令。 XML:用于生成、修改和验证XML文件的库。 Process:系统中运行过程的库。 DateTime:日期和时间转换的库,支持创建和验证日期和时间值以及它们之间的计算 Robot Framework需要下载安装后才能使用的库,包括: Android library:所有android自动化需要的测试库,内部使用的是Calabash Android iOS library:所有iOS自动化需要的测试库,内部使用Calabash iOS服务 appiumlibrary:Android和iOS测试库,内部使用的是appium HTTP library (livetest):内部使用LiveTest工具的HTTP测试的库。 HTTP library (Requests):内部使用request工具的HTTP测试的库。 MongoDB library:使用pymongo和MongoDB交互的库。(MongoDB是一个基于分布式文件存储的数据库) Database Library (Java):基于Java的数据库测试库。也可使用Jython和Maven central. Database Library (Python):基于Python数据库测试库。支持任何Python解释器,包括Jython。 watir-robot:使用Watir的工具的Web测试库。 seleniumlibrary:Web测试库,内部使用比较流行的selenium工具。利用早期的selenium1.0和本身已经过时。 selenium2library:使用selenium2的Web测试库。替换了大部分老的seleniumlibrary。 selenium2library java:selenium2library的java接口 Django Library:为Django的库,一个Python Web框架。 sudslibrary:一种基于泡沫基于SOAP的Web服务的功能测试库,动态的SOAP 1.1的客户端。 Archive library:处理.zip和.tar压缩包的库。 Diff Library:比较两个文件的库。 FTP library:Robot Framework上测试和使用FTP服务的库。 SSHLibrary:通过SSH连接的在远程机器上执行命令。还支持使用SFTP进行文件传输 rammbock:通用的网络协议测试库;提供简单的方法来指定网络数据包,并检查发送和接收数据包的结果。 imagehorizonlibrary:跨平台、基于图像识别的GUI自动化纯Python库。 autoitlibrary:Windows的GUI测试库,使用AutoIt的免费工具作为驱动。 Eclipse Library:使用SWT窗口小部件测试Eclipse RCP应用程序的库。 robotframework-faker:一个服务faker的库,faker的测试数据生成器。 swinglibrary:用Swing GUI测试java应用程序库 remoteswinglibrary:使用swinglibrary库测试和连接一个java进程,尤其是java web start的应用。(Java Web Start 是基于 Java 技术的应用程序的一种部署解决方案,它是连接计算机和 Internet 的便捷通道,允许用户在完全脱离 Web 的情况下运行和管理应用程序) MQTT library:测试MQTT brokers和应用的库。
jenkins安装 详见Installing Jenkins,需要提的一点是Jenkins比较耗内存,不运行任何构建任务的情况下就吃掉了300多M,再加上构建任务时会占用更多,所以建议服务器的内存至少有1G,512M的话很可能在执行构建任务的时候内存不够用。 安装后默认所有人都可以访问,故需要更改访问控制策略,具体操作权限管理 下面是用到的插件清单: Git Plugin:使用Git作为源代码管理 SSH plugin:远程ssh登录server执行命令 Parameterized Trigger Plugin:触发其他的job Cobertura Plugin:代码测试覆盖率报告 Task Scanner Plugin:检测代码中出现的特殊标记(如TODO等) Violations:代码质量检测,支持pylint、jslint等 ThinBackup:用于备份Jenkins SCM Sync configuration plugin:将Jenkens的配置变更同步到SCM中 测试、Staging部署、Production部署流程 根据本项目的需要,在Jenkins中建立了3个任务: tm_test:用于执行测试、代码质量检测等 tm_staging_deploy:用于在staging服务器上deploy代码 tm_deploy:用于在production服务器上deploy代码 其中staging服务器用于进行线上测试,staging服务器和production服务器的环境必须保持完全相同(当然,staging服务器配置可以低一些)。 具体的开发、测试、部署流程是: 在开发新功能/修复bug的时候,一般是开新分支;但如果是那种很小的修改,则直接在master上改,这样比较省事儿 新功能开发完成/bug修复后,进行单元测试+人工测试,如果通过,合并到master 每次master有变动后,触发tm_test任务,执行集成的单元测试和代码质量检测,如果OK,则自动触发tm_staging_deploy,部署到staging服务器上 若tm_staging_deploy成功,则登陆到运行在staging服务器的测试网站上,人工测试新功能是否OK/bug是否已修复;若tm_staging_deploy失败,检查失败原因,进行修复,直至成功 若staging人工测试通过,则手动触发tm_deploy,部署到生产服务器上 登录到生产服务器上进行人工测试,若出现问题,进行修复;同时密切关注Sentry发送的告警邮件,争取在第一时间修复错误 比较简单,没有采用Git-Flow/GitHub-Flow,单元测试写得很浅,也没有做代码审查。不过团队规模小,从目前来看,上面的流程是够用的。 下面对这三个任务做较为详细的介绍: tm_test 该任务用于执行测试、代码质量检测等。 1、push触发构建 每当项目仓库的master分支有变动时,即会触发tm_test。要做这一点,需要如下步骤: 设置tm_test的Build Triggers为Poll SCM,但不填Schedule 为项目仓库添加Web Hook,URL填写 http://JenkinsURL/git/notifyCommit?url=URL of the Git repository 参考Stack Overflow 2、使用virtualenv配置测试环境 执行测试之前,需要确定Python版本(一般是2.7),然后根据此版本初始化virtualenv。 在构建中添加Execute shell项: if [ ! -d "venv" ]; then virtualenv -p /usr/bin/python2.7 venv . venv/bin/activate pip install -i http://pypi.douban.com/simple -r requirements.txt 3、测试与报告 测试中需要2个库:nose用于执行单元测试,coverage用于统计测试覆盖率。 需要在Jenkins中安装Cobertura Plugin插件,用于生成代码测试覆盖率报告。 然后在构建中添加Execute shell项,输入: nosetests --with-xunit --with-coverage --cover-package=tm && coverage xml 其中–with-xunit告诉nose输出JUnit形式的测试报告,–with-coverage表示同时运行coverage(这个功能相当赞),–cover-package=tm表示仅对指定的package执行测试覆盖率检测,后面的coverage xml表示输出xml格式的coverage报告。 然后在构建后操作中,添加如下2项: Publish JUnit test result report:填写nosetests.xml Publish Cobertura Coverage Report:填写coverage.xml 这样一来,就可以执行测试,并得到测试报告和测试覆盖率报告啦: 上面的图表都是可点击的,点进去后有代码级的详细报告,非常赞: 绿色的代码行表示已经覆盖到,红色则没有。 4、代码质量检测 Jenkins有一个蛮不错的代码质量报告插件:Violations,支持非常多的代码测试工具。目前项目中使用Pylint做Python代码质量检测,使用JSHint做JavaScript代码质量检测。 在安装好Pylint后,运行pylint –generate-rcfile > pylintrc生成配置文件,并将其中的output-format项的值改为parseable。 然后在构建中添加2项Execute shell项, pylint: pylint tm2 > pylint.xml || exit 0 jshint: jshint --reporter=jslint $WORKSPACE/tm2/static/js/ > jslint.xml || exit 0 其中的exit 0是为了告诉Jenkins该命令执行成功。对于jshint来说,report选择jslint,然后需要使用$WORKSPACE组成绝对路径,否则无法看到源码级的分析报告 然后在构建后步骤中添加Violations Report,在对应位置输入jslint.xml和pylint.xml。 最终的图形报告如下,可以看到趋势走向: 源码级别的分析也有: 5、检测代码中的特殊标注(如TODO) 团队中约定,在代码未完成的地方使用TODO进行标记,因为PyCharm有一个很好的功能就是可以检测出代码中的所有TODO信息: Jenkins中也有一个非常棒的插件Task Scanner Plugin用于检测代码中出现的特殊标记,当然,这些特殊标记完全是可以自定义的。 安装完该插件后,在构建后操作中添加一项Scan workspace for open tasks,根据需要填写配置: 然后报告就可以出来啦: 6、邮件告警 如果构建后状态是unstable或failed,则可以发送邮件告警,及时通知相关负责人进行处理。Jenkins自带SMTP功能,不过需要你提供SMTP服务器。 我使用的是qq邮箱SMTP服务器,挺好用的,目前没有发现拒发的情况。有一点需要注意的是,在配置好SMTP的账户信息后,还需填写系统管理员邮件地址,否则会发送失败,这也是比较容易忽略的地方。 配置好SMTP后,然后在构建后操作中添加E-mail Notification项,填写负责人的邮箱即可。 7、触发下游任务 如果tm_test构建成功,则需要自动触发tm_staging_deploy任务,这个触发过程是通过插件Parameterized Trigger Plugin来完成的。 在构建后操作中添加Trigger parameterized build on other projects项,选择触发条件为stable,然后填写待出发的任务名称即可。 最后的tm_test任务面板如下: tm_staging_deploy 这一个job用于将最新代码部署到staging服务器上,我采用的部署方法是通过ssh远程登陆服务器执行命令的方式,需要一个插件SSH plugin。 然后在构建中添加Shell项: cd /var/www/tm export MODE=PRODUCTION git reset --hard HEAD git pull -f source venv/bin/activate pip install -r requirements.txt python manage.py db upgrade supervisorctl restart tm tm_deploy 此任务和tm_staging_deploy基本差不多,不同的地方有2个: (1)目标服务器不同 (2)触发方式是手动触发 使用thinBackup进行备份,可设定备份周期。 配置变更同步 除此之外,我还用到了一个很有用的插件SCM Sync configuration plugin,就是把Jenkins的配置(全局配置+各job配置)同步到一个Git仓库中。这样的话,每次配置有变动,都会形成一个commit推送到Git仓库。 这相当于把配置的历史变迁都记录下来,如果哪天Jenkins任务挂了,可以看看配置变更进行排错。
1、在86要触发的项目中,配置身份令牌 exp:口令为chinablue 远程触发的url地址应为: http://xxx.xxx.xxx.xxx:xxxx/job/yyyy/build?token=chinablue(xxxx为86服务器地址,yyyy为项目名称) 2、在92服务器项目中配置 curl -u name:password -X POST http://xxx.xxx.xxx.xxx:xxx/job/projectname/build?token=chinablue 其中name:password为86服务器注册账户 这里如果成功了,那么恭喜你,下面的就不用看了; 如果仍有错误,如: 检查你要远程触发的服务器,看是否开启了全局安全设置, 去掉 防止跨站点请求伪造这个选项 此时就可以远程触发构建了 by the way:另一种实现方式是借助于Parameterized Remote Trigger Plugin插件
一、由于selenium更新3.0的原因导致不在默认支持火狐浏览器,且支持的火狐浏览器大概在45以上的版本,所以很多都由于这个原因导致selenium在运行时打不开浏览器。 解决办法有两种: 1、可继续使用selenium2.x的版本,但是随着selenium及火狐的不断更新,时间久了始终会有点坑的。 目前解决方案:安装selenium2.53.6默认支持火狐47及47以下 python更新selenium的版本可用: pip install -U selenium==2.53.6 2、使用限制的selenium3.0的版本,由于不在默认支持火狐浏览器,且 Message: ‘geckodriver’executable needs to be in PATH 这个错误大家应该都不陌生了,问题如看到的一样,需要名为geckodriver.exe的一个火狐浏览器driver在path中,当然解决办法就是,下载一个geckodriver.exe并将存放的路径添加在path中,简单点就直接放python的根目录下即可,下载地址 https://github.com/mozilla/geckodriver/releases 3、robotframework版本及ride版本都比较落后引起打不开浏览器 (最新robotframework==3.0,ride==1.5.2.1)如果上面的已经做了,仍然打不开,可考虑更新下这两个的版本。 pip install -U robotframework pip install -U robotframework-ride by the way:如果使用selenium2.x的版本,需火狐浏览器为47及以下的版本,如果使用selenium3.0,需确保下载有geckodriver且路径在path中。目前selenium3.0支持火狐45及以上的版本。目前最新的火狐浏览器为49。 二、谷歌及ie,由于selenium2.x默认不支持,所以更新3.0之后仍需要chromedriver.exe及iedriverserver.exe。 三、当遇到浏览器打开了,但是无法访问页面的时候,往往是由于使用了高版本的浏览器和低版本的selenium导致的,解决办法同上。
2、 在编写脚本前,提前写好用例 接口测试虽然对代码的要求比较高,但是最终影响测试质量的不是代码能力的高低,而是设计用例能力的高低。设计和编写用例是写脚本的前提,是脚本代码实现的对象。所以在动手写脚本前,必须先把用例准备好,如果是新人,则需要请开发和接口测试的前辈帮忙review一下,确保设计的用例没有疏漏的地方,然后在开始着手写脚本。 3、 准备测试数据要能完整覆盖被校验点 准备测试数据是编写脚本的重要步骤,要确保准备的数据覆盖被校验点。不能覆盖的错误主要发生在一下场景下: A、 在基类或单独的方法准备一个标准参数,在脚本中创建这个标准参数后,再针对每个脚本的特点更改部分参数 B、 开发的代码中存在“或”的逻辑判断,例如 if(A|B){ this.setValues(0);},其中A和B分别是变量variable1和variable2的参数值 C、 在标准参数中已经对 variable1 赋值A,那么要覆盖variable2为B时也可以执行if后的语句,就需要先将variable1的赋值不为A,这样才能达到覆盖variable2=B的效果; 而在写脚本的过程中很容易遗忘将variable1赋值不为A这个步骤,为了避免这种情况的发生,对于“或”的逻辑判断,不要把这个判断前后的两个变量放到标准参数中,而是单独写一个set和get方法,在每个脚本中再对其单独赋值。 4、 事后校验要全面充分 调用接口后,会返回一个result,对这个result进行校验时,要将校验点想全面,不仅仅包括,调用是否成功,还需要知道为什么成功,为什么失败: 调用成功:result返回调用成功,还需要校验更改的信息是否被更改,其他不需要更改的信息是否被改变 调用失败:result返回调用失败,还需要校验失败的原因是否和期待的一致,确保调用失败后信息没有被更改; 5、 写sql语句更新数据库时,一定要写限制条件 在脚本中编写sql语句更新数据库时,要特别小心,一定要写限制条件,不然会将数据库中的所有记录都更新掉,而且脚本是要持续运行的,信息会被一次次修改,这样会给其他人带来困扰。而且这种问题排查是很困难的,所以一定要小心。1、sshlibrary安装 下载地址:https://github.com/robotframework/SSHLibrary 解压后cd到文件夹下执行:python setup.py install安装 2、使用demo 场景:接口测试请求后需要去linux服务器里report.log加以验证 by the way: 1、日志很多的情况下用less要比more相对速度要快一些; 2、Read Command Output要与start command一起使用。
在用selenium2library做web测试的时候,上传、下载等弹出操作有时候是不能准确的定位到,这个时候autoitlibrary就可以完美的解决这个问题。 下面就简要讲下autoitlibrary的安装过程: 1、pywin32(autoitlibrary使用首先安装这个库) 下载地址:http://download.csdn.net/detail/huashao0602/9678946 2、autoitlibrary 安装需要管理员身份运行python setup.py install 下载地址:http://download.csdn.net/detail/huashao0602/9678950 3、autoitX3.dll 替换掉autoitlibrary下lib里的.dll文件,使其支持X64位windows系统 下载地址:http://download.csdn.net/detail/huashao0602/9678975 4、autoit-v3.exe 64位系统同时需要安装autoit-v3.exe 下载地址:http://download.csdn.net/detail/huashao0602/9678963 到这里安装告一段落了,可以在ride里导入AutoItLibrary库验证是否正常; autoit v3的使用,这里是一个上传的例子。 打开下面两个工具: windows info:定位窗口信息 scite script editor:编写脚本 如:拖动这个小风扇到这个上传窗口 此时我们的编写代码就是如下: $path = @WorkingDir&"\GR\Gr.apk" ControlFocus("打开","","Edit1") WinWait("[CLASS:#32770]","",10) ControlSetText("打开","","Edit1",$path) sleep(2000) ControlClick("打开","","Button1") 保存为.au3格式后,用工具转换成exe文件 然后在ride里用autoitlibrary里的run关键字实现上传功能 后续增加一下用autoitlibrary实现上传的方法
昨天写了对mongodb的操作,今天来说说RF对mysql的操作 RF操作mysql也需要两个库: 其中databaselibrary也是操作oracle数据库必须的 下面讲讲这两个库的安装: 1、pymysql 可以用pip install PyMySQL; 也可以下载后解压, 在文件夹中用python setup.py install 安装 下载地址:https://github.com/PyMySQL/PyMySQL 2、databaselibrary 可以 pip install robotframework-databaselibrary 或下载后安装,下载地址 http://franz-see.github.io/Robotframework-Database-Library/ 打开ride,导入DatabaseLibrary库,就可以对mysql进行操作 下面是我写的一个测试demo: 如有问题,可留言交流
两个库的安装方法: 1、pymongo 可以采用pip install pymongo(如果下载过慢,可指定下载源,如:-i http://pypi.douban.com/simple ); 也可以下载到本地安装,下载地址:https://pypi.python.org/pypi/pymongo/#downloads 2、robotframework-mongodblibrary 下载地址: https://github.com/iPlantCollaborativeOpenSource/Robotframework-MongoDB-Library 切换到下载解压包下,用python setup.py install命令安装即可 打开ride,导入MongoDBLibrary库就可以对mongodb进行增、删、改、查操作,亦可参考http://blog.csdn.net/r455678/article/details/52902351 以下为自己写的一个测试demo: 一直用的这个Should Contain X Times,不造还有没有其他的,请留言交流
俊秀的葫芦 · 记者手记:埃塞俄比亚,后会有期!--国际--人民网 1 年前 |