首页 文章 精选 留言 我的

精选列表

搜索[诊断自动化],共10000篇文章
优秀的个人博客,低调大师

appium+python自动化34-获取元素属性get_attribute

获取text # coding:utf-8 from appium import webdriver from time import sleep desired_caps = { 'platformName': 'Android', 'deviceName': '127.0.0.1:62001', 'platformVersion': '4.4.2', 'appPackage': 'com.baidu.yuedu', 'appActivity': 'com.baidu.yuedu.splash.SplashActivity', 'noReset': 'true', 'resetKeyboard': 'true', 'unicodeKeyboard': 'true' } driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) # 等主页面activity出现 driver.wait_activity(".base.ui.MainActivity", 10) # 点取消升级 driver.find_element_by_id("com.baidu.yuedu:id/negativeUpgrade").click() # 获取text t1 = driver.find_element_by_id("com.baidu.yuedu:id/lefttitle").text print(t1) tag_name 1.tag_name实质上是获取class属性 # 获取tag_name t2 = driver.find_element_by_id("com.baidu.yuedu:id/lefttitle").tag_name print(t2) 2.打印结果:android.widget.TextView get_attribute 1.获取content-desc属性,这里注意了,如果content-desc属性为空,那么获取的就是text属性,不为空获取的才是content-desc属性 2.content-desc属性为空,打印结果:书架 # content-desc为空,获取的是text t3 = driver.find_element_by_id("com.baidu.yuedu:id/lefttitle").get_attribute("name") print(t3) 3.content-desc属性不为空,打印结果:百度阅读 # content-desc t4 = driver.find_element_by_id("com.baidu.yuedu:id/fragment_banner").get_attribute("name") print t4 4.id,calss,text属性获取 # id t5 = driver.find_element_by_id("com.baidu.yuedu:id/lefttitle").get_attribute("resourceId") print(t5) # class t6 = driver.find_element_by_id("com.baidu.yuedu:id/lefttitle").get_attribute("className") print(t6) # text t7 = driver.find_element_by_id("com.baidu.yuedu:id/lefttitle").get_attribute("text") print(t7) 5.其它属性获取,注意这里并不是所有的都可以获取,一些标准的属性是可以获取到的 # checkable t8 = driver.find_element_by_id("com.baidu.yuedu:id/lefttitle").get_attribute("checkable") print t8 # clickable t9 = driver.find_element_by_id("com.baidu.yuedu:id/lefttitle").get_attribute("clickable") print t9 size和location 1.获取size,返回的是字典,如:{'width': 84, 'height': 84} 2.获取location,返回的是字典,如:{'y': 38, 'x': 192} # size t10 = driver.find_element_by_id("com.baidu.yuedu:id/lefttitle").size print t10 # location t11 = driver.find_element_by_id("com.baidu.yuedu:id/lefttitle").location print t11 参考代码 # coding:utf-8 from appium import webdriver desired_caps = { 'platformName': 'Android', 'deviceName': '127.0.0.1:62001', 'platformVersion': '4.4.2', 'appPackage': 'com.baidu.yuedu', 'appActivity': 'com.baidu.yuedu.splash.SplashActivity', 'noReset': 'true', 'resetKeyboard': 'true', 'unicodeKeyboard': 'true' } driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) # 等主页面activity出现 driver.wait_activity(".base.ui.MainActivity", 10) # 点取消升级 driver.find_element_by_id("com.baidu.yuedu:id/negativeUpgrade").click() # 获取text t1 = driver.find_element_by_id("com.baidu.yuedu:id/lefttitle").text print(t1) # 获取tag_name t2 = driver.find_element_by_id("com.baidu.yuedu:id/lefttitle").tag_name print(t2) # content-desc为空,获取的是text t3 = driver.find_element_by_id("com.baidu.yuedu:id/lefttitle").get_attribute("name") print(t3) # content-desc t4 = driver.find_element_by_id("com.baidu.yuedu:id/fragment_banner").get_attribute("name") print t4 # id t5 = driver.find_element_by_id("com.baidu.yuedu:id/lefttitle").get_attribute("resourceId") print(t5) # class t6 = driver.find_element_by_id("com.baidu.yuedu:id/lefttitle").get_attribute("className") print(t6) # text t7 = driver.find_element_by_id("com.baidu.yuedu:id/lefttitle").get_attribute("text") print(t7) # checkable t8 = driver.find_element_by_id("com.baidu.yuedu:id/lefttitle").get_attribute("checkable") print t8 # clickable t9 = driver.find_element_by_id("com.baidu.yuedu:id/lefttitle").get_attribute("clickable") print t9 # size t10 = driver.find_element_by_id("com.baidu.yuedu:id/lefttitle").size print t10 # location t11 = driver.find_element_by_id("com.baidu.yuedu:id/lefttitle").location print t11 appiumQQ群:512200893

优秀的个人博客,低调大师

关于项目自动化测试架构的改良计划 - 解析XInclude标记

