关于
自动化测试,经常被问到元素的定位。 很多时间我也帮不了你解决实际的问题,只能从个人脚本谈谈如何看待这些问题。
不得不说之元素定位
虽然,本章写了十几篇
文章来讲元素的定位与操作,对于碰到的一些常见功能,如何通过技巧来定位它们,但是在实际的自动化脚本开发中,不管是新手还是具有一定经验的老手,我们面临最多的问题仍然是元素的定位问题。
有时间元素定位非常简单,例如,我们只要知道这个元素有的id和name 就可以轻松的来定位到它;有时间元素的定位却非常的令人非常头疼,尽管我们用尽了所以办法,仍然无法定位到它。在这里笔者也没万能的方法来帮你解决这些实际问题。
评估自动化可行性
对于不同的
web项目,所用到的前端技术也不同,有些项目会用到EXT(一个强在的js类库),有些会用到AJAX(一种创建交互式网页应用的网页开发技术),这些技术的应用无疑对于前端开发人员可以快速的生成所需要的页面,但对于UI自动化测试人员来说,增加了定位页面元素的难度。
所以,在进行项目实现UI自动化评估的时候,页面元素的定位难度也是一个评估标准,如果处处都是很难定位的元素,那么无疑会增加脚本的开发与维护的成本,得不偿失。这个时候我可以考虑将更新多的精力放在单元或接口层的自动化上。
提高技术能力
对于自动化测试人员来说,如果熟悉前端技术也会大在降低你定位难度,熟练使用XPath和CSS技术会使你的定位变得容易很多,如果精通javascript、jquery 等技术,那么使你的定位之路变得更加随心所欲。
规范前端开发
在我们尝试实施的web项目中,大多数在设计初期,前端并没考虑到需要UI层的自动化,所以,有些前端开发人员以实现功能为目的,前端页面的代码相当不规范。这个也是自动化测试定位难的重要原因。如果开发人员在设计代码的时候规范的为元素加上id 和name属性的话,那我们的定们将会变得容易很多。
很多测试人员在对项目进行
学习和实施自动化测试的过程总是觉得困难重重,就是因为这些普遍的客观原因所造成的。一方面,我们要努力学好技术,克服这些困难。另一方面,我们要清楚的认识到,自动化技术的应用与实践不是一个人的战斗。一定要得到整个团队的配合与支持。
当然,站在公司的立场,不能带来收益的事情是很难得到支持的,这个就需要读者去综合评估目前的产品真的适合引入自动化么?或者目前的阶段真的迫切需要自动化么?
VOC:Voice Of Customer, 根据每天的电话求助量,机器人咨询量、人工咨询量、云客服咨询量等数据出发,关联到具体问题、产品、部门等信息上分析并展现出会员最大痛点。
VOC 的数据报表的最终展现分为两个过程
1、获取源数据并整合数据为最终表
2、数据关联到问题、产品、部门后进行分析展现
针对这两个过程,测试方法也分别两个步骤
一、 获取源数据并整合数据为最终表-ETL过程
实现方式:云梯、hive脚本、datax
开发跟进业务需求了解原始表结构,编写hive脚本,“在云端”平台上运行,获取最终表,使用dataX工具将数据导入到线上
数据库 平台:在云端(内部系统)
Datax:离线同步工具
对应的测试方法
1、最终表的正确性
常见的测试方式:测试中间表的正确性、抽样或全量数据比对、hive脚本review
因为voc对应的最终表的获取逻辑相对简单,所以选择的测试方式是hive脚本review,前提条件是要先了解各个源数据表的含义及结构,对原始数据表非常了解就很容易发现问题,尤其是一些特殊值的处理
举个例子
create table if not exists r_yunong_rest ( #新建一个中间表 report_date string, prd_code string, question_code string, date_type string, value_type string, base_value string, gmt_create string, gmt_modified string ) partitioned by (pt string) row format delimited fields terminated by '\"' lines terminated by '\n' STORED AS TEXTFILE; insert overwrite table r_yunong_test #表数据插入 PARTITION (pt='$env.lastPartition') select report_date, prd_code, question_code, 'D' as date_type, '01'as value_type count(case when sid is not null then sid when caseid is not null then caseid else null end) as base_value, #特殊字段的处理,验证重点 '$env.date' as gmt_create, '$env.date' as gmt_modified from r_test #从另一个已创建的中间表r_voc_fact_question获取数据 where pt='$env.lastPartition' and question_code <>'unknown' group by report_date,prd_code,question_code; |
这个过程中需要关注的问题
1、 数据不完整
2、 数据不准确
3、 某些数据需要特殊处理,比如为null、为0的情况
4、 发现原始表数据质量不理想,需要进行处理
二、数据关联到问题、产品、部门等进行分析展现—逻辑代码
平台实现了将传入的参数组装成一条复杂的sql语句,将源数据关联到产品数据、问题点数、时间数据后的数据结果输出。
所以验证的是报表数据的正确性,简单来说就是验证一条复杂sql写的对不对,采用的测试方式是根据业务理解测试整理出对应sql,输出数据,和系统输出的数据进行对比
测试要点
1、表结构设计决定业务拓展性 例 测试过程中发现有些元数据表必须是唯一性的
2、对整个数据库设计非常了解,明确每个表的业务定位
举个栗子
某业务 测试验证sql
select f.date_id,d.issue_name,sum(f.all_qz_cnt) from voc_tb_*** f, voc_issue_*** d, bi_time_*** t, voc_prd_*** v where d.issue_code = f.issue_codes and v.id = f.prd_id_sk and t.date_id = f.date_id and v.prd_id=711 and t.day = 20140316 group by f.issue_code order by sum(f.all_qz_cnt) desc |
开发sql
SELECT bi_time_***.day,voc_prd_***.prd_id,voc_issue_***.issue_code,sum(voc_tb_***.all_qz_cnt) as index_135 FROM voc_tb_*** LEFT JOIN voc_issue_*** ON voc_tb_***.issue_code = voc_issue_***.issue_code and voc_issue_***.flow_step=voc_tb_***.dim7 LEFT JOIN voc_prd_*** ON voc_tb_***.prd_id_sk = voc_prd_***.id LEFT JOIN bi_time_*** ON voc_tb_***.date_id = bi_time_***.date_id WHERE voc_prd_***.prd_id=711 and bi_time_***.day=20140316 GROUP BY bi_time_***.day,voc_prd_***.prd_id,voc_issue_***.issue_code ORDER BY index_135 desc |
发现的问题:表voc_issue_***中的issue_code不是唯一值,LEFT JOIN的特性使非唯一issue_code的sum(f.all_qz_cnt)值翻倍了,解决方案是,表voc_issue_***的的业务定位修改,作为issue_code的元数据表
这个过程中需要关注的问题
1、数据多样性评估不完整,导致部分数据未被统计
2、表定位错误,比如上面的例子说明的问题
三、综述
1、数据是否可以提取极大的依赖于原始数据本身的健壮性,原始数据质量很大程度上决定分析数据的效果
2、对于这类数据产品,测试侧重点主要是:数据完整性、数据准确性、数据有效性、业务合理性
大家在使用linux过程当中肯定遇到过磁盘乱序的问题。一般情况下引起磁盘乱序有几种可能,比如磁盘是通过raid卡连接到服务器的,raid卡电池没电来,这时候如果服务器掉电的情况下可能会引起磁盘乱序。再就是比如新的服务器,但raid驱动是比较老的版本,一旦重启也经常会有乱序的可能。再就是服务器磁盘较多,sata/ssd存在混用的情况下也会有乱序的可能。
针对这种乱序的情况应该如何解决呢?这里我总结了一种比较好的结局方法。下面这个脚本的目的是通过udevinfo(centos5)或者udevadm(centos6)来获得磁盘的设备号,这个设备号是不会随着服务器的重启而改变的。获得这个设备号后在/dev/下生成以slot0开通的相应的设备,比如有5块磁盘则生成slot0-4这样5个设备。这时候再挂载的时候用这些槽号来挂载就ok来。脚本如下:
#!/bin/bash #set -x function get_release() { while read i do release=`echo "$i" |grep"release" |awk '{print $3;}'` main_version=${release:0:1} if [ ! -z $main_version ] then echo $main_version return 0 fi done < "/etc/redhat-release" return 1 } function get_id_serial() { device=$1; if [ -z "$device" ] then return -1 fi device=`basename $device` main_version=`get_release` if [ $? -ne 0 ] then echo "get centos release versionerror" 1>&2 return $? fi case $main_version in "5" ) cmd="/usr/bin/udevinfo-q all -n $device" ;; "6" ) cmd="/sbin/udevadminfo --query=all --name=$device" ;; esac ID_SERIAL=$( $cmd |grep"ID_SERIAL=" |awk -F '=' '{print $2;}') if [ -z $ID_SERIAL ] then return 1 fi echo -n "$ID_SERIAL" return 0 } diskctl_config="/etc/udev/rules.d/99-hd.rules" rm -rf $diskctl_config diskctl_db="/usr/diskctl/diskctl.db" rm -rf $diskctl_db mkdir -p /usr/diskctl touch $diskctl_db index=0 for i in /dev/sd*[a-z] do device=`basename $i` ID_SERIAL=`get_id_serial $i` if [ $? -ne 0 ] then echo "FATAL: get ID_SERIAL error" 1>&2 exit 1 fi slot=`printf "slot%02d" $index` echo"KERNEL==\"sd*[a-z]\",ACTION==\"add\",ENV{ID_SERIAL}==\"$ID_SERIAL\",SYMLINK+=\"$slot\"">> $diskctl_config echo"KERNEL==\"sd*[0-9]\",ACTION==\"add\",ENV{ID_SERIAL}==\"$ID_SERIAL\",SYMLINK+=\"$slot-part%n\"">> $diskctl_config echo"KERNEL==\"sd*[a-z]\",ACTION==\"remove\",ENV{ID_SERIAL}==\"$ID_SERIAL\",RUN+=\"/bin/rm-f /dev/$slot /dev/$slot-part*\"" >> $diskctl_config echo "#split$ID_SERIAL#############################" >> $diskctl_config ID_SN=`smartctl -i $i 2>/dev/null |grep"Serial\s*number" -i |awk '{print $3;}'` if [ -z "$ID_SN" ] then ID_SN="error" fi echo "$slot $ID_SERIAL $ID_SN" >> $diskctl_db ((index=index+1)) Done /sbin/udevcontrolreload_rules /sbin/start_udev /etc/fstab里面以类似下面的方式来挂载: /dev/slot02 /data02 ext4 defaults 0 0 /dev/slot03 /data03 ext4 defaults 0 0 /dev/slot04 /data04 ext4 defaults 0 0 |
之前也写过一篇类似的,虽然恢复不成问题,但总感觉有不对的地方,后面才了解到,以前自己有存在误区的地方,重新用此文方法简便得多。
环境:CentOS release 5.6 (Final)
Oracle Database Release 11.2.0.1.0
[root@OATest oabak]# tar -jxvf testoa_20140702.tar.bz2
2、还原文件
[root@OATest temp]# su - oracle
[oracle@OATest /]$ export ORACLE_SID=testoa
[oracle@OATest /]$ sqlplus "/as sysdba";
OPEN_MODE
--------------------
READ WRITE
3、关闭数据库
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> exit
4、在sql模式下直接质数据库物理文件至相应的目录(先显示各类文件的路径所在,后拷贝到相应路径) --显示控制文件 select name from v$controlfile; --显示数据文件 select name from v$datafile; --显示延续性的初始化参数文件(延续性:对初始化参数的在线修改可以直接作用到参数文件中) show parameter spfile; --显示日志文件 select member from v$logfile; --orapw$ORACLE_SID密码文件:password file路径 在$ORACLE_HOME/dbs/orapw$ORACLE_SID //跟备份关系不大,可以随时生成。 [oracle@OATest temp]$ sqlplus "/as sysdba"; host cp /usr/oabak/temp/control01.ctl /app/oracle/oradata/testoa/control01.ctl host cp /usr/oabak/temp/control02.ctl /app/oracle/flash_recovery_area/testoa/control02.ctl host cp /usr/oabak/temp/system01.dbf /app/oracle/oradata/testoa/system01.dbf host cp /usr/oabak/temp/sysaux01.dbf /app/oracle/oradata/testoa/sysaux01.dbf host cp /usr/oabak/temp/undotbs01.dbf /app/oracle/oradata/testoa/undotbs01.dbf host cp /usr/oabak/temp/users01.dbf /app/oracle/oradata/testoa/users01.dbf host cp /usr/oabak/temp/redo03.log /app/oracle/oradata/testoa/redo03.log host cp /usr/oabak/temp/redo02.log /app/oracle/oradata/testoa/redo02.log host cp /usr/oabak/temp/redo01.log /app/oracle/oradata/testoa/redo01.log host cp /usr/oabak/temp/spfile${ORACLE_SID}.ora $ORACLE_HOME/dbs/ host cp /usr/oabak/temp/orapw${ORACLE_SID} $ORACLE_HOME/dbs/ |
--要删除临时文件, 重启的时候会自动创建temp01.dbf
若不删除临时文件,会出现下面的报错:
ORA-01187: cannot read from file because it failed verification tests
ORA-01110: data file 201: '/app/oracle/oradata/testoa/temp01.dbf'
恢复文件时候没有删除,旧的临时表空间数据文件(300MB),无法创建新的临时表空间文件(500MB) ..所以一直报错
5、启动数据库
SQL> startup ORACLE instance started. Total System Global Area 4275781632 bytes Fixed Size 2220200 bytes Variable Size 2113933144 bytes Database Buffers 2147483648 bytes Redo Buffers 12144640 bytes Database mounted. Database opened. SQL> exit |
6、修改用户密码
SQL> alter user oaadmin identified by oaadmin;
User altered.
7、解锁帐户
SQL> alter user oaadmin account unlock;
User altered.
上面第4步也可以利用一条命令直接处理:
select 'host cp /u03/backup/'||substr(name,(instr(name,'/',-1)+1))|| ' '||name from v$controlfile union all select 'host cp /u03/backup/'||substr(name,(instr(name,'/',-1)+1))|| ' '||name from v$controlfile union all select 'host cp /u03/backup/'||substr(member,(instr(member,'/',-1)+1)) ||' '||member from v$logfile union all select 'host cp /u03/backup/spfile${ORACLE_SID}.ora $ORACLE_HOME/dbs/' from dual union all select 'host cp /u03/backup/orapw${ORACLE_SID} $ORACLE_HOME/dbs/' from dual; |
计算机高级语言按程序的执行方式可分为:编译型语言和解释型语言。
编译型语言是指使用专门的编译器、针对特定的平台,将源程序编译成该平台可以执行的机器码(包括机器指令和操作数),即目标程序,编译结束后,可能还需要链接其他目标程序,最终生成可执行性程序,实现底层次的复用。编译生成的可执行性程序可以脱离开发环境,在特定的平台上独立运行。但是编译型语言的程序平台依赖性强,当移植到其他平台上时需要重新编译。这类语言现有C ,C++,FORTRAN,Pascal等。
解释型语言是指使用专门解释器对源程序逐行解释成特定平台上的机器码,它将编译和解释混合在一起同时来完成,每次执行解释性语言的程序都要进行一次编译,因此效率比较低,但有个优点就是跨平台性好,只有要提供特定平台的解释器,就可解释成该平台上的机器指令。现有的
Ruby,Python等语言都是解释性语言。
java是一种特殊的高级语言, 它既是编译型语言又是解释型语言,需要先编译后解释。首先由编译器编译成与平台无关的字节码(也就是.class文件),当然,这个字节码时不可执行的,必须用java解释器来解释执行。java语言里谁来负责解释执行字节码文件呢——java虚拟机(JVM),所有平台上JVM向编译器提供接口,编译成虚拟机能够理解字节码,然后由虚拟机来解释执行。
当使用Java编译器编译java程序时,生成与平台无关的字节码,它不需要面向特定平台,而只面向JVM。不同平台的JVM不同,但他们提供了相同的接口。JVM是java跨平台的关键部分。
戴明(Deming,1900~1993年)是美国的
质量管理专家。从1950年开始,戴明多次到日本,向日本的工商界人士传授一套统计质量管理的思想。可以认为,戴明对于日本的战后复兴立下了巨大功绩。由于从20世纪70年代后期到80年代以后日本企业的崛起,导致美国企业开始进行反思,它们也开始接受戴明的理念。戴明所提出的企业界人士必须接受的14点是对他的管理理念的概括和总结。
1、树立改进产品和服务的长久使命,以使企业保持竞争力,确保企业的生存和发展,并能够向人们提供
工作机会。
这一点颇有渊源,实际上是1950年戴明向日本企业家开出的一个治病的药方。当时日本处于战后的一片废墟中,处于民不聊生的状态,而戴明向日本的工商界人士建议通过改进质量,就可以提升企业的竞争力,企业的竞争力大了就可以增加份额,企业的份额多了就可以为很多人创造工作。
改进质量→提升企业的竞争力→增加份额→增加工作机会,这个药方后来被称为戴明的链式反应。
2、接受新的理念。
在一个新的经济时代,管理者必须意识到自己的责任,直面挑战,领导变革。20世纪80年代以后,世界进入了一个新的经济时期,从过去的供不应求,进入了相对过剩的时代,这时只有彻底地转变观念,才能够迎接挑战。
3、不要将质量依赖于检验。
检验对于质量是无济于事的,只不过是对结果的一种确认而已。
4、不要只是根据价格来做生意,要着眼于总成本最低,要立足于长期的忠诚和信任,最终做到一种物品只同一个供应商打交道。
从质量管理的角度来看,系统输入的种类越多,或者变异性越大,那么输出变异也会越大。因此希望输入的原材料能够尽可能地单一品种,这样有利于保证质量。
5、通过持续不断地改进生产和服务系统来实现质量与生产率的改进及成本的降低。
质量、生产率和成本是系统的输出,只有通过改进系统才能同时实现这三个重要指标的改进。
6、做好培训。
很多情况下,人们会由于没有充分的培训而做不好工作。
7、进行领导。
领导意味着帮助人们把工作做好,而不是指手划脚或者惩罚威吓。
8、驱除恐惧,以使每一个人都能为组织有效地工作。
由于恐惧而造成的经济损失是惊人的。例如由于恐惧使人们不敢提问题,但是最愚蠢的提问也胜于不提问。
9、拆除部门间的壁垒。
不同部门的成员,应当以一种团队的方式工作,以发现和解决产品和服务在生产和使用中可能遇到的问题。企业再造就是一种拆除壁垒的举措。
10、取消面向一般员工的口号标语和数字目标。
质量和生产率低下的大部分原因在于系统。一般员工不可能解决所有问题,假如没有一个好的系统,仅仅在口号、数字上花工夫是无济于事的。
11、取消定额或者指标。
单纯地强调定额或指标,人们会关注数量而忘掉了质量。
12、消除影响工作完美的障碍。
一般地来说,人们愿意把工作做好,可是愿意做好工作并不等于就能够做好工作。
13、开展强有力的教育和自我提高活动。
这是针对组织成员的要求,前面比较多的强调了要改进系统,而这条是说组织中的每一个成员都有义务提升自己。过去多少年来,很多企业提的是终身雇佣;在今天这样的经营环境下,再没有什么企业可以提出终身雇佣的保镖了,但是可以提出确保人们树立起终身可雇佣的能力。
14、实现转变是每一个员工的义务。
让组织中的每一个人都参与到转变中来。
这14条看似零乱,但是如果细加揣摩,实际上它无非强调了我们多次重复的一个观念,就是第五条所说的,要通过不断地改进系统,实现高质量、低成本和高生产率。针对系统或者过程进行努力,这是在治本;如果单纯地针对质量抓质量,针对成本抓成本,针对生产率抓生产率,只不过是治标而已。所以戴明14点概括为一句口号:系统驱动行为。戴明曾经说过,管理中的问题,应当由普通员工或者普通雇员承担的责任充其量连15%都不到,85%都是由于系统造成的。所以管理者要把精力放在改造系统上。
总的来说,管理学中相当一部分内容是在强调过程,过程是理解现代管理的一把钥匙。企业只有通过持续不断地改进过程或系统,才能够有效地提高质量,降低成本,提高生产率。面向过程的管理是一种治本的管理。理解了过程这个概念,就可以理解管理学的大多数内容。例如ISO9000标准,可以看作是从整体上对企业的过程所进行的规划和安排。而标高超越以及6∑管理可以看作是局部的、渐进的过程改进的方法论;企业再造则是从整体上对企业的过程所进行的彻底改造。戴明等人所推行的SPC(即统计质量控制方法),是运用统计方法。
戴明的观点:鼓励改革, 持续改善, 强调改善而不是检查, Zero Defect, 强调TEAMWORK, 降低成本(cost down), 鼓励自我开发, 其观点实际是与QS 9000的精神, 6SIGMA活动的目的是完全一致的。
最近有几个学员问道关于90%的响应时间不太理解,顾摘录如下内容供大家参考:
官方解释:
Solution: The 90th percentile is the value for which 90% of the data points are smaller
The 90th percentile is a measure of stastical distribution, not unlike the median. The median is the middle value. The median is the value for which 50% of the values were bigger, and 50% smaller. The 90th percentile tells you the value for which 90% of the data points are smaller and 10% are bigger.
Statistically, to calculate the 90th percentile value:
1. Sort the transaction instances by their value.
2. Remove the top 10% instances.
3. The highest value left is the 90th percentile.
由此可见,仅仅有平均事务响应时间是不够的。因为平均事务响应时间满足了性能需求,未必就表示系统的性能已经满足了绝大多数用户的要求。
假如有两组
测试结果,响应时间分别是 {1,3,5,10,16} 和 {5,6,7,8,9},它们的平均值都是7,你认为哪次测试的结果更理想?
所以
1)90%响应时间它是统计响应时间的参数,带有统计学意义,是科学性的;
2)可以这样理解,这个事务所有的运行次数中,90%的次数落在这个响应时间里;(90%的响应时间不超过XX秒)
4)为了真实的评估软件性能,建议让测试场景执行较长的时间,让工具采集更多数据,数据越多,在概率论中的数据分布中看,最具有真实性;
5)该参数是
性能测试结果的一个算法,与测试工具无关,无论你是使用LoadRunner、JMeter或其它
性能测试工具,该理论同样适用。
每当用跑用例失败的时候,第一反应就是查看元素定位是不是正确,帮助定位的扩展是必不可少的,但是selenium一般打开的是不带扩展的干净的浏览器,如果操作步骤很长的话,就得手动去执行直到那一步去检查元素,很费时,那怎么样让它打开的是带有扩展的浏览器呢,firefox简单,很多教程一搜照做即可,但chrome我搜索了一个小时都未见到···现在自己想办法解决了,记录下来供以后查阅。
首先进入C:\Users(用户)\你的电脑名称\AppData\Local\Google\Chrome\User Data\Default\Extensions,点开Extensions,里面的文件夹就是安装过的扩展,(记得先把电脑隐藏文件夹显示出来,否则找不到) 但是名字是一堆我看不懂的无序的英文字母,我的办法是一个一个点开找到对应的插件版本号,版本号在chrome Extensions选项里找然后打包你需要的插件:打开chrome的设置,在里面点开扩展程序,选中开发者模式,你安装的插件的下面会出现一个ID,这个ID对应的就是你要打包的插件,然后打包扩展程序,找到对应的文件夹(或者你也可以把这个文件夹复制到电脑任意地方)下面的版本号的文件夹,也就是ID名文件夹内部的那个文件夹,然后点击打包扩展程序,就可以了,会相应的在版本号的同一级地方出现后缀名是crx和pem的文件,这个crx的文件就是我们需要的。准备
工作完成,看代码:
ChromeOptions options = new ChromeOptions(); options.addExtensions(new File("C:\\Users\\swang\\AppData\\Local\\Google\\Chrome\\UserData\\Default\\Extensions\\ijaobnmmgonppmablhldddpfmgpklbfh\\1.6.0_0.crx"));//添加扩展的方法,将crx文件所在的路径添加进去 WebDriver driver=new ChromeDriver(options); |
1、磁盘
在
性能测试中,主要监测磁盘的如下指标来评估磁盘的使用情况:
a、繁忙程度。
b、平均等待时间。
如果磁盘的繁忙程度高,平均等待时间长,则说明磁盘IO是系统性能的瓶颈。
2、网络
性能测试中对网络的监测主要考虑:网络带宽的利用率。网络带宽利用率过高,说明网络带宽可能不足。
3、服务器负载
通过top、vmstat命令查看查看系统负载load average
对于普通的文本输入框,通常要检查以下几点:
1. 中英文空格
2. 字符串首尾含空格
3. 字符串中间含空格
4. 字母
5. 数字
6. 中文
7. 特殊字符
8. null/NULL
9. 超长字符
10. html格式字符串
对于费用类的文本输入框,通常要检查以下几点:
1. 正常整数
2. 正常小数
3. 负数
4. 以0开头/结尾的整数
5. 以0开头/结尾的小数(不是0.多少这种)
6. 超长整数
7. 超长小数
8. 以小数点开头/结束
9. 中英文空格
10. 字母
11.特殊字符
12. 中文
13. 0
14. 小数点多于1个
如最多能输入xxxxxxxx.xx