-
sql server-字符串函数(转载)
2013-01-04 16:22:46
http://www.cnblogs.com/jiajiayuan/archive/2011/06/16/2082488.html以下所有例子均Studnet表为例:
计算字符串长度
len()用来计算字符串的长度select sname ,len(sname) from student字符串转换为大、小写
lower() 用来将一个字符串转换为小写,upper() 用来将一个字符串转换为大写select lower('I AM A STUDENT !')
select upper('i am a student !')截去字符串左、右侧空格
ltrim() 用来将一个字符串左侧的空格去掉 ,rtrim()用来将一个字符串右侧的空格去掉declare @str varchar(100)
set @str=' 我的左侧有空格!'
select @str as 初始字符, len(@str) as 初始长度,ltrim(@str) as 现有字符,len(ltrim(@str)) as 现有长度返回由重复的空格组成的字符串
space(integer_expression) integer_expression 指示空格个数的正整数。如果 integer_expression 为负,则返回空字符串。select 'A'+ space(2)+'B'取子字符串
substring(string,start_position,length) 可以从任意位置取任意长度的子字符串,
left(string,length) 从左侧开始取子字符串
right(string,length)从右侧开始取子字符串select substring('HelloWorld!',6,6)
select left('HelloWorld!' ,5)
select right('HelloWorld!' ,6)字符串替换
replace(string,要被替换的字符串,替换的字符串)select replace('HelloWorld!','o','e') 结果为:HelleWerld!返回字符串值的逆向值
reverse(string_expression)select reverse('abc') 结果为:cba删除指定长度的字符,并在指定的起点处插入另一组字符
stuff(character_expression , start , length ,character_expression)
start 一个整数值,指定删除和插入的开始位置。
length 一个整数,指定要删除的字符数。select stuff('abcdefg',1,6,'Hello ') 结果为:Hello g以指定的次数重复字符串值
replicate(string_expression ,integer_expression)select replicate('abc',4) 结果为:abcabcabcabc返回字符串中指定表达式的开始位置
charindex(expression1 ,expression2 , start_location )或charindex(expression1 ,expression2 )
expression1在expression2 中的开始位置select charindex('H','elloHWorld') 结果为:5返回指定表达式中模式第一次出现的开始位置
patindex('%pattern%',expression) 返回指定表达式中某模式第一次出现的起始位置;
如果在全部有效的文本和字符数据类型中没有找到该模式,则返回零。select patindex('%Hello%','WorldHello') 结果为:6返回输入表达式的第一个字符的整数值
unicode( 'ncharacter_expression' ) ' ncharacter_expression ' 为 nchar 或 nvarchar 表达式。select unicode('a') 结果为:97
select unicode('abc') 结果为:97返回由数字数据转换来的字符数据
str(float_expression , length ,decimal )
float_expression 带小数点的近似数字 (float) 数据类型的表达式。
length 总长度。它包括小数点、符号、数字以及空格。默认值为 10。
decimal 小数点右边的小数位数。decimal 必须小于等于 16。如果 decimal 大于 16,则将结果截断为小数点右边的 16 位。select str(123.436,2), len(str(123.436,2)) //当表达式超出指定长度时,字符串为指定长度返回 **
select str(123.436), len(str(123.436)),
str(123.436,6), len(str(123.436,6)),
str(123.436,6,1), len(str(123.436,6,1)) //由六个数字和一个小数点组成的表达式转换为有六个位置的字符串。
数字的小数部分舍入为一个小数位。
select str(1234.436), len(str(1234.436)),
str(1234.436,6), len(str(1234.436,6)),
str(1234.436,6,1),len(str(1234.436,6,1))结果为:
得到字符的ASCII码
ascii()用来得到一个字符的ASCII码,它有且只有一个参数,如果参数为字符串,那么取第一个字符的ASCII码select ascii('H')
select ascii('HelloWorld!')得到一个与ASCII码数字对应的字符
Char(integer_expression) integer_expression 介于 0 和 255 之间的整数。如果该整数表达式不在此范围内,将返回 NULL 值。select Char(72)返回返回具有指定的整数代码的 Unicode 字符
nchar(integer_expression) integer_expression 介于 0 与 65535 之间的正整数。如果指定了超出此范围的值,将返回 NULL。select nchar(1000)返回带有分隔符的 Unicode 字符串,分隔符的加入可使输入的字符串成为有效的 SQL Server 分隔标识符。
quotename('character_string') character_string 不得超过 128 个字符。超过 128 个字符的输入将返回 NULL。select quotename('abc[aa]def')结果为:[abc[]]def] 请注意,字符串 abc[]def 中的右方括号有两个,用于指示转义符。
select QUOTENAME('abcdef','''') --分隔符是两个单引号
-- 'abcdef'
select QUOTENAME('abcdef') --分隔符是]
-- [abcdef]
select QUOTENAME('abcdef','{}') --分隔符是}
-- {abcdef}发音匹配度
有时候我们并不知道一个人姓名的拼写,但是我们知道他的发音,这时我们可以进行发音的匹配度测试。
soundex()用于计算一个字符串的发音特征性,这个特征值为一个四个字符的字符串,特征性的第一个字符总是初始字符串中的第一个字符,而后是一个三位数的数值。select sname ,soundex(sname) from student结果为:
发音特征值的含义非常复杂,如果要根据两个发音特征值来分析两个字符串的发音相似度的话非常麻烦。
可以使用difference()来简化两个字符串的发音相似度比较,它可以计算两个字符串的发音特征值,并且比较它们,
然后返回一个0~4之间的值来反映两个字符串的发音相似度,这个值越大则表示两个字符串的发音相似度越大。select sname,soundex(sname), difference(sname,'Herry') from stu结果为:
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,并在文章页面明显位置以超链接形式注明出处,否则保留追究法律责任的权利。
-
SQL 时间类型的模糊查询
2012-09-14 14:06:12
今儿想用模糊查询来查某一天的数据,被提示语句错误。查了一下才发现该模糊查询只能用于String类型的字段。后来网上搜索到三种对时间的模糊查询方法,记在这里,以备后用:1.Convert转成String,在用Like查询。
select * from table1 where convert(varchar,date,120) like '2006-04-01%'
2.Between
select * from table1 where time between '2006-4-1 0:00:00' and '2006-4-1 24:59:59'";
3 datediff()函数
select * from table1 where datediff(day,time,'2006-4-1')=0
第一种方法应该适用与任何数据类型;
第二种方法适用String外的类型;
第三种方法则是为date类型定制的比较实用快捷的方法。 -
ruby 异常处理:rescuehttp://www.jb51.net/article/12883.htm
2010-08-11 14:30:13
http://www.jb51.net/article/12883.htm
一个运行着的程序常会遇到意外的问题.一个要读取的文件不存在;当希望存入一些数据时磁盘满了;用户可能输入不恰当的数据.
ruby> file = open("some_file")
ERR: (eval):1:in `open': No such file or directory - some_file
一个健壮的程序会合理并漂亮的处理这些问题.面对那些异常是一件讨人厌的工作.C程序员被要求做到检查每一个可能导致错误发生的系统调用的返回值并立刻做出决定.
FILE *file = fopen("some_file", "r");
if (file == NULL) {
fprintf( stderr, "File doesn't exist.\n" );
exit(1);
}
bytes_read = fread( buf, 1, bytes_desired, file );
if (bytes_read != bytes_desired ) {
/* do more error handling here ... */
}
...
这项无聊的工作会使程序员最终变得马虎并忽略掉它,结果是程序无法应对异常.令一方面,这样也会降低程序的可读性.因为过多的错误处理使有意义的代码也变得杂乱了.
在 Ruby里,就像其它的现代语言,我们可以通过隔离的办法处理代码域里的异常,因此,这有着惊人的效果却又不会为程序员或以后希望读它的其它人造成过度的 负担.代码域由begin开始直到遇到一个异常,这将导致转向一个由rescue标记的错误处理代码域.如果异常没发生,rescue代码就不会使用.下 面的代码返回文本文件的第一行,如果有异常则返回 nil.
def first_line( filename )
begin
file = open("some_file")
info = file.gets
file.close
info # Last thing evaluated is the return value
rescue
nil # Can't read the file? then don't return a string
end
end
有时我们会希望围绕问题展开创造性工作.这里,如果文件不存在,我们用标准输入代替:
begin
file = open("some_file")
rescue
file = STDIN
end
begin
# ... process the input ...
rescue
# ... and deal with any other exceptions here.
end
retry 用于 rescue 代码表示又重新执行 begin 代码.这让我们可以压缩前面的例子:
fname = "some_file"
begin
file = open(fname)
# ... process the input ...
rescue
fname = "STDIN"
retry
end
但这仍有一点瑕疵.一个不存在的文件将导致不停止地 retry.你在使用 retry 做异常处理时应注意到这一点.
每个Ruby库在遇到错误时都会提交一个异常,你可以在自己的代码里明确地提交异常.用 raise 来提交异常.它带一个参数,也就是描述异常的一个字符串.参数是可选的但不应被省略.之后它可以通过一个特殊的全局变量 $! 访问.
ruby> raise "test error"
test error
ruby> begin
| raise "test2"
| rescue
| print "An error occurred: ",$!, "\n"
| end
An error occurred: test2
nil -
在Linux平台上安装和配置Redhat系列下安装rubyOnRails的生产环境(转)
2010-07-15 17:00:27
转发:http://docs.google.com/View?id=dc32cxpz_105hqdqknhq简 单描述
这里介绍的内容是基于redhat系列(rhel或者centos)的。由于各个发行版的情况都有不一样的地方,如果使用的是其他发行版本请自行 google。另外我测试的环境是gcc4.x,这里使用的数据库是oracle,mysql的内容以后再加。 主要软件及用途如下:ruby1.8.7-p72-mbari(ruby解释器,用来解释ruby语言用的)
fcgi(fast cgi运行模块) 一般是使用多进程单线程的运行方式,部署在lighttpd+fcgi(非常高效,安装麻烦),或者nginx+mongrel/thin(高效,安装简 单)的架构上。
rails2.1.2(一个用ruby写的一站式快速开发框架)
oracle10g(数据库)
ruby- oci8(用来和oracle交互用的ruby库)
ruby-odbc(用来 和odbc交互用的ruby库)
RMagick(图形处理库)
memcached(流行的分布式缓存服务器)
lighttpd/nginx(web前端服务器)
mongrel/thin(用 来处理动态请求的http服务器)安 装ruby
http://www.javaeye.com/wiki/rails_deployment/1296-deploy-rails-on-linux
http://www.javaeye.com/news/4592-resolve-memory-leaks-ruby-patch-release
下载ruby 1.8.7-p72.tar.gz和MBARIp72patches.tar.gztar zxvf ruby-1.8.7-p72.tar.gz
备注:如果没有gcc,需要yum install gcc,如果是gcc3.x,需要去掉-fno-stack-protector
tar zxvf MBARIp72patches.tar.gz
解压打补丁命令:
MBARIp72patches/apply ruby-1.8.7-p72
编译ruby,如下:
cd ruby-1.8.7-p72
CFLAGS="-O2 -fno-stack-protector -mpreferred-stack-boundary=2" ./configure --prefix=/usr/local/ruby-1.8.7-p72
make && make install编译之后,编辑/etc/profile,加入
export RUBY_HOME=/usr/local/ruby-1.8.7-p72
PATH=$RUBY_HOME/bin:$PATH执 行source /etc/profile,并使用ruby -v进行验证:
[root@localhost ext]# ruby -v
ruby 1.8.7 (2009-3-1 mbari 8B/0x8770 on patchlevel 72) [i686-linux]下 载rubygems-1.3.1.tgz
tar zxvf rubygems-1.3.1.tgz
并使用gem -v进行验证:
cd rubygems-1.3.1
ruby setup.rb[root@localhost ext]# gem -v
1.3.1安 装ruby-ext:zilb,readline或者openssl
cd ruby-1.8.7-p72/ext/zlib
ruby extconf.rb --with-zlib-include=/usr/include --with-zlib-lib=/usr/lib
make && make install 如果出错,可能需要进行yum install zlib-devel
cd ruby-1.8.7-p72/ext/readline
ruby extconf.rb
make && make install 如果出错,可能需要进行yum install readline-devel
cd ruby-1.8.7-p72/ext/openssl
ruby extconf.rb
make && make install 如果出错,可能需要进行yum install openssl-devel安 装各式各样的gem
gem source -a http://gems.github.com
备注:如果提示g++命令未找到,则yum install gcc-c++
gem install rails --version "2.1.2" --no-rdoc --no-ri
gem install mongrel_cluster --no-rdoc --no-ri
gem install memcache-client --version "1.7.3" --no-rdoc --no-ri
yum install libxml2*
gem install libxml-ruby --version "1.1.3" --no-rdoc --no-ri
gem install spreadsheet --version "0.6.3.1" --no-rdoc --no-ri
gem install uuidtools --version "2.0.0" --no-rdoc --no-ri
gem install composite_primary_keys --version "1.1.0" --no-rdoc --no-ri
gem install rack --no-rdoc --no-ri
gem install thin --no-rdoc --no-ri
gem install dbi --version "0.4.2" --no-rdoc --no-ri
gem install dbd-odbc --version "0.2.5" --no-rdoc --no-ri安 装oracle即时客户端
rpm -ivh oracle-instantclient-basic-10.2.0.4-1.i386.rpm
rpm -ivh oracle-instantclient-devel-10.2.0.4-1.i386.rpm
可选:
#rpm -ivh oracle-instantclient-sqlplus-10.2.0.4-1.i386.rpm
#rpm -ivh oracle-instantclient-jdbc-10.2.0.4-1.i386.rpm修改 /etc/profile,添加
export NLS_LANG="American_America.ZHS16GBK"
export LD_LIBRARY_PATH=/usr/lib/oracle/10.2.0.4/client/lib
PATH=$LD_LIBRARY_PATH:$PATH 执行source /etc/profile下载ruby-oci8-1.0.6.tar.gz
tar zxvf ruby-oci8-1.0.6.tar.gz
cd ruby-oci8-1.0.6
ruby setup.rb config
ruby setup.rb setup
ruby setup.rb install验证ruby- oci8安装情况
[root@localhost i686-linux]# irb
如果出错的话(cannot restore segment prot after reloc: Permission denied), 需要执行/usr/sbin/setenforce 0来临时关闭selinux 也可以修改/etc/selinux/config把enforcing修改成disabled并重启
irb(main):001:0> require 'oci8'
=> true安装 odbc
有时候我们需要用到sqlserver这样的东西,在linux上弄这个还是比较麻烦的。我们采取的方案是 unixODBC+freeTDS+ruby-odbc+dbi(dbd-odbc)的方式(我们并不打算使用orm)。首先需要安装的是 freeTDS(*unix下用来访问sybase和sqlserver的工具)和unixODBC(用来提供ODBC,在这里就是利用freeTDS的 驱动来提供一个DSN)yum install unixODBC-devel freetds-devel
安装后可以测试一下[root@localhost ~]# tsql -S 192.168.1.233 -U sa -P softsckj
然后安装ruby- odbc,在http://www.ch-werner.de/rubyodbc/下载ruby-odbc-0.9997.tar.gz
locale is "zh_CN.UTF-8"
locale charset is "UTF-8"
1> use jw
2> select count(*) from ttuition
3> go
262846
1>tar zxvf ruby-odbc-0.9997.tar.gz
接下去进行配置:
cd ruby-odbc-0.9997
ruby extconf.rb
make && make install
修改/etc/freetds.conf[MyServer2k]
这里修改host,主要是为了可以引用到这个MyServer2K
host = 192.168.1.233
port = 1433
tds version = 8.0
修改/etc /odbcinst.ini(这是用来定义各种各样的Driver的地方)[FreeTDS]
修改/etc /odbc.ini(这里就是配置DSN的地方)
Description = ODBC for MS SqlServer
Driver = /usr/lib/libtdsodbc.so
Setup = /usr/lib/libtdsS.so
FileUsage = 1[JW]
注意到这里的MyServer2k引用的是 freetds.conf里边定义的。其实按道理这里直接使用ip就可以的,可惜的是,在freetds0.64里边设置ip的话,根本不起作用。
Description = jw
Driver = FreeTDS
Servername = MyServer2k
Database = jw
UID = sa
PWD = softsckj
最 后,简单写个脚本测试一下:[root@localhost ~]# vi test.rb
能够得出结果就表示配置成功了。
#!/bin/env ruby
require 'rubygems'
require 'dbi'
require 'odbc'
DBI.connect('dbi:ODBC:JW','sa','softsckj') do |dbh|
dbh.select_all('select top 10 * from ttuition') do |row|
p row.join(',')
end
end安 装memcached
下载libevent-1.4.12-stable.tar.gz和memcached-1.4.0.tar.gz tarzxvf libevent-1.4.12-stable.tar.gz
cd libevent-1.4.12-stable
./configure --prefix=/usr/local/libevent-1.4.12
make && make install
cp /usr/local/libevent-1.4.12/lib/libevent-1.4.so.2 /usr/lib/
tar zxvf memcached-1.4.0.tar.gz
cd memcached-1.4.0
./configure --with-libevent=/usr/local/libevent-1.4.12 --prefix=/usr/local/memcached-1.4.0
make && make install运行并验证
[root@localhost bin]# /usr/local/memcached-1.4.0/bin/memcached -d -m 256 -p 11211 -u root
[root@localhost bin]# telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
stats
STAT pid 5075
STAT uptime 155
STAT time 1248845966
STAT version 1.4.0安 装nginx
需要其他支持yum install pcre-devel openssl-devel
下载nginx-0.7.61.tar.gztar zxvf nginx-0.7.61.tar.gz
cd nginx-0.7.61
./configure --prefix=/usr/local/nginx-0.7.61 \
--user=nobody \
--group=nobody \
--without-poll_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-http_realip_module \
--with-http_ssl_module \
--with-http_flv_module \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log
make && make install配 置/usr/local/nginx-0.7.61/conf/nginx.conf,示例:
user nobody;
worker_processes 1;
error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
use epoll;
worker_connections 65535;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
access_log off;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 8k;
gzip_http_version 1.1;
gzip_types text/plain application/x-javascript. text/css text/html application/xml image/jpeg image/png image/gif;
upstream backend {
server 127.0.0.1:3000 weight=1;
server 127.0.0.1:3001 weight=1;
server 127.0.0.1:3002 weight=1;
server 127.0.0.1:3003 weight=1;
server 127.0.0.1:3004 weight=1;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
#internal;
proxy_pass http://backend/;
#proxy_store on;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
index index.html index.php index.htm;
}
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
}
location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico)$ {
root /var/www/gst/public;
index index.php;
access_log off;
expires 14d;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443;
# server_name localhost;
# ssl on;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_timeout 5m;
# ssl_protocols SSLv2 SSLv3 TLSv1;
# ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}测 试并运行和关闭
/usr/local/nginx-0.7.61/sbin/nginx -t
/usr/local/nginx-0.7.61/sbin/nginx -c /usr/local/nginx-0.7.61/conf/nginx.conf&
killall -HUP nginx安 装RMagick
检测图片支持,如果检测不到的话,需要通过yum来安装rpm -qa | grep libpng
如果你希望支持tiff格式,还 应该检查
rpm -qa | grep libpng-devel
rpm -qa | grep libjpeg
rpm -qa | grep gd-develrpm -qa | grep libtiff
下载ImageMagick-6.5.4-6.tar.bz2
tar jxvf ImageMagick-6.5.4-6.tar.bz2
cd ImageMagick-6.5.4-6
./configure --prefix=/usr/local/ImageMagick-6.5.4-6
make && make install编辑/etc/profile里面 的PATH环境变量,加入:
export PATH=/usr/local/ImageMagick-6.5.4-6/bin:$PATH
编辑/etc /ld.so.conf,加入: /usr/local/ImageMagick-6.5.4-6/lib
执 行命令ldconfig将ImageMagick的库加入系统联接库
执行命令source /etc/profile让文件生效,最后验证 convert logo: logo.gif 看是否正确生成一个logo.gif的图片文件下载RMagick-2.10.0.tar.bz2
tar jxvf RMagick-2.10.0.tar.bz2
安装完成还是不能使用的话,可以下载rmagick-2.10.0.gem来安装
cd RMagick-2.10.0
ruby setup.rb
gem install rmagick-2.10.0.gem --no-rdoc --no-ri安 装fcgi
由于ruby的fcgi支持库需要在编译的时候联接FCGI的系统库,因此我们需要先安装FCGI库,下载FCGI源代码发行 包:http://www.fastcgi.com/dist/tar xzvf fcgi-2.4.0.tar.gz
cd fcgi-2.4.0
./configure --prefix=/usr/local/fcgi-2.4.0
make && make install然 后就可以安装ruby的fcgi支持库了,下载ruby-fcgi-0.8.7.tar.gz
tar xzvf ruby-fcgi-0.8.7.tar.gz
cd ruby-fcgi-0.8.7
ruby install.rb config -- --with-fcgi-dir=/usr/local/fcgi-2.4.0
ruby install.rb setup
ruby install.rb install在public下面新建 dispatch.sh用来启动fcgi,如下:
#!/bin/sh
这样就可以通过./dispatch.sh start来启动10个fcgi进程了,而lighttpd就是把请求交给这10个fcgi进程进行处理的。
DISPATCH_PATH=/var/www/gst/public/dispatch.fcgi
SOCKET_PATH=/tmp
PID_PATH=/tmp
RAILS_ENV=production
export RAILS_ENV
case "$1" in
start)
for num in 0 1 2 3 4 5 6 7 8 9
do
/usr/local/lighttpd-1.4.23/bin/spawn-fcgi -f $DISPATCH_PATH -s $SOCKET_PATH/rails$num.sock -P $PID_PATH/rails$num.pid -u lighttpd -g lighttpd
done
;;
stop)
killall -9 dispatch.fcgi
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage: dispatch.sh {start|stop|restart}"
;;
esac
exit 0安 装lighttpd
需要其他支持yum install bzip2-devel
下载lighttpd-1.4.23.tar.gz
yum install pcre-devel
yum install gamin-develtar xzvf lighttpd-1.4.23.tar.gz
完 毕以后,会给出一个激活的模块和没有激活模块的清单,可以检查一下,是否自己需要的模块都已经激活,在enable的模块中一定要有 “mod_rewrite”这一项,否则重新检查pcre是否安装.最后编译:make && make install 最后把/usr/local/lighttpd-1.4.23/lib添加到/etc/ld.so.conf里边去并执行ldconfig
cd lighttpd-1.4.23
./configure --prefix=/usr/local/lighttpd-1.4.23 --with-famcp doc/rc.lighttpd.redhat /etc/init.d/lighttpd
然后修改/etc/init.d/lighttpd,把
mkdir /etc/lighttpd
cp doc/lighttpd.conf /etc/lighttpd/lighttpd.confLIGHTTPD_BIN=/usr/sbin/lighttpd
改为
LIGHTTPD_BIN=/usr/local/lighttpd-1.4.23/sbin/lighttpd配置/etc/lighttpd/lighttpd.conf,示例:
# lighttpd configuration file
#
# use it as a base for lighttpd 1.0.0 and above
#
# $Id: lighttpd.conf,v 1.7 2004/11/03 22:26:05 weigon Exp $
############ Options you really have to take care of ####################
## modules to load
# at least mod_access and mod_accesslog should be loaded
# all other module should only be loaded if really neccesary
# - saves some time
# - saves memory
server.modules = (
"mod_rewrite",
# "mod_redirect",
# "mod_alias",
"mod_access",
# "mod_cml",
# "mod_trigger_b4_dl",
# "mod_auth",
# "mod_status",
# "mod_setenv",
"mod_fastcgi",
# "mod_proxy",
"mod_simple_vhost",
# "mod_evhost",
# "mod_userdir",
"mod_cgi",
"mod_compress",
# "mod_ssi",
# "mod_usertrack",
# "mod_expire",
# "mod_secdownload",
# "mod_rrdtool",
#"mod_accesslog"
)
## a static document-root, for virtual-hosting take look at the
## server.virtual-* options
server.document-root = "/var/www/gst/public"
## where to send error-messages to
server.errorlog = "/var/log/lighttpd/error.log"
# files to check for if .../ is requested
index-file.names = ( "index.php", "index.html",
"index.htm", "default.htm" )
## set the event-handler (read the performance section in the manual)
# server.event-handler = "freebsd-kqueue" # needed on OS X
# mimetype mapping
mimetype.assign = (
".pdf" => "application/pdf",
".sig" => "application/pgp-signature",
".spl" => "application/futuresplash",
".class" => "application/octet-stream",
".ps" => "application/postscript",
".torrent" => "application/x-bittorrent",
".dvi" => "application/x-dvi",
".gz" => "application/x-gzip",
".pac" => "application/x-ns-proxy-autoconfig",
".swf" => "application/x-shockwave-flash",
".tar.gz" => "application/x-tgz",
".tgz" => "application/x-tgz",
".tar" => "application/x-tar",
".zip" => "application/zip",
".mp3" => "audio/mpeg",
".m3u" => "audio/x-mpegurl",
".wma" => "audio/x-ms-wma",
".wax" => "audio/x-ms-wax",
".ogg" => "application/ogg",
".wav" => "audio/x-wav",
".gif" => "image/gif",
".jar" => "application/x-java-archive",
".jpg" => "image/jpeg",
".jpeg" => "image/jpeg",
".png" => "image/png",
".xbm" => "image/x-xbitmap",
".xpm" => "image/x-xpixmap",
".xwd" => "image/x-xwindowdump",
".css" => "text/css",
".html" => "text/html",
".htm" => "text/html",
".js" => "text/javascript",
".asc" => "text/plain",
".c" => "text/plain",
".cpp" => "text/plain",
".log" => "text/plain",
".conf" => "text/plain",
".text" => "text/plain",
".txt" => "text/plain",
".dtd" => "text/xml",
".xml" => "text/xml",
".mpeg" => "video/mpeg",
".mpg" => "video/mpeg",
".mov" => "video/quicktime",
".qt" => "video/quicktime",
".avi" => "video/x-msvideo",
".asf" => "video/x-ms-asf",
".asx" => "video/x-ms-asf",
".wmv" => "video/x-ms-wmv",
".bz2" => "application/x-bzip",
".tbz" => "application/x-bzip-compressed-tar",
".tar.bz2" => "application/x-bzip-compressed-tar",
# default mime type
"" => "application/octet-stream",
)
# Use the "Content-Type" extended attribute to obtain mime type if possible
#mimetype.use-xattr = "enable"
## send a different Server: header
## be nice and keep it at lighttpd
# server.tag = "lighttpd"
#### accesslog module
#accesslog.filename = "/var/log/lighttpd/access.log"
## deny access the file-extensions
#
# ~ is for backupfiles from vi, emacs, joe, ...
# .inc is often used for code includes which should in general not be part
# of the document-root
url.access-deny = ( "~", ".inc" )
$HTTP["url"] =~ "\.pdf$" {
server.range-requests = "disable"
}
##
# which extensions should not be handle via static-file transfer
#
# .php, .pl, .fcgi are most often handled by mod_fastcgi or mod_cgi
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )
######### Options that are good to be but not neccesary to be changed #######
## bind to port (default: 80)
server.port = 80
## bind to localhost (default: all interfaces)
server.bind = "0.0.0.0"
## error-handler for status 404
#server.error-handler-404 = "/error-handler.html"
#server.error-handler-404 = "/error-handler.php"
## to help the rc.scripts
server.pid-file = "/var/log/lighttpd/lighttpd.pid"
server.stat-cache-engine = "fam"
server.event-handler = "linux-sysepoll"
server.network-backend = "linux-sendfile"
server.max-request-size = 10240
server.max-fds = 2048
###### virtual hosts
##
## If you want name-based virtual hosting add the next three settings and load
## mod_simple_vhost
##
## document-root =
## virtual-server-root + virtual-server-default-host + virtual-server-docroot
## or
## virtual-server-root + http-host + virtual-server-docroot
##
#simple-vhost.server-root = "/srv/www/vhosts/"
#simple-vhost.default-host = "www.example.org"
#simple-vhost.document-root = "/htdocs/"
##
## Format: <errorfile-prefix><status-code>.html
## -> ..../status-404.html for 'File not found'
#server.errorfile-prefix = "/usr/share/lighttpd/errors/status-"
#server.errorfile-prefix = "/srv/www/errors/status-"
## virtual directory listings
#dir-listing.activate = "enable"
## select encoding for directory listings
#dir-listing.encoding = "utf-8"
## enable debugging
#debug.log-request-header = "enable"
#debug.log-response-header = "enable"
#debug.log-request-handling = "enable"
#debug.log-file-not-found = "enable"
### only root can use these options
#
# chroot() to directory (default: no chroot() )
#server.chroot = "/"
## change uid to <uid> (default: don't care)
server.username = "lighttpd"
## change uid to <uid> (default: don't care)
server.groupname = "lighttpd"
#### compress module
compress.cache-dir = "/tmp/"
compress.filetype = ("text/plain", "text/html","text/javascript","text/css")
#### proxy module
## read proxy.txt for more info
#proxy.server = ( ".php" =>
# ( "localhost" =>
# (
# "host" => "192.168.0.101",
# "port" => 80
# )
# )
# )
#### fastcgi module
## read fastcgi.txt for more info
## for PHP don't forget to set cgi.fix_pathinfo = 1 in the php.ini
#fastcgi.server = ( ".php" =>
# ( "localhost" =>
# (
# "socket" => "/var/run/lighttpd/php-fastcgi.socket",
# "bin-path" => "/usr/local/bin/php-cgi"
# )
# )
# )
#### CGI module
#cgi.assign = ( ".pl" => "/usr/bin/perl",
# ".cgi" => "/usr/bin/perl" )
#
#### SSL engine
#ssl.engine = "enable"
#ssl.pemfile = "/etc/ssl/private/lighttpd.pem"
#### status module
#status.status-url = "/server-status"
#status.config-url = "/server-config"
#### auth module
## read authentication.txt for more info
#auth.backend = "plain"
#auth.backend.plain.userfile = "lighttpd.user"
#auth.backend.plain.groupfile = "lighttpd.group"
#auth.backend.ldap.hostname = "localhost"
#auth.backend.ldap.base-dn = "dc=my-domain,dc=com"
#auth.backend.ldap.filter = "(uid=$)"
#auth.require = ( "/server-status" =>
# (
# "method" => "digest",
# "realm" => "download archiv",
# "require" => "user=jan"
# ),
# "/server-config" =>
# (
# "method" => "digest",
# "realm" => "download archiv",
# "require" => "valid-user"
# )
# )
#### url handling modules (rewrite, redirect, access)
#url.rewrite = ( "^/$" => "/server-status" )
#url.redirect = ( "^/wishlist/(.+)" => "http://www.123.org/$1" )
#### both rewrite/redirect support back reference to regex conditional using %n
#$HTTP["host"] =~ "^www\.(.*)" {
# url.redirect = ( "^/(.*)" => "http://%1/$1" )
#}
$HTTP["host"] == "192.168.1.210" {
server.document-root = "/var/www/gst/public"
server.error-handler-404 = "/dispatch.fcgi"
fastcgi.server = (".fcgi" =>
(
("socket"=>"/tmp/rails0.sock"),
("socket"=>"/tmp/rails1.sock"),
("socket"=>"/tmp/rails2.sock"),
("socket"=>"/tmp/rails3.sock"),
("socket"=>"/tmp/rails4.sock"),
("socket"=>"/tmp/rails5.sock"),
("socket"=>"/tmp/rails6.sock"),
("socket"=>"/tmp/rails7.sock"),
("socket"=>"/tmp/rails8.sock"),
("socket"=>"/tmp/rails9.sock")
)
)
}
#
# define a pattern for the host url finding
# %% => % sign
# %0 => domain name + tld
# %1 => tld
# %2 => domain name without tld
# %3 => subdomain 1 name
# %4 => subdomain 2 name
#
#evhost.path-pattern = "/srv/www/vhosts/%3/htdocs/"
#### expire module
#expire.url = ( "/buggy/" => "access 2 hours", "/asdhas/" => "access plus 1 seconds 2 minutes")
#### ssi
#ssi.extension = ( ".shtml" )
#### rrdtool
#rrdtool.binary = "/usr/bin/rrdtool"
#rrdtool.db-name = "/var/lib/lighttpd/lighttpd.rrd"
#### setenv
#setenv.add-request-header = ( "TRAV_ENV" => "mysql://user@host/db" )
#setenv.add-response-header = ( "X-Secret-Message" => "42" )
## for mod_trigger_b4_dl
# trigger-before-download.gdbm-filename = "/var/lib/lighttpd/trigger.db"
# trigger-before-download.memcache-hosts = ( "127.0.0.1:11211" )
# trigger-before-download.trigger-url = "^/trigger/"
# trigger-before-download.download-url = "^/download/"
# trigger-before-download.deny-url = "http://127.0.0.1/index.html"
# trigger-before-download.trigger-timeout = 10
## for mod_cml
## don't forget to add index.cml to server.indexfiles
# cml.extension = ".cml"
# cml.memcache-hosts = ( "127.0.0.1:11211" )
#### variable usage:
## variable name without "." is auto prefixed by "var." and becomes "var.bar"
#bar = 1
#var.mystring = "foo"
## integer add
#bar += 1
## string concat, with integer cast as string, result: "www.foo1.com"
#server.name = "www." + mystring + var.bar + ".com"
## array merge
#index-file.names = (foo + ".php") + index-file.names
#index-file.names += (foo + ".php")
#### include
#include /etc/lighttpd/lighttpd-inc.conf
## same as above if you run: "lighttpd -f /etc/lighttpd/lighttpd.conf"
#include "lighttpd-inc.conf"
#### include_shell
#include_shell "echo var.a=1"
## the above is same as:
#var.a=1 -
`gem_original_require': no such file to load -- zlib (LoadError)(转发)
2010-07-15 13:02:57
`gem_original_require': no such file to load -- zlib (LoadError)
转发:http://www.redmine.org/boards/2/topics/10032
由 romuald FREBAULT 在 7 个月 之前添加
I wanted to install redmine on a centos 5.3.
As ruby 1.6/1.7 packages are not availables on this distribution, i had to download and compile the ruby 1.7 sources.I installed rubygems sources
This error happened when i tried to make a
gem install rails
To solve it i had to do a
yum install zlib-devel
then in /opt/ruby/ext/zlib/(即源码目录的ext/zlib下 )
ruby extconf.rb
make && make installeverything is good now!!!
-
JDK1.6在LINUX下的安装配置(转发)
2010-07-15 10:39:00
转发:http://soft.preboss.org/?action-viewnews-itemid-589
JDK1.6在LINUX下的安装是如何进行的呢,让我们开始我们的演示:
Ubuntu Linux下jdk的安装与配置
1.JDK1.6安装准备
从sun公司网站www.sun.com下载linux版本的jdk,我下载的版本是JDK 6 Update 7,
地址http://java.sun.com/javase/downloads/index.jsp
jdk-6u7-linux-i586.bin,打开终端,用cd命令进入jdk所在目录,执行复制命令
sudo cp jdk-6u7-linux-i586.bin /usr
即将jdk复制到/usr目录下,然后进入/usr目录cd /usr
执行权限
chmod +x jdk-6u7-linux-i586.bin
执行安装命令
./jdk-6u7-linux-i586.bin
如遇错误,可先切换至root用户下,su root,再执行安装命令
安装成功会在/usr目录下生成jdk1.6.0_07目录,就是jdk的安装目录
重启电脑,打开终端,输入java -version
如若有显示java的版本信息,则表示安装成功,
2.JDK1.6安装后的配置
安装成功后需要配置jdk环境变量
用cd命令进入/etc目录sudo vi profile即执行编辑profile文件命令
在umas k022前添加如下内容:
export JAVA_HOME=/usr/jdk1.6.0_07
export JRE_HOME=/usr/jdk1.6.0_07/jre
export PATH=$PATH:/usr/jdk1.6.0_07/bin
export CLASSPATH=./:/usr/jdk1.6.0_07/lib:/usr/jdk1.6.0_07/jre/lib
保存退出,重启电脑
3.JDK1.6安装配置后的测试
新建Test.java
public class Test{
public static void main(String[] args){
System.out.println("Hello,Welcome to Linux World!");
}
}
在终端用cd命令进入Test.java目录,然后输入
javac Test.java
java Test
若输出
Hello,Welcome to Linux World!
则表明配置成功!
如不能通过编译,可通过重新启动系统试试
4.JDK1.6安装配置时的注意事项
在用vi命令编辑profile文件时,Linux初学者可能还不熟用
sudo vi profile进入编辑文件后如出现
Press ENTER or type command to continue
则按回车然后按方向键“下”直到umas k022前一行
按字母o进入编辑状态
输入环境变量内容
回车,按几次ESC键,直到听到"嘀"声,输入
:x 然后回车
即保存退出
至此,Linux JDK1.6环境变量配置完成,是不是很简单么?开始你的编程之路吧。
-
QTP和LR的区别
2010-05-13 17:05:36
QTP: 基于UI对象的功能测试
LR: 基于协议的性能测试QTP 录制原理:消息机制,截获消息。录制的前提是能识别控件。
LR录制原理:捕获数据包。录制的前提是能识别协议报文。 -
Web Page Breakdown
2010-04-20 13:33:26
1、概念说明:http://bbs.51testing.com/thread-56564-1-1.html
DNS解析时间:显示使用最近的DNS服务器将DNS名称解析为IP地址所需的时间;DNS查找度量是指示DNS解析问题或DNS服务器问题的一个很好的指示器;Connect时间:显示与包含指定URL的Web服务器建立初始连接所需的时间;Connect度量是一个很好的网络问题指示器;它还可表明服务器是否对请求做出响应;First buffer时间:显示从初始HTTP请求到成功收回来自WEB服务器的第一次缓冲时为止所经过的时间;First buffer度量是很好的Web服务器延迟和网络滞后指示器;SSL Handshaking time:显示建立SSL连接所用的时间Receive Time:显示从服务器收到最后一个字节并完成下载之前经过的时间;接收度量是很好的网络质量指示器;FTP验证时间:显示验证客户端所用的时间。Client Time:显示因浏览器思考时间或其他与客户端有关的延迟而使客户机上的请求发生延迟时,所经过的时间。Error时间:显示从发出HTTP请求到返回错误消息这期间所经过的平均时间2、Web Page Breakdown(网页元素细分) http://tech.it168.com/d/2008-04-17/200804172126926_2.shtml
“网页元素细分”主要用来评估页面内容是否影响事务的响应时间,通过它可以深入地分析网站上那些下载很慢的图形或中断的连接等有问题的元素。
1、Web Page Breakdown(页面分解总图)
“页面分解”显示某一具体事务在测试过程的响应情况,进而分析相关的事务运行是否正常。
“页面分解”图可以按下面四种方式进行进一步细分:
1)、Download Time Breaddown(下载时间细分)
“下载时间细分”图显示网页中不同元素的下载时间,同时还可按照下载过程把时间进行分解,用不同的颜色来显示DNS解析时间、建立连接时间、第一次缓冲时间等各自所占比例。
2)、Component Breakdown(Over Time)(组件细分(随时间变化))
“组件细分”图显示选定网页的页面组件随时间变化的细分图。通过该图可以很容易的看出哪些元素在测试过程中下载时间不稳定。该图特别适用于需要在客户端下载控件较多的页面,通过分析控件的响应时间,很容易就能发现那些控件不稳定或者比较耗时。
3)、Download Time Breakdown(Over Time)(下载时间细分(随时间变化))
“下载时间细分(随时间变化)” 图显示选定网页的页面元素下载时间细分(随时间变化)情况,它非常清晰地显示了页面各个元素在压力测试过程中的下载情况。
“下载时间细分”图显示的是整个测试过程页面元素响应的时间统计分析结果,“下载时间细分(随时间变化)”显示的事场景运行过程中每一秒内页面元素响应时间的统计结果,两者分别从宏观和微观角度来分析页面元素的下载时间。
4)、Time to First Buffer Breakdown(Over Time)(第一次缓冲时间细分(随时间变化))
“第一次缓冲时间细分(随时间变化)”图显示成功收到从Web服务器返回的第一次缓冲之前的这段时间,场景或会话步骤运行的每一秒中每个网页组件的服务器时间和网络时间(以秒为单位)。可以使用该图确定场景或会话步骤运行期间服务器或网络出现问题的时间。
First Buffer Time:是指客户端与服务器端建立连接后,从服务器发送第一个数据包开始计时,数据经过网络传送到客户端,到浏览器接收到第一个缓冲所用的时间。
2、Page Component Breakdown(页面组件细分)
“页面组件细分”图显示每个网页及其组件的平均下载时间(以秒为单位)。可以根据下载组件所用的平均秒数对图列进行排序,通过它有助于隔离有问题的组件。
3、Page Component Breakdown(Over Time)(页面组件分解(随时间变化))
“页面组件分解(随时间变化)”图显示在方案运行期间的每一秒内每个网页及其组件的平均响应时间 (以秒为单位)。
4、Page Download Time Breakdown(页面下载时间细分)
“页面下载时间细分”图显示每个页面组件下载时间的细分,可以根据它确定在网页下载期间事务响应时间缓慢是由网络错误引起还是由服务器错误引起。
“页面下载时间细分”图根据DNS解析时间、连接时间、第一次缓冲时间、SSL握手时间、接收时间、FTP验证时间、客户端时间和错误时间来对每个组件的下载过程进行细分。
5、Page Download Time Breakdown(Over Time)(页面下载时间细分(随时间变化))
“页面下载时间细分(随时间变化)”图显示方案运行期间,每一秒内每个页面组件下载时间的细分。使用此图可以确定网络或服务器在方案执行期间哪一时间点发生了问题。
“页面组件细分(随时间变化)”图和“页面下载时间细分(随时间变化)”图通常结合起来进行分析:首先确定有问题的组件,然后分析它们的下载过程,进而定位原因在哪里。
6、Time to First Buffer Breakdown(第一次缓冲时间细分)
“第一次缓冲时间细分”图显示成功收到从Web服务器返回的第一次缓冲之前的这一段时间内的每个页面组件的相关服务器/网路时间。如果组件的下载时间很长,则可以使用此图确定产生的问题与服务器有关还是与网络有关。
网络时间:定义为第一个HTTP请求那一刻开始,直到确认为止所经过的平均时间。
服务器时间:定义为从收到初始HTTP请求确认开始,直到成功收到来自Web服务器的一次缓冲为止所经过的平均时间。
7、Time to First Buffer Breakdown(Over Time)(第一次缓冲时间细分(随时间变化))
“第一次缓冲时间细分(随时间变化)”图显示成功收到从Web服务器返回的第一个缓冲之前的这段时间内,场景运行的每一秒中每个网页组件的服务器时间和网络时间。可以使用此图确定场景运行期间服务器或网络出现问题的时间点。
8、Downloader Component Size(KB)(已下载组件大小)
“已下载组件大小”图显示每个已经下载的网页组建的大小。通过它可以直接看出哪些组件比较大并需要进一步进行优化以提高性能。
-
Error 27727-27728解决方法
2010-04-16 14:33:35
Loadruner报错:Error -27728: Step download timeout (120 seconds)的一个解
今天一个网友问了我一个问题如下:
loadruner报错:Error -27728: Step download timeout (120 seconds) 如何解决
语法检查通过,但是在并发执行一个查询时候报错Action.c(16): Error -27728: Step download timeout (120 seconds) has expired when downloading non-resource(s),请问有啥子解决方法,我使用web_set_timeout ,好象不起作用,直接在option中设置timeout时间为600,(单位应该是秒吧)还是没有起作用,结果都还是提示(120seconds),说明还是以120秒来判断的;使用lrs_set_recv_timeout,语法检查不过,说明库函数里面没有这个函数,
尝试步骤:
设置超时时间到600秒,回放还是出错。
后来设置了runt time setting中的internet protocol-preferences中的advaced区域有一个winlnet replay instead of sockets选项,选项后再回放就成功了。
kernzhang解释如下
这个问题很有意思!呵呵!首先LR是通过Microsoft WinInet DLL去录制web协议的!但是在Control运行的时候它默认通过socket去模拟请求,因为这些可以真实的模拟带宽,而采用Microsoft WinInet DLL通过这个DLL去访问网卡方式去模拟带宽,使得模拟不是很精确!而且也不支持unix的应用,但是使用这个确实有时无法处理winnet Dll的一些请求,我认为是它的一些BUG,比如说:回放时它会检查Content-Length,但是网页支持receive more data时,这时socket模拟会一直等待直到timeout!
先说了一些优缺点,最后回到这个问题!这个问题分两个方面分析:
第一:你要明白web_set_timeout()这个函数的适用范围!比如说一个web_submit_data()中实际涵盖了10个对Server 端的请求,这个函数是针对10个请求的总和时间的!(别犯低级错误,timeout分了connect,receive以及download三个部分:) )
第二:就是我解释的上面的一些BUG问题!
WinInet dll在新版本中处理请求时可以异步的,就是不再是那种连接等待然后超时模式!但是LR用的socket是同步请求!只有等到timeout才会退出!microsoft已经明确表示INTERNET_OPTION_RECEIVE_TIMEOUT 不再适用于 Microsoft Internet Explorer 5.0,显而易见,他们处理请求采取了异步处理的方式!呵呵!这下大概可以圆满解释你的问题了!呵呵
这里,我补充如下:
VuGen专用的基于套接字的重播是一种可伸缩以便进行负载测试的轻型引擎。使用线程时是准确的。基于套接字的引擎不支持socks代理服务器。如果在这样的环境中录制,应该使用winInet重播引擎。
欢迎大家继续讨论。 -
软件测试人员容易遗漏的测试缺陷(转发)
2010-04-01 13:25:02
通常软件测试会暴露软件中的缺陷,经过修正后可以保证软件系统的功能满足需求并正确运行。但是,在系统测试和确认测试中,测试人员容易遗漏一些隐藏的缺陷。众所周知,软件测试不可能发现所有的缺陷,而软件开发周期各个阶段仍然存在注入缺陷的可能,但是,有一些缺陷是测试中容易忽略的,也就是说,通过测试方法和用例可以充分暴露这些缺陷,遗憾的是,它们往往被忽略或者某种原因忘记测试了,这就给软件留下了隐患或者危机。这些容易被忽略的缺陷包括:1、安装缺陷
通常项目组完成代码后,发布时候安装打包是最后一个环节,而软件测试人员通常在测试的时候,没有仔细的测试这一部分,而把用例集中在其他功能上。安装时候的缺陷通常通过拷贝而不是运行安装程序方式给测试人员安装软件,结果正式安装时候出现问题,引起例如控件没有注册,注册表没有导入等。删除时候没有注意安装文件夹是否存在用户文件,造成数据丢失;使用绝对路径;安装顺序没有说明书。
2、配置文件
有些文件在ini等配置文件中写出了管理员口令密码等信息,而且是明文的!这是一个安全隐患。另外,有些安装文件的 XML 文件,为了方便在数据库和中间层连接文件中写入了Admin 口令和密码。作为一个合格的软件测试人员,必须检查这些可以用记事本打开的文件。因为,一个稍有常识而且喜欢探索的用户,可能从中获取信息而成为不自觉的黑客。所以,配置文件可能成为软件安全方面的一个缺陷。
3、网页安全缺陷
现在网站开发已经注意到:登陆网站进入其内部网页后,直接拷贝网址,然后粘贴到另一IE 窗口输入,可以绕过登陆直接访问。也许商业网站很关注这个问题,但是很多行业软件却很容易忽略。
网页安全缺陷还可能存在于 IE 弹出的子窗口。有些设计不严格的软件,在主页面关闭的时候子页面还可以运行,这是一个明显的漏洞,而且还大大增加了错误发生的几率。
4、判断顺序/逻辑缺陷
对界面进行多个输入判断的时候,非常容易出现这种问题。例如判断年月顺序,判断长度,判断非空等。假如操作员仅仅满足单个条件,保存不能成功;而按界面从上之下顺序一一满足条件之后,保存是没有问题的。但是,改变一下输入的次序,校验失效。例如,一一满足条件之后,不保存,倒过来将上面的输入改成非法输入,然后保存,结果居然也能成功,这是因为原先的判断由于发生过,或者根据语句顺序只检查最后一个判断,所以没有报错。这种错误尤其在 Java scrīpt 脚本的页面中要注意。能够保存不能保证数据正确,有可能引起系统崩溃或者后续数据错误。所以,在测试的时候,不要按照正常的顺序输入,而是要打乱步骤,看看代码是否强健,是否在判断逻辑上没有错误。良好的代码应该经得起折腾,至少保存时会再此全部进行判断,而不只是简简单单走到判断的最后一行。
5、调试语句和冗余信息
维护项目和升级改造的推广系统最容易潜伏这类缺陷。典型表现在没有删除或者屏蔽调试语句。弹出一个界面不友好的提示信息,会使不明真相的用户产生误以为系统发生了严重故障,从而引起对软件的不信任感。页面中某个角落存在当前客户不需要的冗余按钮和功能也是一种缺陷。多余的功能会使用户以为是额外附加部分而去使用,其结果可想而知;而多余的按钮会误导好奇心强的用户操作,产生不必要的错误。
同样值得关注的还有参数设置,由于没有实际数据,开发人员在调试或者单元测试的时候,习惯性的进行自我设定而忘了删除,软件测试人员可能会忽略掉了这部分测试,也可能导致在客户现场发生错误而影响系统发布和验收。
6、不可重现的故障
新参加软件测试的人员或者新来的开发人员总是要问,不可重现的缺陷是否需要记录,有必要吗?回答是肯定的。测试必须如实的记录发生的问题,也许不能重现,或者使非软件系统本身问题,但是,可能这些偶然性背后是有规律的,不记录这些,就不可能发现这些规律。
7、多节点的逆向流转缺陷
当前软件不少喜欢使用工作流来驱动。工作流的问题,就是可能出现多个流向分支。测试容易忽略的部分,就是工作流多节点的逆向流转。例如,通过不通过涉及两个分支,但是流程逆转的时候,有可能不是回到上一节点而是平级的另一个节点去了。软件测试要格外注意这类用例的设计。另外,有些时候默认分支在向前的时候是有默认值的,例如默认通过,那么保存的时候要提示用户是否通过,否则可能由于操作疲劳而走错了节点,引起回退。
8、输入框缺陷
试过往输入框粘贴数据而不是直接输入吗?可能这里会出现问题。按 Ctrl+V 的时候,输入框会根据长度大小自动截断输入长度。但是用鼠标,截断可能会失效。有一次测试人员就是用这种方法把一篇 Word 文档输入进去了,保存的时候,数据库崩溃。有些网站登陆的口令****可以拷贝下来的,只要放在剪贴板里面马上明文显示。
输入框可以说是问题最多的部分,能够引起的麻烦也很多。日期、数字、文本等等,都需要耐心的测试一下。
9、界面布局缺陷
曾经有一次,项目经理回来向测试部反映一个问题,客户对界面不满意。原因很简单,因为界面上删除按钮和保存按钮挨得很近。结果有些操作不熟练的业务人员,很容易误按。这个问题是测试人员没有意料到的,因此注意关闭、删除、退出按钮与保存、下一步等按钮的距离。类似的按钮应按此规则排列分布。
界面布局还可能发生在窗口最大化和最小化上,有可能窗口缩小的时候没有下拉框或不匹配分辨率,对用户来讲,这个错误实在很低级。有些用户由于操作习惯,非常不喜欢腾出手使用鼠标,尤其是大量输入的界面,因此,要注意设置键盘的快捷方式。还有,按 Tab定位到下一焦点时要注意顺序,避免跳转太灵活而让操作人员感到无从适应,在界面进行维护或者修改的时候,不要忘了软件测试开发人员是否无意改变了这些快捷方式和跳转顺序。
10、版本和补丁包的环境问题
理论上讲,这属于兼容性测试应该覆盖的问题。有些客户很喜欢更新最新的软件版本或者微软时不时打些补丁包,问题就出现了。有时候升级不一定是好事。这些问题最好在测试的时候增加几个用例,多用不同软件版本的机器跑一跑。软件测试有个定律是:你没跑过的地方,就一定会出事。经常听到开发人员抱怨,怎么我的机器没问题,你的机器就有事了呢?这不能完全靠配置管理员解决问题,环境配置项是大家最容易忽略的。
11、用户管理缺陷
用户管理的角色和授权需要好好研究一下,作过测试的人员都知道,有时候为了测试的方便,测试用户都是具有超级权限的用户。而且,比较容易忽略用户管理这一部分的测试。往往发往客户的时候,很多测试用户都没有删除。
另外,有些接口的用户和口令,到软件使用寿命结束都没有更改过。在一次测试中,软件测试人员发现,给一个用户授超级用户权限,之后更改这个用户为受限权限。使用中发现,用户居然没有真正回收权限,用户管理界面上没有任何不对。及早准备用户管理用例,不要等到测试快结束时候才想起。
12、常识缺陷
从逻辑或者统计学上讲,计算机是允许如此处理的,但是从常识上来讲,这些情况不可能发生。例如电话号码不可能出现小数点,终止时间不能大于开始时间等等。除此之外,常识还要结合业务特点来进行判断,因此,开发和测试人员要格外注意对自己知识的培养以及增加对需求细节的了解。不能因为一味追求进度而采用最简单的代码来实现,对用户来说,这些错误可能是很荒谬的。
尽管我们不可能完美的测试一个软件,但是我们仍然可以改进我们的软件测试。每次测试结束,及时总结测试中的不足,进一步完善用例。思考一下那些容易忽略的软件缺陷,能提高对软件测试的认识,提高所在组织软件的质量。
标题搜索
我的存档
数据统计
- 访问量: 29522
- 日志数: 95
- 建立时间: 2008-11-05
- 更新时间: 2013-09-17