因为在test_suite.xml中,我们多处使用了XInclude标记,他们会被申明在一个叫"http://www.w3.org/2001/XInclude"的名字空间中,并且引入部分用xi:include来声明,我们这个类的作用就是把这些所有的<xi:include>的部分,都用被引入的文件插入和替换掉。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 /** * This class will handle converting a xinclude+xpointer marked xml file to a normal xml file * Because of the shortage of the current jdk ,it only support the xPointer with element instead of NCName *@author cwang58 *@created date: Jun 10, 2013 */ public class XIncludeConverter { /** * this method will handle change the XInclude+XPointer marked xml as normal xml * @param origialXML the original xml which has the xInclude feature * @return the parsedXML without the xInclude feature */ public static String convertXInclude2NormalXML(String originalXML) throws SAXException,ParserConfigurationException,TransformerConfigurationException,IOException,TransformerException{ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); //open up the namespace aware so that it can recognize the "xi" namespace factory.setNamespaceAware( true ); //let this SAXParser support XInclude factory.setXIncludeAware( true ); //factory.setValidating(true); //ignore all the comments added in the source document factory.setIgnoringComments( true ); DocumentBuilder docBuilder = factory.newDocumentBuilder(); Document doc = docBuilder.parse( new InputSource( new ByteArrayInputStream(originalXML.getBytes( "utf-8" )))); Transformer transformer = TransformerFactory.newInstance().newTransformer(); //format the output xml string so it support indent and more readable transformer.setOutputProperty(OutputKeys.INDENT, "yes" ); //initialize StreamResult with File object to save to file StreamResult result = new StreamResult( new StringWriter()); DOMSource source = new DOMSource(doc); transformer.transform(source, result); return result.getWriter().toString(); } 这里讲一个小插曲,其实,W3C中,XInclude经常和Xpointer联合起来应用的,xpointer可以帮助来定位目标文件的某个小片段而不是整个目标文件,定位方法可以用element(),或者xpointer(),如果element的话,可以用(/1/2/3)这种方式来定位DOM,或者基于 id,对应java的解析框架是xerce,但是非常不幸运的是,最新版本的xerce框架只支持element(/1/3/4/5)这种定位,而对于基于schema-id的方式,也就是某个element声明了id的情况,它没办法定位,但是未来可能会支持这个功能。 http://xerces.apache.org/xerces2-j/faq-xinclude.html#faq-8 基于上述的局限性,我决定只采用xi:include来包含全部文件,然后局部调整的做法,并且绕过xpointer。 所以实现代码如上所示,事实上从JDK 1.6开始,他已经提供了对XInclude的支持,内部是委托给xerce来实现的,这是对应架构图的第3-4步骤。 本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/1221731,如需转载请自行联系原作者

优秀的个人博客,低调大师

运维自动化之ansible playbook安装mysql tpcc测试OLTP能力

上周介绍了zabbix监控cdn带宽,这次在介绍一下ansible结合docker来一键化安装与测试mysql tpcc,然后通过tpcc测试OLTP系统性能。 写这个的原因就是重复性的安装太麻烦,浪费时间,而且我这里新业务不断上线,上线前使用tpcc进行OLTP测试对整体系统性能上也有了解。 一、Myql Tpcc介绍(网上找的内容) Tpcc-mysql是percona基于tpcc衍生出来的产品,用来测试OLTP(在线事务处理)系统性能的软件, TPCC-MYSQL是开源的TPC-C测试软件其源码放在bazaar(Bazaar是一个分布式的版本控制系统,采用GPL许可协议,可运行于Windows、GNU/Linux、UNIX 以及 Mac OS 系统之上。Bazaar 由Canonical公司(Ubuntu母公司)赞助商,因此还需要先安装bazaar客户端。 二、测试环境 平台:cloudsbox 虚拟化:kvm 系统:centos6.5 Docker版本:0.11.1 Docker容器系统版本:centos 6.3 Ansible版本:1.6 三、测试步骤 1、使用docker生成一个新的容器mysql-tpcc; 2、使用ansible在新生成的容器mysql-tpcc里进行安装mysql-tpcc并进行测试; 3、测试完成后,从容器里把测试结果拉回本地。 下面开始是测试过程 四、docker里操作 1、查看当然容器 1 2 3 4 5 6 7 17:49:46 #dockerps-a CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES dfec766fbaa7centos6:3.0 /usr/sbin/sshd -D12daysagoUp12days0.0.0.0:49159->22 /tcp redis-slave 06762530db8ccentos6:3.0 /usr/sbin/sshd -D12daysagoUp12days0.0.0.0:49158->22 /tcp redis-master 846efb9e4d7aubuntu:3.0 /usr/sbin/sshd -D3weeksagoUp2weeks0.0.0.0:49167->22 /tcp ubuntu-test1 b9a9e6f2caedcentos6:3.0 /usr/sbin/sshd -D5weeksagoUp2weeks0.0.0.0:49166->22 /tcp zabbix-server 978fff134b18centos6:3.0 /usr/sbin/sshd -D6weeksagoUp2weeks0.0.0.0:49165->22 /tcp centos6-test5 2、生成新容器 1 2 3 4 5 6 17:49:53 #timedockerinspect$(dockerrun-d-p22--name="mysql-tpcc"centos6:3.0/usr/sbin/sshd-D)|grep-iaddress|awk-F'"''{print$4}' 172.17.0.7 real 0m9.415s user 0m0.028s sys 0m0.140s 3、查看当前已有容器 1 2 3 4 5 6 7 8 17:50:07 #dockerps-a CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES 6331fb9bf19bcentos6:3.0 /usr/sbin/sshd -D21secondsagoUp12seconds0.0.0.0:49160->22 /tcp mysql-tpcc dfec766fbaa7centos6:3.0 /usr/sbin/sshd -D12daysagoUp12days0.0.0.0:49159->22 /tcp redis-slave 06762530db8ccentos6:3.0 /usr/sbin/sshd -D12daysagoUp12days0.0.0.0:49158->22 /tcp redis-master 846efb9e4d7aubuntu:3.0 /usr/sbin/sshd -D3weeksagoUp2weeks0.0.0.0:49167->22 /tcp ubuntu-test1 b9a9e6f2caedcentos6:3.0 /usr/sbin/sshd -D5weeksagoUp2weeks0.0.0.0:49166->22 /tcp zabbix-server 978fff134b18centos6:3.0 /usr/sbin/sshd -D6weeksagoUp2weeks0.0.0.0:49165->22 /tcp centos6-test5 4、新容器ip加入到ansible的访问主机列表里 1 2 17:52:47 #echo"172.17.0.7">>hosts root@ip-10-10-10-10: /etc/ansible 五、ansible里操作 其中命令为ansible-playbookmysql_tpcc_install.yml --extra-vars "host=172.17.0.17 user=rootwarehouse=50 w=50 c=50 r=120 l=600”,extra-vars后面都是变量,都是可以自行修改变量,满足个性化测试需求 下面是运行情况 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 time ansible-playbookmysql_tpcc_install.yml--extra-vars "host=172.17.0.7user=rootwarehouse=50w=50c=50r=120l=600" -k SSHpassword: PLAY[172.17.0.7]************************************************************* GATHERINGFACTS*************************************************************** ok:[172.17.0.7] TASK:[common|Installinitializtionrequiresoftware]*********************** changed:[172.17.0.7] TASK:[mysql_install|CopyMysqlSoftwareToRedhatClient]****************** changed:[172.17.0.7] TASK:[mysql_install|CreateMysqlUserInRedhatClient]******************** changed:[172.17.0.7] TASK:[mysql_install|CopyMysqlStartScriptToRedhatClient]************** changed:[172.17.0.7] TASK:[mysql_install|CopyInstallMysqlScriptToRedhatClient]*********** changed:[172.17.0.7] TASK:[mysql_install|CopyMysqlConfigToRedhatClient]******************** changed:[172.17.0.7] TASK:[mysql_install|CopyMysqlSecurityScriptToRedhatClient]*********** changed:[172.17.0.7] TASK:[mysql_install|CreateMysqlInstallDir]****************************** ok:[172.17.0.7] TASK:[mysql_install|UncompressionMysqlSoftwareToRedhatClient]********* changed:[172.17.0.7] TASK:[mysql_install|ModifyMysqlDirPermissionInRedhatClient]********** ok:[172.17.0.7]=>(item= /data/mysql/datadir ) ok:[172.17.0.7]=>(item= /data/mysql/basedir ) TASK:[mysql_install|InstallMysqlScriptInRedhatClient]***************** changed:[172.17.0.7] TASK:[mysql_install|StartMyqlSecurityScriptInRedhatClient]*********** changed:[172.17.0.7] TASK:[mysql_install|AddBootStartMysqlServiceInRedhatClient]********* changed:[172.17.0.7] TASK:[mysql_install|DeleteMysqlcompressionSoftwareInRedhatClient]**** changed:[172.17.0.7] TASK:[mysql_tpcc_install|InstallBaseRequireSoftwareInRedhatClient]*** changed:[172.17.0.7] TASK:[mysql_tpcc_install|CopyTpccSoftwareToRedhatClient]************* changed:[172.17.0.7]=>(item=tpcc-mysql. tar .gz) TASK:[mysql_tpcc_install|DownloadTpccSoftwareToRedhatClient]********** changed:[172.17.0.7] TASK:[mysql_tpcc_install|CompileTpccSoftwareToRedhatClient]*********** changed:[172.17.0.7] TASK:[mysql_tpcc_install|CreateMysqlTpccDatabaseInRedhatClient]****** changed:[172.17.0.7]=>(item=createdatabasetpcc100;) TASK:[mysql_tpcc_install|LoadMysqlTpccDataTableInRedhatClient]***** changed:[172.17.0.7]=>(item=create_table.sql) changed:[172.17.0.7]=>(item=add_fkey_idx.sql) TASK:[mysql_tpcc_install|CreateTpccMysqlTestDataToRedhatClient]***** changed:[172.17.0.7] TASK:[mysql_tpcc_install|StartMysqlTpccTestInRedhatClient]********** changed:[172.17.0.7] TASK:[mysql_tpcc_install|CopyMysqlTpccResultfromRedhatClient]******** changed:[172.17.0.7] TASK:[mysql_tpcc_install|DeleteZabbixcompressionSoftwareInRedhatClient]*** changed:[172.17.0.7]=>(item=tpcc-mysql. tar .gz) changed:[172.17.0.7]=>(item=tpcc100.sql) PLAYRECAP******************************************************************** 172.17.0.7:ok=25changed=22unreachable=0failed=0 real 89m21.833s user 0m27.365s sys 0m2.680s 可以看到89分钟就安装完成,可能有的人疑问为什么这么长时间,注意是在tpcc_load里加载测试数据差不多就话费3分之二时间,本来我想做好一个测试库后,使用mysqldump导出,但即使导出后在算上传输时间、导入时间跟现在时间差不多,所以就没有使用这个方法。 2、查看mysql-tpcc的结果 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 20:21:31 #ll/tmp/mysql-tpcc-172.17.0.7.log -rw-r--r--1rootroot8215Aug2520:21 /tmp/mysql-tpcc-172 .17.0.7.log root@ip-10-10-10-10: /mnt/ansible 20:21:44 #cat/tmp/mysql-tpcc-172.17.0.7.log *************************************** *** ###easy###TPC-CLoadGenerator*** *************************************** optionhwithvalue '172.17.0.7' optionuwithvalue 'root' optionpwithvalue 'E4yR3WnoluSFTCBAI' optiondwithvalue 'tpcc100' optionwwithvalue '50' optioncwithvalue '50' optionrwithvalue '120' optionlwithvalue '600' optionfwithvalue 'tpcc-mysql-result' <Parameters> [server]:172.17.0.7 [port]:3306 [DBname]:tpcc100 [user]:root [pass]:E4yR3WnoluSFTCBAI [warehouse]:50 [connection]:50 [rampup]:120(sec.) [measure]:600(sec.) RAMP-UPTIME.(120sec.) MEASURINGSTART. 10,2491(110):4.671|6.975,2494(0):1.001|1.625,250(0):0.510|0.939,251(0):6.439|7.783,246(0):13.922|17.389 20,1649(305):6.303|7.654,1649(0):1.337|1.521,164(0):0.718|0.737,164(0):7.859|8.443,173(0):17.100|18.067 30,1701(294):6.378|7.320,1694(0):1.338|1.685,171(0):0.701|0.787,170(0):7.824|8.124,164(0):17.122|18.446 40,1857(310):6.198|6.755,1861(0):1.301|1.528,184(0):0.716|0.857,187(0):7.595|7.996,190(0):16.457|17.335 50,1543(352):6.504|7.504,1543(0):1.460|1.977,157(0):0.727|0.947,154(0):8.237|8.365,150(0):17.165|17.904 60,1728(385):6.425|7.139,1732(0):1.393|1.873,172(0):0.728|0.845,174(0):7.782|8.069,175(0):16.524|16.731 70,1824(321):6.199|6.856,1826(0):1.306|1.639,181(0):0.751|0.859,182(0):7.650|7.921,183(0):16.011|16.740 80,1598(399):6.367|7.330,1595(0):1.371|1.649,162(0):0.761|0.962,159(0):7.532|7.632,158(0):17.059|17.390 90,1740(371):6.347|6.910,1740(0):1.357|1.872,172(0):0.751|0.821,174(0):7.828|8.164,172(0):17.291|17.397 100,1758(399):6.350|6.993,1757(0):1.343|1.625,176(0):0.726|0.744,176(0):8.042|8.247,179(0):17.284|17.362 110,1791(359):6.364|6.983,1792(0):1.352|1.595,180(0):0.770|0.852,180(0):7.597|7.962,181(0):16.908|17.897 120,1762(367):6.397|7.016,1760(0):1.332|1.580,175(0):0.690|0.873,174(0):8.184|8.551,173(0):17.208|17.613 130,1935(267):6.118|6.846,1938(0):1.290|1.535,194(0):0.735|0.800,194(0):7.329|7.667,193(0):16.368|16.718 140,1602(371):6.391|7.331,1598(0):1.377|1.551,161(0):0.875|0.986,161(0):8.105|8.791,164(0):17.402|18.088 150,1814(275):6.329|6.780,1816(0):1.321|1.614,181(0):0.671|0.869,182(0):8.143|8.568,179(0):16.673|17.081 160,1908(284):6.041|7.137,1911(0):1.366|1.742,190(0):0.720|0.794,190(0):7.571|8.524,192(0):15.846|16.471 170,1740(46):5.313|6.052,1743(0):1.199|1.636,175(0):0.699|0.805,175(0):6.750|6.918,174(0):15.899|16.343 180,3700(10):4.368|5.826,3692(0):1.036|1.361,367(0):0.574|0.751,368(0):5.685|6.103,372(0):13.234|13.676 190,5243(0):2.843|4.661,5249(0):0.704|1.119,528(0):0.391|0.655,525(0):4.449|5.307,525(0):8.626|11.532 200,4634(9):3.744|6.482,4630(0):0.904|1.317,462(0):0.450|0.678,463(0):5.635|7.451,462(0):11.847|12.898 210,1567(161):6.223|6.673,1567(0):1.312|1.540,156(0):0.701|0.757,155(0):7.851|8.040,157(0):17.377|17.517 220,3125(78):5.695|7.167,3126(0):1.142|1.361,312(0):0.610|0.691,315(0):7.122|7.630,310(0):15.943|16.664 230,1913(75):5.546|6.814,1911(0):1.225|1.521,194(0):0.592|0.732,190(0):7.236|7.631,190(0):14.452|15.462 240,2825(39):5.187|6.421,2831(0):1.152|1.677,284(0):0.674|0.809,283(0):6.705|7.467,287(0):14.756|15.847 250,2795(80):5.612|6.583,2790(0):1.147|1.582,277(0):0.629|0.744,280(0):6.924|7.108,277(0):14.721|15.484 260,3200(39):5.114|6.319,3204(0):1.161|1.717,321(0):0.642|0.760,321(0):7.173|8.076,321(0):14.395|14.923 270,2124(136):5.903|6.660,2123(0):1.233|1.612,210(0):0.633|0.835,211(0):7.194|7.598,211(0):15.481|16.417 280,1785(142):5.773|6.158,1781(0):1.269|1.564,181(0):0.755|0.933,180(0):7.181|7.396,177(0):14.987|16.114 290,1649(254):6.228|7.476,1653(0):1.334|1.666,163(0):0.682|0.715,164(0):7.552|7.958,167(0):16.458|18.312 300,1683(181):6.048|6.788,1676(0):1.376|1.725,169(0):0.655|0.721,169(0):7.266|7.550,165(0):15.377|16.599 310,1782(191):6.072|7.079,1785(0):1.342|1.662,179(0):0.708|0.995,178(0):7.479|7.790,182(0):15.789|16.220 320,2122(58):5.375|6.219,2122(0):1.184|1.492,211(0):0.577|0.708,211(0):6.726|7.536,213(0):15.324|16.262 330,2088(9):4.735|5.830,2082(0):1.226|1.573,210(0):0.657|0.808,208(0):5.856|5.963,208(0):13.431|15.987 340,1514(201):5.871|6.529,1524(0):1.292|1.560,151(0):0.742|0.782,151(0):7.418|7.639,154(0):16.177|16.801 350,1897(89):5.645|6.443,1889(0):1.242|1.555,187(0):0.777|0.898,188(0):7.183|7.971,188(0):14.419|14.601 360,2340(18):4.835|6.052,2349(0):1.212|1.869,238(0):0.598|0.685,238(0):6.727|7.723,234(0):13.155|15.648 370,1817(264):6.349|6.903,1807(0):1.371|1.607,180(0):0.785|0.890,181(0):8.153|8.362,182(0):16.410|16.923 380,1592(433):6.465|7.550,1588(0):1.379|1.660,158(0):0.773|0.804,160(0):7.763|7.853,152(0):17.126|17.280 390,1666(420):6.401|7.250,1676(0):1.390|1.560,168(0):0.734|0.764,167(0):7.988|8.532,167(0):16.822|17.297 400,1718(439):6.390|6.753,1704(0):1.359|1.732,172(0):0.748|0.804,169(0):7.749|7.784,178(0):17.143|18.053 410,1576(389):6.431|7.726,1586(0):1.371|1.962,158(0):0.717|0.816,160(0):7.860|8.113,150(0):17.143|17.348 420,1639(404):6.420|6.884,1639(0):1.345|2.205,161(0):0.718|0.981,162(0):7.725|8.204,169(0):16.941|17.532 430,1828(391):6.333|6.998,1828(0):1.363|1.712,185(0):0.712|0.831,184(0):7.781|8.109,183(0):16.935|17.534 440,1693(365):6.427|7.375,1696(0):1.380|1.689,168(0):0.830|0.848,169(0):8.020|8.507,172(0):16.618|16.924 450,1743(403):6.424|7.377,1743(0):1.376|1.610,176(0):0.706|0.857,176(0):7.915|8.236,172(0):16.736|17.716 460,1854(334):6.202|6.753,1853(0):1.341|1.501,185(0):0.724|0.812,183(0):7.673|7.825,185(0):16.963|17.401 470,1944(259):6.271|7.049,1946(0):1.284|1.709,195(0):0.685|0.697,195(0):7.756|8.023,198(0):16.338|18.186 480,1708(407):6.317|7.343,1706(0):1.380|1.881,170(0):0.784|0.855,171(0):7.952|8.688,168(0):17.000|17.313 490,1849(380):6.371|7.301,1851(0):1.344|1.589,185(0):0.741|1.008,186(0):7.992|8.086,185(0):16.715|16.806 500,1518(414):6.470|7.747,1514(0):1.363|1.780,153(0):0.790|0.800,152(0):8.059|8.249,147(0):17.433|17.965 510,1617(397):6.295|7.219,1619(0):1.360|1.852,162(0):0.737|0.882,161(0):7.860|11.366,165(0):16.747|18.100 520,1729(391):6.380|7.159,1726(0):1.436|1.731,171(0):0.707|0.792,173(0):7.879|8.168,172(0):17.220|17.623 530,1628(393):6.353|7.159,1631(0):1.360|1.567,163(0):0.743|0.837,164(0):7.953|8.167,161(0):17.195|18.550 540,1745(382):6.377|6.962,1747(0):1.396|1.697,174(0):0.709|0.951,172(0):7.558|7.684,179(0):17.103|18.918 550,1129(319):6.680|7.058,1117(0):1.452|1.727,115(0):0.755|0.913,117(0):8.050|8.419,116(0):17.458|19.481 560,1062(285):6.842|7.845,1067(0):1.451|1.785,104(0):0.707|0.759,104(0):8.291|8.489,100(0):18.638|19.465 570,980(254):6.661|7.531,959(0):1.532|1.765,99(0):0.892|1.034,100(0):8.231|9.792,105(0):18.520|19.243 580,923(161):7.483|8.429,900(0):2.066|2.429,92(0):0.847|0.861,94(0):13.631|15.379,99(2):19.999|22.666 590,89(24):10.320|10.529,90(0):2.331|2.606,9(0):1.077|1.084,10(0):10.935|12.559,9(1):17.615|22.311 600,1732(264):6.335|6.926,1784(0):1.363|2.580,174(0):0.765|0.967,166(0):7.857|8.124,166(0):17.084|17.509 STOPPINGTHREADS.................................................. <RawResults> [0]sc:100049lt:15157rt:0fl:0 [1]sc:115210lt:0rt:0fl:0 [2]sc:11522lt:0rt:0fl:0 [3]sc:11521lt:0rt:0fl:0 [4]sc:11523lt:3rt:0fl:0 in 600sec. <RawResults2( sum ver.)> [0]sc:100049lt:15157rt:0fl:0 [1]sc:115214lt:0rt:0fl:0 [2]sc:11522lt:0rt:0fl:0 [3]sc:11521lt:0rt:0fl:0 [4]sc:11523lt:3rt:0fl:0 <ConstraintCheck>(allmustbe[OK]) [transactionpercentage] Payment:43.48%(>=43.0%)[OK] Order-Status:4.35%(>=4.0%)[OK] Delivery:4.35%(>=4.0%)[OK] Stock-Level:4.35%(>=4.0%)[OK] [response time (atleast90%passed)] New-Order:86.84%[NG]* Payment:100.00%[OK] Order-Status:100.00%[OK] Delivery:100.00%[OK] Stock-Level:99.97%[OK] <TpmC> 11520.600TpmC 其实测试结果最关键的就是最后一行11520.600 TpmC,下面是介绍一下TpmC是做什么用的 1 流量指标(Throughput,简称tpmC):按照TPC组织的定义,流量指标描述了系统在执行支付操作、订单状态查询、发货和库存状态查询这4种交易的同时,每分钟可以处理多少个新订单交易。所有交易的响应时间必须满足TPC-C测试规范的要求,且各种交易数量所占的比例也应该满足TPC-C测试规范的要求。在这种情况下,流量指标值越大说明系统的联机事务处理能力越高。 具体关于Tpcc介绍可以参考http://baike.baidu.com/view/2776305.htm 3、删除tpcc 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 09:35:47 #timeansible-playbookmysql_tpcc_delete.yml--extra-vars"host=172.17.0.7user=rootwarehouse=50w=50c=50r=120l=600"-k SSHpassword: PLAY[172.17.0.7]************************************************************* GATHERINGFACTS*************************************************************** ok:[172.17.0.7] TASK:[mysql_tpcc_delete|DeleteMysqlTpccDatabase]************************ changed:[172.17.0.7] TASK:[mysql_tpcc_delete|DeleteMysqlTpccDir]***************************** changed:[172.17.0.7] TASK:[mysql_delete|StopMysqlService]************************************* changed:[172.17.0.7] TASK:[mysql_delete|DeleteMysqlBootStartScript]************************* changed:[172.17.0.7] TASK:[mysql_delete|DeleteMysqlDirAndSocket]**************************** changed:[172.17.0.7] TASK:[mysql_delete|DeleteMysqlUser]************************************** changed:[172.17.0.7] TASK:[mysql_delete|DeleteMysqlServiceStartScript]********************** changed:[172.17.0.7] PLAYRECAP******************************************************************** 172.17.0.7:ok=8changed=7unreachable=0failed=0 real 0m25.780s user 0m2.446s sys 0m0.408s 如果大家想使用我的例子,可以从github里下载(地址是https://github.com/dl528888/ansible-examples/tree/master/mysql_tpcc_install),然后放到/etc/ansible目录里,下面是内容 本文转自 reinxu 51CTO博客,原文链接:http://blog.51cto.com/dl528888/1545032,如需转载请自行联系原作者

优秀的个人博客,低调大师

关于项目自动化测试架构的改良计划 - 去除动作指令

因为我们在test_suite.xml中定义了多个动作指令,比如<add_elements>,<update_elements>等,他们指示让我们Engine来对最终数据进行操作,这些动作指令不是数据,因此,他们并不包含在我们最终的数据结果集中,所以我们必须对他们进行移除。所以我们用以下代码来进行移除工作: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 public class XMLManipulator { public static String removeModifyConfFromXML(String xmlString) throws Exception{ Document doc = null ; doc = DocumentHelper.parseText(xmlString); //remove the <add_elements> from the target xml List<Node> addPart = doc.selectNodes( "/test_suite/test_case/add_elements" ); for (Node node: addPart){ node.getParent().remove(node); } //remove the <add_elements> from the target xml List<Node> updatePart = doc.selectNodes( "/test_suite/test_case/update_elements" ); for (Node node: updatePart){ node.getParent().remove(node); } //remove the <remove_elements> from the target xml List<Node> removePart = doc.selectNodes( "/test_suite/test_case/remove_elements" ); for (Node node: removePart){ node.getParent().remove(node); } //find document again return doc.asXML(); } .. } 这样最终的xml文件就不包含这些动作指令的代码片段了。 本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/1221739,如需转载请自行联系原作者

优秀的个人博客,低调大师

智能运维:美团SQL Advisor的自动化SQL优化实现

介绍 在数据库运维过程中,优化 SQL 是 DBA 团队的日常任务。例行 SQL 优化,不仅可以提升程序性能,还能够降低线上故障的概率。 目前常用的 SQL 优化方式包括但不限于:业务层优化、SQL逻辑优化、索引优化等。其中索引优化通常通过调整索引或新增索引从而达到 SQL 优化的目的。索引优化往往可以在短时间内产生非常巨大的效果。如果能够将索引优化转化成工具化、标准化的流程,减少人工介入的工作量,无疑会大大提高DBA的工作效率。 SQLAdvisor 是由美团点评公司北京DBA团队开发维护的 SQL 优化工具:输入SQL,输出索引优化建议。 它基于 MySQL 原生词法解析,再结合 SQL 中的 where 条件以及字段选择度、聚合条件、多表 Join 关系等最终输出最优的索引优化建议。目前SQLAdvisor 在公司内部大量使用,较为成熟、稳定。 现在,我们非常高兴地将 SQLAdvisor 开源,项目 GitHub 地址:https://github.com/Meituan-Dianping/SQLAdvisor。我们已经把相关开发工作全面转到 GitHub 上,开源版本和内部使用版本保持完全一致。希望与业内有类似需求的团队,一起打造一款优秀的 SQL 优化产品。 SQLAdvisor架构流程图: SQLAdvisor使用举例 sql: SELECT id FROM crm_loan WHERE id_card = '1234567' cmd: ./sqladvisor -h xx -P xx -u xx -pxx -d xx -q "SELECT id FROM crm_loan WHERE id_card = '1234567'" SQLAdvisor输出: alter table crm_loan add index idx_id_card(id_card) SQLAdvisor的优点 基于 MySQL 原生词法解析,充分保证词法解析的性能、准确定以及稳定性; 支持常见的 SQL(Insert/Delete/Update/Select); 支持多表 Join 并自动逻辑选定驱动表; 支持聚合条件 Order by 和 Group by; 过滤表中已存在的索引。 SQLAdvisor原理介绍 join处理 Join语法分为两种:Join on 和 Join using,并且 Join on 有时会存在 where 条件中。 分析 Join 条件首先会得到一个 nested_join 的 table list,通过判断它的 join_using_fields 字段是否为空来区分 Join on 与 Join using。 生成的 table list 以二叉树的形式进行存储,以后序遍历的方式对二叉树进行遍历。 生成内部解析树时,right Join 会转换成 left Join。 Join 条件会存在当层的叶子节点上,如果左右节点都是叶子节点,会存在右叶子节点。 每一个非叶子节点代表一次 Join 的结果。 上述实现时,涉及的函数为:mysql_sql_parse_join(TABLE_LISTjoin_table) mysql_sql_parse_join(Itemjoin_condition),主要流程图如下: where处理 主要是提取 SQL 语句的 where 条件。where 条件中一般由 AND 和 OR 连接符进行连接,因为 OR 比较难以处理,所以忽略,只处理 AND 连接符。 由于 where 条件中可以存在 Join 条件,因此需要进行区分。 依次获取 where 条件,当条件中的操作符是 like,如果不是前缀匹配则丢弃这个条件。 根据条件计算字段的区分度按照高低进行倒序排,如果小于30则丢弃。同时使用最左原则将 where 条件进行有序排列。 计算区分度 通过 “show table status like” 获得表的总行数 table_count。 通过计算选择表中已存在的区分度最高的索引 best_index,同时Primary key > Unique key > 一般索引。 通过计算获取数据采样的起始值offset与采样范围rand_rows: offset = (table_count / 2) > 10W ? 10W : (table_count / 2) rand_rows =(table_count / 2) > 1W ? 1W : (table_count / 2) 使用select count(1) from (select field from table force index(best_index) order by cl.. desc limit rand_rows) where field_print 得到满足条件的rows。 cardinality = rows == 0 ? rand_rows : rand_rows / rows; 计算完成选择度后,会根据选择度大小,将该条件添加到该表中的备选索引中。 主要涉及的函数为:mysql_sql_parse_field_cardinality_new()计算选择度。 添加备选索引 mysql_sql_parse_index()将条件按照选择度添加到备选索引链表中 上述两函数的流程图如下所示: Group 与 Order 处理 1.Group 字段与 Order 字段能否用上索引,需要满足如下条件: 涉及到的字段必须来自于同一张表,并且这张表必须是确定下来的驱动表。 Group by 优于 Order by, 两者只能同时存在一个。 Order by 字段的排序方向必须完全一致,否则丢弃整个 Order by 字段列。 当 Order by 条件中包含主键时,如果主键字段为 Order by。 字段列末尾,忽略该主键,否则丢弃整个 Order by 字段列。 2.整个索引列排序优先级:等值>(group by | order by )> 非等值。 3.该过程中设计的函数主要有: mysql_sql_parse_group() 判断 Group 后的字段是否均来自于同一张表。 mysql_sql_parse_order() 判断 Order 后的条件是否可以使用。 mysql_sql_parse_group_order_add() 将字段依次按照规则添加到备选索引链表中。 驱动表选择 经过前期的 where 解析、Join 解析,已经将 SQL 中表关联关系存储起来,并且按照一定逻辑将候选驱动表确定下来。 在侯选驱动表中,按照每一张表的侯选索引字段中第一个字段进行计算表中结果集大小。 使用 explain select * from table where field 来计算表中结果集。 结果集小最小的被确为驱动表。 步骤中涉及的函数为:final_table_drived(),在该函数中,调用了函数 get_join_table_result_set() 来获取每张驱动候选表的行数。 添加被驱动表备选索引 通过上述过程,已经选择了驱动表,也通过解析保存了语句中的条件。 由于选定了驱动表,因此需要对被驱动表的索引,根据 Join 条件进行添加。 该过程涉及的函数主要是:mysql_index_add_condition_field(),流程如下: 输出建议 通过上述步骤,已经将每张表的备选索引键全部保存。此时,只要判断每张表中的候选索引键是否在实际表中已存在。没有索引,则给出建议增加对应的索引。 该步骤涉及的函数是:print_index() ,主要的流程图为: SQLAdvisor版本更新 Functionality Added or Changed 调整架构将 SQLParser 与 SQLAdvisor 模块隔离,方便调试。 重新架构多表 Join 关系的 find_join_elements() 函数,思路更加清晰。 修改选定驱动表的策略,确保驱动表为小结果集。 添加 where 条件中的 like 处理。 优化 Order by 逻辑,忽略 Order by primary key 场景。 输出索引建议前,增加判断索引是否已存在。 Bugs Fixed 修复 SQL 无法处理中文问题。 修复字段多次出现在 where 条件中从而导致多次出现在索引列中问题。 修复在 find_best_index() 函数中,对 MySQL API 中的 result 对象提前 free,导致指针失效问题。 原文发布时间为:2017-10-24 本文来自云栖社区合作伙伴“数据和云”,了解相关信息可以关注“数据和云”微信公众号

优秀的个人博客,低调大师

《Oracle高性能自动化运维》一一3.1 Redo功能用途

3.1 Redo功能用途Redo是Oracle数据库最重要的组成部分之一,其主要功能有:数据库恢复(Recovery):数据库出现异常故障时,可以利用Redo实现数据库级的恢复;介质恢复(Media Recovery):数据库物理介质异常(丢失、坏块等情况)时,可以利用Redo进行介质恢复;实例恢复(Instance Recovery):数据库实例异常崩溃时,可以借助Redo自动进行实例恢复;日志挖掘(Log Miner):数据库业务数据异常(误删除数据等情况)时,可以借助日志挖掘还原业务数据;流复制(Stream):可以借助Redo流复制实现数据同步功能;数据安全卫士(DataGuard):通过将主库(Master)节点的Redo传递、应用到从库(Standby),实现数据库架构层面的高可用性以及读写分离;数据同步(Golden

优秀的个人博客,低调大师

腾讯Android自动化测试实战3.3.1 控件ID相同时获取控件

3.3 Robotium实践运用 3.3.1 控件ID相同时获取控件 实际界面中常常有一些子控件是相同ID甚至没有ID的,但这时候一般其父视图是有ID的。如图3-14所示,每个TAB的控件ID是相同的。 图3-14 拥有相同ID的底部TAB 因为界面中也很可能会出现多个发现、游戏这样的文本,因此也不能采取类似getText(“发现”)这样的方式。这里,我们就可以通过ID获取唯一父控件,再通过过滤方式获取指定的控件。 //先根据ID获得唯一的布局LinearLayout LinearLayout mTabs = (LinearLayout)solo.getView("main_tabs"); //然后通过过滤方式获取该LinearLayout下的所有文本控件 ArrayList<TextView> tabs = solo

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册