摘要: 利用Jmeter的http请求的时候,例如登陆操作,我们做普通用户名和密码作参数化,循环读取文本里的用户名和密码,可以添加CSV Data Set Config这个原件来控制。利用Jmeter的CSV Data Set Config,可以实现这个功能,具体如下:1.新建一个文本文件,里面保存要登录的用户名,密码,文件内容如下:baidu,...
阅读全文
条件变量是线程可用的另一种同步机制。条件变量给多个线程提供了一个会合的场所。条件本身是由互斥量保护的。线程在改变 条件状态前必须首先锁住互斥量。
条件变量的初始化 pthread_cond_init
去除初始化 pthread_cond_destroy
等待 pthread_cond_wait
满足条件给向进程发送信号 pthread_cond_signal
下面程序展示了利用条件变量等待另外两个线程满足条件时,第三个进程继续向前执行
#include <stdio.h> #include <pthread.h> #include <signal.h> pthread_mutex_t m1, m2; pthread_cond_t c1,c2; pthread_t t1, t2, t3; void* r1(void *arg) { sleep(10); //睡眠10秒 pthread_cond_signal(&c1); printf("t1 finish\n"); while(1); } void* r2(void *arg) { sleep(15);//睡眠15秒 pthread_cond_signal(&c2); printf("t2 finish\n"); while(1); } void* r3(void *arg) { pthread_cond_wait(&c1, &m1); pthread_cond_wait(&c2, &m2); printf("finish\n");//15秒后线程打印 } main() { pthread_mutex_init(&m1, 0); pthread_mutex_init(&m2, 0); pthread_cond_init(&c1, 0); pthread_cond_init(&c2, 0); pthread_create(&t1, 0, r1, 0); pthread_create(&t2, 0, r2, 0); pthread_create(&t3, 0, r3, 0); while(1); } |
执行结果
条件变量与互斥量一起使用时,允许线程以无竞争的方式等待特定的条件发生。
下面程序中,由于在互斥量中等待条件会造成死锁
#include <pthread.h> #include <stdio.h> #include <signal.h> pthread_t t1,t2; pthread_mutex_t m1,m2; pthread_cond_t c; void *r1(void *d) { while(1) { pthread_mutex_lock(&m1); printf("wait\n"); pthread_cond_wait(&c,&m2); pthread_mutex_unlock(&m1); } } void *r2(void *d) { while(1) { pthread_mutex_lock(&m1); printf("signal\n"); pthread_cond_signal(&c); pthread_mutex_unlock(&m1); } } main() { pthread_cond_init(&c,0); pthread_mutex_init(&m1,0); pthread_mutex_init(&m2,0); pthread_create(&t1,0,r1,0); pthread_create(&t2,0,r2,0); while(1); /* pthread_join(t1,0); pthread_join(t2,0); pthread_mutex_destroy(&m2); pthread_mutex_destroy(&m1); pthread_cond_destroy(&c);*/ } |
执行结果,程序执行到某一时刻发生死锁,不再向下执行
改进后的程序,允许线程以无竞争的方式等待,不会发生死锁
#include <pthread.h> #include <stdio.h> #include <signal.h> pthread_t t1,t2; pthread_mutex_t m1,m2; pthread_cond_t c; void *r1(void *d) { while(1) { pthread_mutex_lock(&m1); printf("wait\n"); pthread_cond_wait(&c,&m1); pthread_mutex_unlock(&m1); } } void *r2(void *d) { while(1) { pthread_mutex_lock(&m1); printf("signal\n"); pthread_cond_signal(&c); pthread_mutex_unlock(&m1); } } main() { pthread_cond_init(&c,0); pthread_mutex_init(&m1,0); pthread_mutex_init(&m2,0); pthread_create(&t1,0,r1,0); pthread_create(&t2,0,r2,0); while(1); /* pthread_join(t1,0); pthread_join(t2,0); pthread_mutex_destroy(&m2); pthread_mutex_destroy(&m1); pthread_cond_destroy(&c);*/ } |
从网站上获取的信息要保存在本地
数据库中,但是保存的过程中数据库的信息都变成了乱码,怎么解决呢?客官听我娓娓道来。
首先,保证以下四项的编码都是utf-8:
1. 代码
2. 数据库连接
3. 表的字符集格式
4. 插入的数据格式
每步的操作如下:
1. 保证代码的格式是utf-8,在代码最前面加上这句话
# -*- coding:utf8 -*-
#首先用于确定编码,加上这句
2. 保证数据库连接格式是utf-8,这么写
conn=MySQLdb.connect(host='localhost',user='root',passwd='****',db='kfxx',port=3306,charset='utf8')
cur=conn.cursor()
3. 保证表的字符集格式是utf-8,在建表的时候就能设置
4. 保证插入的数据格式是utf-8,分为保证读取的页面格式是utf-8和字符串格式也是utf-8
#解决乱码问题
html_1 = urllib2.urlopen(cityURL,timeout=120).read() mychar = chardet.detect(html_1) bianma = mychar['encoding'] if bianma == 'utf-8' or bianma == 'UTF-8': html = html_1 else : html = html_1.decode('gb2312','ignore').encode('utf-8') |
chapter_soup = BeautifulSoup(html) city = chapter_soup.find('div',class_ = 'row-fluid').find('h1').get_text() province = chapter_soup.find('a',class_ = 'province').get_text() pmNum = chapter_soup.find('div',class_ = 'row-fluid').find('span').get_text() suggest = chapter_soup.find('div',class_ = 'row-fluid').find('h2').get_text() rand = chapter_soup.find('div',class_ = 'row-fluid').find('h2').find_next_sibling('h2').get_text() face = chapter_soup.find('div',class_ = 'span4 pmemoji').find('h1').get_text() conclusion = chapter_soup.find('h1',class_ = 'review').get_text() print city.encode('utf-8') cur.execute('insert into t_pm values(\''+city.encode('utf-8') +'\',\''+province.encode('utf-8') +'\',\''+pmNum.encode('utf-8') +'\',\''+suggest.encode('utf-8') +'\',\''+rand.encode('utf-8') +'\',\''+conclusion.encode('utf-8')+'\')') |
完成,插入的数据都是中文了,看效果图:
常用命令
1.在compose Bar下可以对多个服务器同时进行操作。选择To All Sessions
ps -ef | grep java
ps auxf | grep java
3.杀死JAVA进程:
pkill java (在有反串改的时候可以用,杀死所有java进程)
kill -9 进程ID
ps -ef | grep "Dcatalina.base=/usr/oa/appserver" | grep -v "grep" | awk '{print $2} ' | xargs kill -9
4.目录查看和执行程序:
cd /usr/oa/bin (进入工程的目录中)
cd .. (后退一个目录)
./startup.sh ./stop.sh (执行当前目录下的文件)
5.进入某个用户
su root (切换到root用户下)
6.查看目录:
ll (显示目录的详细信息)
ls(显示目录下所有文件)
7.在linux下修改文件内容
1)选用vi选择需要修改的文件vi index.jsp
2)然后会出现提示内容按一下i 进行修改
3)修改完成后按esc键后再按 shift+冒号 最后输入wq
8.查看硬盘是否有满
df -h
9.删除文件(清缓存的时候用)
1.查看文件目录:pwd
2.删除文件:rm -rf 文件夹目录
10.复制文件
cp -r /user/oa /usr_back_oa
11.查看日志
tail -r catalina.out
tail -n 300 catalina.out
12.查看文件
cat fileName.xml
13.查看IP,开启远程连接服务
ifconfig --查看IP地址,注意这里是if开头而不是ip
service sshd status --查看sshd服务的状态
service sshd start --启动sshd服务的状态
chkconfig --list
chkconfig --list | grep sshd 查看启用服务
14.列出各进程打开文件的数量
lsof -n|awk '{print $2}' |sort|uniq -c |sort -nr|more
直接统计JAVA进程连接数
ps -ef| grep java | awk '{print $2}' | awk 'NR==1'| xargs lsof -p | wc -l
15.先使用ps -ef|grep java查看,再查看12120的打开数量
lsof -p 12120 |wc -l
16.为tomcat授权,不能少sudo,username为用户名
sudo chown -R username /Users/username/Documents/tomcat
最近在用
Selenium实现
自动化测试的过程中遇到了一些问题,不太好解决,或者解决了也觉得不是特别好的办法,在这里写出来一个是记录一下,也向大家需求一下帮助,看看有没有更好的办法,谢谢!
一个问题就是二级联动菜单,比如选择省市的二级联动菜单,在第一个菜单中选择省份后会触发二级菜单的load事件去 装载市区的option label。可如果单独用selenium.select(locator,label='xxx');的操作是无法触发二级菜单的load事件的,从而执行时无法找到相应的label。大家的建议都是用fireEvent、mouseUp、mouseDown之类的API进行调试,可这些方法仍没有解决我的问题。后来是通过先focus,再click,最后select的步骤进行操作才能触发事件并选到相应的label。实例如下:
selenium.focus(provinceCode); selenium.click(provinceCode); selenium.select(provinceCode,label='Beijing'); selenium.focus(cityCode); selenium.click(cityCode); selenium.select(cityCode,label='Beijing'); |
可感觉这种方式毕竟繁琐,不知道有没有更好的方法可以直接触发事件,直接通过select进行操作。其间我还看到了这篇文章http://blog.csdn.net/honglei915/archive/2009/11/16/4815513.aspx,可是没有成功,不知道是不是我用的框架没有继承SeleniumTestCase。因为我们的框架是结合TestNG,通过@Factory和@Test标注进行测试Case文件解析,文件以htm形式存在,将tr/td标签解析为selenium可执行的命令执行自动化操作。如果大家有什么好的办法请留言告诉我吧,谢谢!
其次就是对页面上js事件的处理,现在我能想到的就是用fireEvent()这个API。一个参数是要触发这个js的控件的xpath,另一个参数就是要触发的事件, 大家给的建议一般都是blur或focus,可尝试了很多次都没有成功。不知大家有没有更好的方法?或者了解这个API的大虾能不能给具体讲讲,为啥用blur/focus,这俩有什么区别?还有没有什么其他event可以用呢?谢谢!
摘要:支付宝无线统一
测试平台承载着整个支付宝无线应用研发的质量控制体系,提供字节码测试、monkey测试、遍历测试、UI自动化测试、适配测试、设备管理、
真机访问、性能监测、安全扫描等。
一、引言
无线应用的浪潮已经掀起,
无线测试质量保障体系的建立步伐步步紧逼,在这样的背景下,支付宝无线统一测试平台应运而生,结合支付宝无线应用的特性,定制开发一套统一无线测试平台迫在眉睫,本平台主要涵盖monkey测试、遍历测试、UI自动化测试、适配测试、设备管理、真机访问、性能监测、安全扫描等,研发团队采取垂直化研发协作模式,坚守OneSolution&OneApp&OneProject&OneDB&OneOwner的责任到人的开发模式,秉承高内聚、低耦合的开发理念,极大的提升了整个平台的开发效率。开发过程中,强化进度层层把关与同行评审机制,坚守产品第一、质量第一,为统一无线测试平台的构建打下坚实的基础。在开发效率提升的同时,这种垂直化研发协作模式也有效的提升了整个平台的可扩展性、可维护性等。
二、案例解读
(1).核心模块划分
鉴于本平台的自身特点,在模块化设计方面,我们对本平台进行模块解耦设计,主要分为基础组件(如用户管理、权限管理、任务调度等)、统一控制中心(与
移动设备交互层)、应用提测、设备管控、应用评价中心、
自动化测试等模块;同时鉴于集团共建,本平台建设主要采用开源的技术体系springmvc&mybatis&velocity&mysql。核心模块结构图如下:
(2).核心功能剖析
字节码测试:我们通过对findbugs进行拓展开发,提供一体化的字节码测试解决方案,填补了支付宝在字节码扫描领域的空白,这里的扩展开发主要包括findbugs的缺陷的关键字过滤、缺陷的规则扩展、缺陷的翻译等,业务流程见下图:
安装、启动、卸载、升级测试:主要是对应用在不同型号的
手机上进行安装、启动、卸载测试的相关数据指标的获取以及分析;同时,鉴于支付宝应用发布的高频率情况,整个无线平台提供了应用升级测试方案,支持从低版本到高版本的升级测试相关数据指标的获取与分析,业务流程见下图:
性能监测:切合支付宝无线自动化解决方案,收集在特定的场景(也即测试计划)运行与底层框架函数埋点的情况下,透明化该特定场景下的移动设备的流量、耗电量、CPU、内存等数据指标,并提供基于特定性能基线的移动应用性能评测中心,相关模块以及性能指标见下图:
单元测试(unit testing):对软件中最小可测试单元进行检查和验证。一般面向过程的语言中,基本单元为函数,面向对象的语言中,基本单元通常是类,其实对于一个
手机上的app来说基本单元也可以是一个UI页面。平时我们写了一个函数,执行以下看是否正常
工作,也属于单元测试。
测试用例(
test case):对测试任务的描述,体现测试方案、方法、技术和策略。内容包括测试目标、测试环境、输入数据、输出数据、测试步骤、预期结果、测试脚本等。
它是一种检验行为,便于我们写出高质量代码。
它是一种设计行为,有利于我们编程能力的提高。
它是一种文档编写行为,让我们的程序有据可依。
Xcode内置了OCUnit单元测试框架。在Xcode5之前,建立项目的时候有一个选项,让我们选择是否建立一个含有单元测试target的项目,而在Xcode5中只要建立一个项目就默认带有一个单元测试的target。
在Xcode5之前,建立一个工程的时候如果没有勾选单元测试的话也不要紧,可以自己添加一个单元测试的target。
在弹出选择框中 IOS-->Other---> Cocoa Touch Unit Testing Bundle
这里看似OK,但还是差一步,在点击RUN,长按后产生TEST,点击TEST进行开启测试时,将产生一个提示:The scheme "工程名" is not configured for testing. edit the scheme to enable testing,or cancel the action.即我们还没有给工程配置测试工程行,点击修改来添加,或点击取消进行结束。点击Edit Scheme (或菜单中Product->edit Scheme)
弹出scheme窗体。选中Test,然后点击+号来没加一个scheme
选中之前创建的CoredataDemoTest后点击ADD
说明:
在Xcode5中测试类必须继承自XCTestCase。在Xcode5之前测试类必须继承自SenTestCase。
测试函数的形式必须是无返回值且以‘test’为前缀,如:- (void)testLogin;
每个测试用例都是从- (void)setUp;开始,进行初始化,以- (void)tearDown结束,释放资源。
运行测试用例:
command + u。
长按运行按钮选择列表中的test;
2年前写的一篇总结
文章,在过去做
性能测试过程中经常看到1小时1次FGC问题,该问题在高并发情况下对性能产生很大的波动不可小看,也许一个小小的调优可以给性能带来很大的改善。
应用出现1小时1次FGC,所引发的原因是由于使用了RMI,会自动1小时调用1次system.gc()。
大多数的应用虽然配置了CMS gc方式,但是如果没有使用-XX:+ExplicitGCInvokesConcurrent,则会出现显示调用system.gc(),且不会进行 CMS的FGC,带来的影响是造成tps的波动(fgc停机时间越长,则波动会越大)。
收集各方的意见后,总结针对此类问题的解决方法如下:
1、增加参数 -XX:+DisableExplicitGC
该方法System.gc()的调用就会变成一个空调用。但是该方法不适用在大量使用NIO的direct memory,经常、反复的申请DirectByteBuffer的应用中使用,会造成“
java.lang.OutOfMemoryError: Direct buffer memory ”。该方法需根据应用具体情况而定。
2、增加参数 -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000
其中3600000即为定时触发的时间间隔设置,单位是毫秒,可适当延长触发FGC的定时时间间隔。
-Dsun.rmi.dgc.client.gcInterval=Long.MAX_VALUE -Dsun.rmi.dgc.server.gcInterval=Long.MAX_VALUE 则将fc时间间隔设为long型的最大值
3、增加参数 -XX:+ExplicitGCInvokesConcurrent 或者-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses
该方法可以指定System.gc()采用 CMS 算法,FGC时停机时间会变短,但是CMS GC次数不会变,仍然是1小时1次。
版权声明:本文出自 希君 的51Testing软件测试博客:http://www.51testing.com/?367410
原创作品,转载时请务必以超链接形式标明本文原始出处、作者信息和本声明,否则将追究法律责任。
windows下打开my.ini,增加:
interactive_timeout=28800000 wait_timeout=28800000 |
专家解答:
MySQL是一个小型关系型
数据库管理系统,由于MySQL体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。
关于mysql自动关闭服务的现象,可以通过mysql服务器端程序mysql Administrator调整连接参数。将max_connections max_updates max_questions三项数据调整到很大的数字,那么你有限的操作将不会导致数据库服务的终止了在MySQL数据库中,如果一个连接8小时没有请求和操作,就会自动断开,从而导致一些基于数据库连接的应用程序,特别是 WEB 应用程序出错。解决mysql数据库自动关闭服务三个方法:
方法一:这个参数的名称是 wait_timeout,其默认值为 28800秒(8小时)。其意义为关闭一个连接之前在这个连接上等到行动的秒数,也就是说,如果一个连接闲置超过这个选项所设置的秒数,MySQL 会主动断开这个连接。
修改操作:
linux下打开/etc/my.cnf,在属性组mysqld下面添加参数如下:
interactive_timeout=28800000 wait_timeout=28800000 |
windows下打开my.ini,增加:
interactive_timeout=28800000 wait_timeout=28800000 |
有实践表明,没有办法把这个值设置成无限大,即永久。因此如果你无法保证你的应用程序必定在设定的秒数内至少有一次操作,那么最好用第二个方法解决这个问题。
方法二:修改如下JDBC连接的 URL:
jdbc:mysql://hostaddress:3306/schemaname?autoReconnect=true
添加 autoReconnect=true 这个参数,即能解决这个问题。
方法三:配置文件(proxool.xml):
mysql
jdbc:mysql://localhost/yourDatebase?useUnicode=true&characterEncoding=UTF-8 com.mysql.jdbc.Driver 90000 20 3 20 3 true true SELECT CURRENT_USER |
专家建议关于mysql自动关闭服务的三个方法,用户最好采取第一个办法最为彻底解决。
抽象类:用abstract修饰的类称为抽象类。
它可以有构造器,但是不能构造对象,抽象类中的构造器,在构造具体子类对象时调用,抽象方法决定抽象类,抽象类中可以没有抽象方法,具体父类型可以作为引用类型的声明;抽象父类型也可以作为引用类型的声明;如果一个具体子类继承抽象类,那么就要实现抽象父类中的所有抽象方法;在子类中重写父类方法时,访问级别要大于等于原有访问级别;
接口:是一种统一的标准,是一个特殊的“模版”
接口中只能有:1、常量2、抽象方法;在定义方法时,具体类可以做形参,抽象类可以作形参,接口可以做形参;无论谁做形参,实参一定是具体类对象!(具体父类的具体子类;抽象类的具体子类;接口的具体实现类;)类可以在继承一个父类的基础上,实现多个接口;
抽象类与接口的异同:
相同处:1、不能构造对象2、都可以定义抽象方法3、设计的目的是为了被继承或被实现4、与子类或实现类的关系都属于is-a,可以用抽象类或接口的引用来作类型声明,进而统一调用具体子类或具体实现类;
不同处:1、抽象类中可以有构造器,但接口中没有2、无论继承链的长短,继承链上所有的类都是同一类事物;同一个接口中实现类,可以没有任何关系。3、抽象类中可以有抽象方法,也可以有具体方法,但接口中的方法都是抽象方法;4、顶层抽象类是Object类的子类,它继承了父类的所有成员;而接口中则除了自定义的的成员外,没有额外数据;接口是“轻量级”的抽象类,或者说是100%的抽象类;5、抽象类编程时,内聚性低,耦合度高;接口编程,内聚性高,耦合度低(好)6、接口可以实现多继承,一个接口可以继承多个接口。但是抽象类却不能,只能单继承。一个接口不能实现另外一个接口。