发布新日志

  • chrome 最小的字体

    2011-02-16 11:11:58

    chrome 下的字体不能小于12

    所以

    设置小于12大小的字体不起作用

    导致页面错乱

  • Httpload小解

    2011-02-05 19:37:07

    测试网站每秒所能承受的平均访问量(吞吐量)
    http_load -parallel 5 -fetches 1000 urls.txt
    这段命令行是同时使用5个进程,随机访问urls.txt中的网址列表,总共访问1000次。运行之后的结果:
    1000 fetches, 5 max parallel, 6e+06 bytes, in 58.1026 seconds
    6000 mean bytes/connection
    17.2109 fetches/sec, 103266 bytes/sec
    msecs/connect: 0.403263 mean, 68.603 max, 0.194 min
    msecs/first-response: 284.133 mean, 5410.13 max, 55.735 min
    HTTP response codes:
    code 200 — 1000
    从上面的运行结果来看,目标网站仅仅能够承受每秒17次访问,不够强壮。
    测试网站是否能承受住预期的访问压力(
    http_load -rate 2 -seconds 300 urls.txt
    在300秒内保持一定的频率访问目标url。
    注:
    urls.txt保存要访问的url列表,每行一个
    不要测试上线之后的网站,压垮了可不好玩
    例如:
    1.http_load -parallel 5 -fetches 1000 urls.txt
    2.http_load -rate 2 -seconds 300 urls.txt
    3. http_load -p 30 -s 60 urllist.txt
    4. http_load -parallel 50 -s 10 urls.txt
    这段命令行是同时使用50个进程,随机访问urls.txt中的网址列表,总共访问10秒。

    参数说明:
    -parallel 简写-p :含义是并发的用户进程数。
    -fetches 简写-f :含义是总计的访问次数
    -rate 简写-r :含义是每秒的访问频率
    -seconds简写-s :含义是总计的访问时间
    参数是可以自由组合的,参数之间的选择并没有什么限制。
    urls.txt保存要访问的url列表,
    url 是你要访问的网址名,参数可以是单个的网址也可以是包含网址的文件。 文件格式是每行一个URL,URL最好超过50-100个测试效果比较好. 文件格式如下
    http://iceskysl.1sters.com/?action=show&id=336
    http://iceskysl.1sters.com/?action=show&id=335
    http://iceskysl.1sters.com/?action=show&id=332
    http://iceskysl.1sters.com/?action=show&id=32
    参数了解了,我们来运行一条命令, 来看看它的返回结果
    命令:% ./http_load -rate 5 -seconds 10 urls
    命令解释: 执行一个持续时间为10秒的测试,每秒的访问频率为5次。
    49 fetches, 2 max parallel, 289884 bytes, in 10.0148 seconds
    5916 mean bytes/connection
    4.89274 fetches/sec, 28945.5 bytes/sec (重要性能指标吞吐量)
    msecs/connect: 28.8932 mean, 44.243 max, 24.488 min(重要指标响应时间)
    msecs/first-response: 63.5362 mean, 81.624 max, 57.803 min
    HTTP response codes:
    code 200 — 49
    结果分析:
    1.49 fetches, 2 max parallel, 289884 bytes, in 10.0148 seconds
    说明在上面的测试中运行了49个请求,最大的并发进程数是2,总计传输的数据是289884bytes,运行的时间是10.0148秒
    2.5916 mean bytes/connection
    说明每一连接平均传输的数据量289884/49=5916
    3.4.89274 fetches/sec, 28945.5 bytes/sec (吞吐量: 单位时间完成请求数)
    说明每秒的响应请求为4.89274,每秒传递的数据为28945.5 bytes/sec
    这个值得是根据 49 fetches / 10.0148 seconds 秒计算出来的
    4.msecs/connect: 28.8932 mean, 44.243 max, 24.488 min (响应时间: 每次请求需要的时间, 平均, 最大, 最小)
    说明每连接的平均响应时间是28.8932 msecs,最大的响应时间44.243 msecs,最小的响应时间24.488 msecs
    5.msecs/first-response: 63.5362 mean, 81.624 max, 57.803 min
    6、HTTP response codes: code 200 — 49
    说明打开响应页面的类型,如果403的类型过多,那可能要注意是否系统遇到了瓶颈。
    特殊说明:这里,我们一般会关注到的指标是fetches/sec、msecs/connect
    他们分别对应的常用性能指标参数
    Qpt-每秒响应用户数和response time,每连接响应用户时间。
    测试的结果主要也是看这两个值。
    当 然仅有这两个指标并不能完成对性能的分析,我们还需要对服务器的cpu、memory进行分析,才能得出结论,另外,测试结果中主要的指标是 fetches/sec 这个选项,即服务器每秒能够响应的查询次数,用这个指标来衡量性能。似乎比 apache的ab准确率要高一些,也更有说服力一些。

    http_load测试参数比较
    ./http_load -parallel 200 -seconds 10 urls
    按照固定时间来结束测试,这样可以比较相同时间内被测服务器的响应速度.
    ./http_load -parallel 200 -fetches 1000 urls
    按照固定申请数来测试,这样可以比较相同访问量下返回的响应速度.
    虽然两者都可以获取到服务器的响应速度
    但是使用fetches更容易让被测服务器收到压力
    由于seconds控制测试时间,很有可能在短时间内测试客户端并没有发起足够数量的请求
    而服务端在收到足够压力之前,测试就已经结束了.
    有一些情况,诸如内存泄漏以及资源回收不利或者对后面的响应速度越来越慢等情况
    在这种测试条件下不容易发生
    而使用fetchs,能够让客户端保证确定请求数的全部处理.
    使用时间作为控制参数
    会由于测试人员不够耐心而人为将seconds参数设置过小
    导致测试结果失去意义
    所以,最后建议使用fetches作为测试参数.用以作为基准进行比较
  • 没有深究带来的恶果

    2011-01-18 10:46:10

    现象是在IE下,字显示为白色

    原因是

    代码没有闭合

    我的那个天啊

    其实之前是看到这个现象了,只是有时能出现,有时又出现不了

    都是我的错

    每次都这样大呼呼的



    +                      </span>

  • ping all links

    2010-12-15 10:46:43

    这个问题我真不该犯啊

    测试中还用这个工具检查了一下呢

    可是上线就出问题了

    这是不该啊

    ----

    开发说是笔误

    可是,我能怨人家么

    不能

    ======

    回归测试还是蛮重要的撒。


    555555555555555555


    ping all links 是ff下的检测页面链接的快速工具,可以有效的检测页面多链接的地址是否正确,起码不报404.!

    要是由于页面多,而忘掉一部分的话,更应该列个表格出来。画个对号。

  • linux下的计划任务--crontab命令简介

    2009-12-05 00:52:51

    简介
    crontab-操作每个用户的守护程序和该执行的时间表。
    作者 Matthew Dillon .
    部分参数说明
    crontab file [-u user]-用指定的文件替代目前的crontab。
    crontab-[-u user]-用标准输入替代目前的crontab.
    crontab-1[user]-列出用户目前的crontab.
    crontab-e[user]-编辑用户目前的crontab.
    crontab-d[user]-删除用户目前的crontab.
    crontab-c dir- 指定crontab的目录。
    crontab文件的格式:M H D m d cmd.
    M: 分钟(0-59)。
    H:小时(0-23)。
    D:天(1-31)。
    m: 月(1-12)。
    d: 一星期内的天(0~6,0为星期天)。
    cmd要运行的程序,程序被送入sh执行,这个shell只有USER,HOME,SHELL这三个环境变量。
    下面是一个例子文件:
    #MIN HOUR DAY MONTH DAYOFWEEK COMMAND
    #每天早上6点
    106* * * date

    #每两个小时
    0*/2* * * date

    #晚上11点到早上8点之间每两个小时,早上部点
    0 23-7/2,8* * * date

    #每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
    0 11 4* mon-wed date

    #1月份日早上4点
    0 4 1 jan* date
    范例
    lark:~>crontab-1 列出用户目前的crontab.
    #MIN HOUR DAY MONTH DAYOFWEEK COMMAND
    10 6* * * date
    0*/2* * * date
    0 23-7/2,8 * * * date
  • MySQL数据的导出和导入-mysqldump

    2009-12-04 23:37:04

    MySQL环境变量设置,将%MySQL_HOME%下的MySQL Server 5.1\bin放到Path下。


    MySQL的mysqldump工具,基本用法是:
    shell> mysqldump [OPTIONS] database [tables]


    通过执行mysqldump --help,得到当前mysqldump版本支持的选项表。
    通过执行mysqldump –V,得到当前mysqldump版本。


    几个常用的例子(在mysqldump Ver 10.13 Distrib 5.1.30, for Win32 (ia32)下测试通过)
    1.导出整个数据库
    mysqldump -u 用户名 -p 数据库名 > 导出的文件名
    mysqldump -u root -p student >d:\student.sql


    2.导出一个数据库结构
    mysqldump -u root -p -d --add-drop-table student >d:\student_structure.sql
    -d 没有数据 --add-drop-table 在每个create语句之前增加一个drop table


    3.导出一个表
    mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名
    mysqldump -u root -p schoolproject student>d:\schoolproject_student.sql


    4.导入数据库
    shell> mysqladmin –u root –p create target_db_name
    shell> mysql –u root –p target_db_name < backup-file.sql
    就是:shell> mysql 数据库名 < 文件名


    或者使用source 命令
    进入mysql数据库控制台,mysql -u root –p


    mysql>use 数据库
    然后使用source命令,后面参数为脚本文件(.sql文件)
    mysql>source d:\student.sql
  • 单元测试--phpunit 可否使用实务对单元测试方法的执行进行回滚?

    2009-11-15 15:47:16

    单元测试要求:单元测试方法并不真正去变更数据库,也就是说单元测试不依赖于数据库中的数据。那我们如何解决执行单元测试方法后,不变更数据库中数据呢?
      一般的解决方案有两种:
      1、 新建一个单元测试数据库,开发数据库与单元测试数据库分离,单元测试方法完全基于单元测试数据库。
      此中方法的优点是:开发人员在开发期间不会对单元测试数据库中数据进行变更,也就不会影响单元测试方法 在任何时间执行。
      缺点:单元测试数据库和开发数据库同步问题,特别是对迭代式开发项目,数据库是根据需求在不断地跟进或者变更,同步问题成为了单元测试正常运行的瓶颈。
      2、 使用事务对单元测试方法的执行进行回滚。
      此种方法的优点:解决了方法一中缺点,不会出现数据库结构不同步的问题。
      缺点:在进行CRUD(Create/Read/Update/Delete)操作时,需要在单元测试方法中进行一些插入数据操作,从而保证单元测试与开发数据库的独立,造成了单元测试工作量增加。
      在实际的项目中,可以根据需要选择符合自己的解决方案,如果数据库结构在项目进入开发阶段已经确定,并且以后不会有变动,建议采用第一种方案,否则建议第二种方案。目前我们项目采用第二中方案。
    一、NUnit事务性单元测试
      那使用Nunit框架如果保证数据的会滚呢?这里我们使用了COM+事务。
      即System.EnterpriseServices;
      具体如下:
    /// <summary>
        ///单元测试基类,所有单元测试类都需要继承此类
        /// </summary>
        [TestFixture]
        [Transaction(TransactionOption.Required)]
        public class DatabaseFixture:ServicedComponent
        {
            public DatabaseFixture()
            {
                //
                // TODO: Add constructor logic here
                //
            }
            [TearDown]
            public void TransactionTearDown()
            {
                if (ContextUtil.IsInTransaction)
                {
                    ContextUtil.SetAbort();
                }
            }
     
      所有的单元测试方法都需要继承与此类。比如:
      public class AddressSqlDAOTest : DatabaseFixture
     
     这样,单元测试方法执行完后,会继续执行DatabaseFixture类中的TransactionTearDown()方法。从而会滚之前的数据操
    作,单元测试方法也就不会影响开发数据库,同样开发数据库也不会影响单元测试方法的执行,从而保证了单元测试与数据库数据的独立。
    二、如何CRUD单元测试
      1、测试增加方法:判断返回的主键是否>0,如果主键>0 说明单元测试方法成功,否则失败
      2、测试查询方法:首先在执行单元测试类中的插入数据方法(不是被测试类中的插入方法,而是在单元测试类中写的插入方法,一定要区分开),然后执行查询方法。
      3、测试更新方法:首先在执行单元测试类中的插入数据方法,然后执行更新方法。
      4、测试删除方法:首先在执行单元测试类中的插入数据方法,然后执行删除方法。
    三、单元测试的命名规范
      为了便于后期单元测试方法的维护,建议如下命名单元测试类 和单元测试方法。
      单元测试类名:被测试类名称+Test
      单元测试方法名:被测试方法名称+Test
    四、总结
      至此,大家就可以利用Nunit中如何进行事务性单元测试已经完毕,相信大家也已经了解了如何让单元测试独立于数据库数据,从而更高效地进行单元测试,也不影响开发。

     不知道对于PHPunit来说,有没有第二种回复数据库操作的框架?这样,以后每次回归测试时,就不会因为CRUD对数据库的操作而重新编辑数据库。尤其是删除操作。
  • 验证码的时间戳观念

    2009-11-11 18:02:07

     

    验证码的好处:避免垃圾邮件、发贴机

    功能及现象描述:

    光标定在输入框时,请求needverfy函数,根据程序系统机制判断是否出验证码,以防灌水现象。 验证码每次出现都是一样的。导致输入验证码后,不能校验成功。 

    现象定位:

    每次请求****/isNeedVerfy函数时,由于链接一致,被浏览器cache住内容后,导致每次页面出现的验证码都是一样的。所以,最后的解决方案是加时间戳随机数。

    代码跟踪修改:

     

                  var callback = function(result){

                           if(true === result){

                                   $("div_verify").show();

    +                              var d = new Date();

                                   if($('verify_img')){

    -                                     var d = new Date();

                                          $('verify_img').src = "/verify/?"+d.getTime();

                                   }else{

                                          var img = document.createElement("img");

                                          img.id="verify_img";

    -                                  img.src = "/verify/";

    +                                  img.src = "/verify/?"+d.getTime();

                                       img.width = 140;

                                       img.height = 50;

                                       img.onclick=function(){var d=new Date();img.src="/verify/?"+d.getTime()};

    @@ -227,13 +227,13 @@

            

            refreshverify :function(){

    +              var d = new Date();

                   if($('verify_img')) {

    -                      var d = new Date();

                           $('verify_img').src = "/verify/?"+d.getTime();

                   }else{

                           var img = document.createElement("img");

                           img.id="verify_img";

    -                  img.src = "/verify/";

    +                  img.src = "/verify/?"+d.getTime();

                       img.width = 140;

                       img.height = 50;

                       img.onclick=function(){var d=new Date();img.src="/verify/?"+d.getTime()};

  • php中,搜索结果的分页测试

    2009-11-10 22:47:13

    关于php对于搜索结果的分页测试

    待续

  • 页面上传头像的测试

    2009-11-10 22:36:20

    算是测试技术吧

    大型网站关于会员自己头像自定义的测试:

    问题描述:有时可以成功的更换新的会员头像,有时候需要先更新为系统头像后,再上传新的自定义头像才可以成功。

    问题定位:每次上传新头像后,则清除线上的cache,以确保下次页面读取的时候是最新上传的会员头像。但是,由于线上采取的是主从数据库的原因,可能导致下次读取的时候,新的数据未能同步到这台服务器上,这样就造成了会员头像不能及时更新的问题。

Open Toolbar