发布新日志

  • Objects in JavaScript

    2012-03-07 15:34:49

    1. 2 ways to create Object in JavaScript.:
    1. Literal notation is the one where we declare the object, and, at the same time, define properties and values in the object. It makes use of { }. See first one for an example.

    2. Constructor notation is where we make use of the keywords new Object(). We then use dot notation to add property and values to the object. See second one for an example.

    //Literal
    var australia = {   
    weather: "superb",   
    people: "not many of them but they're all great!",
    tourism: "a wonderful place to holiday. please visit!"};

    //Constructor
    var jordan = new Object();
    jordan.weather = "hot. but so are the people!";
    jordan.people = "see above!";
    jordan.tourism = "Codecademy's dream team retreat!";


    2. There are two different ways that we can retrieve an object's properties: dot and bracket notation.

    1. Dot notation: obj.myProp
    2. Bracket notation: obj["myProp"]   (You can also use variable in bracket notation.

    3. Functions in object are called Method.

    4. this keyword: Why is using the this keyword helpful? Imagine we have a method that has a lot of complicated code and references an object's properties. We also want many objects to have this method. We can create a single generic method that uses the this keyword. Now many objects can use this method by defining a method that simply equals this generic method.

  • 使用Math.floor和Math.random取随机整数

    2012-03-07 15:11:38

    Math.random():获取0~1随机数

    Math.floor() method rounds a number DOWNWARDS to the nearest integer, and returns the result. (小于等于 x,且与 x 最接近的整数。)
    其实返回值就是该数的整数位:
    Math.floor(0.666)   -->  0
    Math.floor(39.2783)   -->  39

    所以我们可以使用Math.floor(Math.random())去获取你想要的一个范围内的整数。
    如:现在要从1~52内取一个随机数:
    首先Math.random()*52  //这样我们就能得到一个 >=0 且 <52的数
    然后加1:Math.random()*52 + 1    //现在这个数就 >=1 且 <53
    再使用Math.floor取整

    最终: Math.floor(Math.random()*52 + 1)
    这就能得到一个取值范围为1~52的随机整数了.
  • admin SQLs - Check session or lock table

    2012-03-06 16:06:06

    select    nvl(ses.USERNAME,'ORACLE PROC') username,
        OSUSER os_user,
        PROCESS pid,
        ses.SID sid,
        SERIAL#,
        PHYSICAL_READS,
        BLOCK_GETS,
        CONSISTENT_GETS,
        BLOCK_CHANGES,
        CONSISTENT_CHANGES
    from    v$session ses,
        v$sess_io sio
    where     ses.SID = sio.SID
    order     by PHYSICAL_READS, ses.USERNAME;


    select  nvl(ss.USERNAME,'ORACLE PROC') username,
        se.SID,
        sn.NAME stastic,
        VALUE usage
    from     v$session ss,
        v$sesstat se,
        v$statname sn
    where      se.STATISTIC# = sn.STATISTIC#
    and      se.SID = ss.SID
    and    se.VALUE > 0
    order      by sn.NAME, se.SID, se.VALUE desc;

    select * from v$session;  --489 491 484


    select    nvl(ses.USERNAME,'ORACLE PROC') username,
        OSUSER os_user,
        PROCESS pid,
        ses.SID sid,
        SERIAL#,
        PHYSICAL_READS,
        BLOCK_GETS,
        CONSISTENT_GETS,
        BLOCK_CHANGES,
        CONSISTENT_CHANGES
    from    v$session ses,
        v$sess_io sio
    where     ses.SID = sio.SID
    order     by PHYSICAL_READS, ses.USERNAME;

    select * from v$session where suser = 'rmai';

    SELECT s.inst_id,
           s.sid,
           s.serial#,
           p.spid,
           s.username,
           s.program
    FROM   gv$session s
           JOIN gv$process p ON p.addr = s.paddr AND p.inst_id = s.inst_id
    WHERE  s.type != 'BACKGROUND'
    and SID in (484,
    491,
    499,
    531);

    --Find out the running sql script
    SELECT SE.sid, SE.serial#, PR.spid, SE.status, SUBSTR(SE.program, 1, 10) PROG,
      SUBSTR(SE.machine, 1, 10) MACH,
      SQ.sql_text
    FROM v$session SE, v$sqlarea SQ, v$process PR
    WHERE SE.paddr = PR.ADDR(+)
      AND SE.sql_address = SQ.address(+)
      AND schemaname <> 'SYS'
    ORDER BY SE.sid;


    --Find out the lock table
    select c.owner, c.object_name, c.object_type, b.sid, b.serial#, b.status, b.osuser, b.machine, b.logon_time, vp.spid
    from v$locked_object a , v$session b,  dba_objects c, v$process  vp
    where b.sid = a.session_id and vp.addr=b.paddr and a.object_id = c.object_id;


    --Kill session
    alter system kill session 'sid,serial#' ;


    --Check Users
    select
      username,
      osuser,
      terminal
    --  utl_inaddr.get_host_address(terminal) IP_ADDRESS
    from
      v$session
    where
      username is not null
    order by
      username,
      osuser;
  • Oracle 查看主外键约束

    2012-03-05 09:17:04

    select a.constraint_name, a.table_name, b.constraint_name 
    from user_constraints a, user_constraints b
    where a.constraint_type = 'R' 
    and b.constraint_type = 'P' 
    and a.r_constraint_name = b.constraint_name

    P 代表主键
    R 代表外键

    通过关联,能查询到你所想要的一切。

     

    select constraint_name from dba_cons_columns where table_name='';
    Alter table XX drop constraint sys…

    /////////////////////////////

    user_constraints,user_cons_columns查看外键

    Oracle 查看一个表对应的主键和外键的约束关系,查看的语句:

    select a.owner 主键拥有者

             ,a.table_name 主键表

            ,b.column_name 主键列

            ,C.OWNER 外键拥有者

            ,c.table_name 外键表

           ,d.column_name 外键列
    from user_constraints a
    left join user_cons_columns b

                on a.constraint_name=b.constraint_name
    left join user_constraints C

                ON C.R_CONSTRAINT_NAME=a.constraint_name
    left join user_cons_columns d

                on c.constraint_name=d.constraint_name
    where a.constraint_type='P'

        and a.table_name='XXX' --需要查看主外键关系的表
    order by a.table_name

    宁外的一种写法

    select
    a.owner 外键拥有者,
    a.table_name 外键表,
    substr(c.column_name,1,127) 外键列,
    b.owner 主键拥有者,
    b.table_name 主键表,
    substr(d.column_name,1,127) 主键列
    from
    user_constraints a,
    user_constraints b,
    user_cons_columns c,
    user_cons_columns d
    where
        a.r_constraint_name=b.constraint_name
    and a.constraint_type='R'
    and b.constraint_type='P'
    and a.r_owner=b.owner
    and a.constraint_name=c.constraint_name
    and b.constraint_name=d.constraint_name
    and a.owner=c.owner
    and a.table_name=c.table_name
    and b.owner=d.owner
    and b.table_name=d.table_name

    数据字典表列说明:

    desc user_constraints

    Name Comments
    OWNER 表的所有者
    CONSTRAINT_NAME 约束名
    CONSTRAINT_TYPE 约束类型
    TABLE_NAME Name associated with table with constraint definition
    SEARCH_CONDITION Text of search condition for table check
    R_OWNER Owner of table used in referential constraint
    R_CONSTRAINT_NAME Name of unique constraint definition for referenced table
    DELETE_RULE The delete rule for a referential constraint
    STATUS Enforcement status of constraint - ENABLED or DISABLED
    DEFERRABLE Is the constraint deferrable - DEFERRABLE or NOT DEFERRABLE
    DEFERRED Is the constraint deferred by default - DEFERRED or IMMEDIATE
    VALIDATED Was this constraint system validated? - VALIDATED or NOT VALIDATED
    GENERATED Was the constraint name system generated? - GENERATED NAME or USERNAME
    BAD Creating this constraint should give ORA-02436. Rewrite it before2000 AD.
    RELY If set, this flag will be used in optimizer
    LAST_CHANGE The date when this column was last enabled or disabled
    INDEX_OWNER The owner of the index used by the constraint
    INDEX_NAME The index used by the constraint
    INVALID  
    VIEW_RELATED  


    desc user_cons_columns;

    Name Default Comments
    OWNER Owner of the constraint definition
    CONSTRAINT_NAME Name associated with the constraint definition
    TABLE_NAME Name associated with table with constraint definition
    COLUMN_NAME Name associated with column or attribute of object column specified in the constraint definition
    POSITION Original position of column or attribute in definition

     

    http://blog.csdn.net/maqinqin/archive/2009/05/26/4217045.aspx

    desc   后发现
    user_constraints是表约束的视图,描述的是约束类型(constraint_type)是什么,属于哪些表(table_name),如 果约束的类型为R(外键)的话,那么r_constraint_name字段存放的就是被引用主表中的主键约束名。   
    user_cons_columns是表约束字段的视图,说明表中的和约束相关的列参与了哪些约束。这些约束有主键约束,外键约束,索引约束.
    两者可以通过(owner,constraint_name,table_name)关联

    select
    a.owner 外键拥有者,
    a.table_name 外键表,
    substr(c.column_name,1,127) 外键列,
    b.owner 主键拥有者,
    b.table_name 主键表,
    substr(d.column_name,1,127) 主键列
    from
    user_constraints a,
    user_constraints b,
    user_cons_columns c,
    user_cons_columns d
    where
        a.r_constraint_name=b.constraint_name
    and a.constraint_type='R'
    and b.constraint_type='P'
    and a.r_owner=b.owner
    and a.constraint_name=c.constraint_name
    and b.constraint_name=d.constraint_name
    and a.owner=c.owner
    and a.table_name=c.table_name
    and b.owner=d.owner
    and b.table_name=d.table_name

    数据字典表列说明:

    desc user_constraints

    Name                                      

    http://www.blogjava.net/sunzhong/articles/289139.html

     

    /////////////////////////////////////

     

    Oracle 查看一个表对应的主键和外键的约束关系,查看的语句:

    select a.owner 主键拥有者

             ,a.table_name 主键表

            ,b.column_name 主键列

            ,C.OWNER 外键拥有者

            ,c.table_name 外键表

           ,d.column_name 外键列
    from user_constraints  a
    left join user_cons_columns b

                on  a.constraint_name=b.constraint_name
    left join user_constraints C

                ON C.R_CONSTRAINT_NAME=a.constraint_name
    left join user_cons_columns d

                on c.constraint_name=d.constraint_name
    where  a.constraint_type='P'

        and  a.table_name='XXX' --需要查看主外键关系的表
    order by a.table_name

    宁外的一种写法

    select
    a.owner 外键拥有者,
    a.table_name 外键表,
    substr(c.column_name,1,127) 外键列,
    b.owner 主键拥有者,
    b.table_name 主键表,
    substr(d.column_name,1,127) 主键列
    from
    user_constraints a,
    user_constraints b,

    user_cons_columns c,
    user_cons_columns d
    where
        a.r_constraint_name=b.constraint_name
    and a.constraint_type='R'
    and b.constraint_type='P'
    and a.r_owner=b.owner
    and a.constraint_name=c.constraint_name
    and b.constraint_name=d.constraint_name
    and a.owner=c.owner
    and a.table_name=c.table_name
    and b.owner=d.owner
    and b.table_name=d.table_name

    数据字典表列说明:

    desc user_constraints

     

    Name Comments
    OWNER 表的所有者
    CONSTRAINT_NAME 约束名
    CONSTRAINT_TYPE 约束类型
    TABLE_NAME Name associated with table with constraint definition
    SEARCH_CONDITION Text of search condition for table check
    R_OWNER Owner of table used in referential constraint
    R_CONSTRAINT_NAME Name of unique constraint definition for referenced table
    DELETE_RULE The delete rule for a referential constraint
    STATUS Enforcement status of constraint -  ENABLED or DISABLED
    DEFERRABLE Is the constraint deferrable - DEFERRABLE or NOT DEFERRABLE
    DEFERRED Is the constraint deferred by default -  DEFERRED or IMMEDIATE
    VALIDATED Was this constraint system validated? -  VALIDATED or NOT VALIDATED
    GENERATED Was the constraint name system generated? -  GENERATED NAME or USERNAME
    BAD Creating this constraint should give ORA-02436.  Rewrite it before2000 AD.
    RELY If set, this flag will be used in optimizer
    LAST_CHANGE The date when this column was last enabled or disabled
    INDEX_OWNER The owner of the index used by the constraint
    INDEX_NAME The index used by the constraint
    INVALID  
    VIEW_RELATED  

    desc user_cons_columns;

     

    Name Default Comments
    OWNER Owner of the constraint definition
    CONSTRAINT_NAME Name associated with the constraint definition
    TABLE_NAME Name associated with table with constraint definition
    COLUMN_NAME Name associated with column or attribute of object column specified in the constraint definition
    POSITION Original position of column or attribute in definition
  • DML、DDL、DCL区别

    2011-09-16 09:44:28

    总体解释:
    DML(data manipulation language):
           它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言
    DDL(data definition language):
           DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用
    DCL(Data Control Language):
           是数据库控制功能。是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句。在默认状态下,只有sysadmin,dbcreator,db_owner或db_securityadmin等人员才有权力执行DCL

    详细解释:
    一、DDL is Data Definition Language statements. Some examples:数据定义语言,用于定义和管理 SQL 数据库中的所有对象的语言
          1.CREATE - to create objects in the database   创建
          2.ALTER - alters the structure of the database   修改
          3.DROP - delete objects from the database   删除
          4.TRUNCATE - remove all records from a table, including all spaces allocated for the records are removed
          TRUNCATE TABLE [Table Name]。
      下面是对Truncate语句在MSSQLServer2000中用法和原理的说明:
      Truncate table 表名 速度快,而且效率高,因为:
      TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。
      DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。
      TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 DELETE。如果要删除表定义及其数据,请使用 DROP TABLE 语句。
      对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 WHERE 子句的 DELETE 语句。由于 TRUNCATE TABLE 不记录在日志中,所以它不能激活触发器。
      TRUNCATE TABLE 不能用于参与了索引视图的表。
           5.COMMENT - add comments to the data dictionary 注释
           6.GRANT - gives user's access privileges to database 授权
           7.REVOKE - withdraw access privileges given with the GRANT command   收回已经授予的权限

    二、DML is Data Manipulation Language statements. Some examples:数据操作语言,SQL中处理数据等操作统称为数据操纵语言
           1.SELECT - retrieve data from the a database           查询
           2.INSERT - insert data into a table                    添加
            3.UPDATE - updates existing data within a table    更新
           4.DELETE - deletes all records from a table, the space for the records remain   删除
           5.CALL - call a PL/SQL or Java subprogram
           6.EXPLAIN PLAN - explain access path to data
           Oracle RDBMS执行每一条SQL语句,都必须经过Oracle优化器的评估。所以,了解优化器是如何选择(搜索)路径以及索引是如何被使用的,对优化SQL语 句有很大的帮助。Explain可以用来迅速方便地查出对于给定SQL语句中的查询数据是如何得到的即搜索路径(我们通常称为Access Path)。从而使我们选择最优的查询方式达到最大的优化效果。
           7.LOCK TABLE - control concurrency 锁,用于控制并发

    三、DCL is Data Control Language statements. Some examples:数据控制语言,用来授予或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,对数据库实行监视等
           1.COMMIT - save work done 提交
            2.SAVEPOINT - identify a point in a transaction to which you can later roll back 保存点
           3.ROLLBACK - restore database to original since the last COMMIT   回滚
           4.SET TRANSACTION - Change transaction options like what rollback segment to use   设置当前事务的特性,它对后面的事务没有影响.



    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/level_level/archive/2009/06/07/4248685.aspx
  • QTP9.2无法录制IE7.0脚本(The Browser Application can't be launched.)

    2009-08-03 16:34:01

    QTP9.2无法录制IE7.0脚本

    错误信息:The Browser Application can't be launched.

    运行环境:Vista 32位 + IE7.0 + QTP9.2

    刚刚在置顶帖里下载了QTP9.2,并成功破解~
    正准备录制脚本,发现无论在IE里输入什么,都没有脚本生成。

    然后在Record and Run Settings里,设置成Open the following address when a record or run session begins.
    网址是:http://www.google.com
    其他选项没有修改。

    一点击录制,IE7.0是打开了,也进入到google主页,但是QTP提示出错.
    在IE里无论怎么输入,QTP里还是没有任何脚本。
     
    解决方法:
    是由于IE7.0的安全设置所导致
    只要在IE7.0里,把要进行测试的网站加入到信任列表当中,并去掉Internet Options-Security-Internet下的Protect Mode即可~
  • 软件测试也是有创造性的~

    2009-03-13 13:22:58

    进入软件测试行业,进入现在这个公司,仅仅1个多月的时间。

    08年7月毕业,因为找不到好的工作,所以选择了去培训。其实在学校的时候,我就已经自学编程了,学过C#,也写过一个很小很小的留言本程序。但发现自己对编程的接受程度很慢,不知道是因为没有相关课程的基础,或是没有老师的讲解,总感觉学起来吃力。但是又因为喜欢软件,而且我相信,质量会在短时间内成为一个重要的指标,所以选择软件测试这个行业了。

    软件测试,对于产品而言的创造性,对于开发而言的确有差距。因为只有开发人员把产品开发好了,我们才能真正去测试它。他们是这个产品的创造者。

    进入公司的一个多月,也基本天天在写用例,修改用例。每次发过去的用例,Manager都会有批注,每次都说我们想得不够仔细,每次都要修改或增加。

    昨天写一个增加功能的用例,就参考了组员们为另一个功能模块写的增加功能用例,然后再在论坛上找一些编写用例的帖子,吸取别人的经验,再综合大家不同的思考的角度,最终写了一个自我感觉良好的用例集。不过,现在Manager还没看,希望这次的批注少些吧。

    写完用例了,还在想,有没有什么地方遗漏了。突然感觉,其实软件测试也是很有创造性的嘛。别人没有想过的方法,别人没有想到的检查点等等,你挖掘到了,你想到,那就是创新。

    写用例的时候可以创新,运行程序的时候可以创新,处处都存在着给你创新的机会。

    写用例,不是一件容易的事情,想做好它,你要有软件测试的知识,你要了解所要测试的系统,而且要有开阔的思维。

    让我们写好用例,做好测试!!让老板知道,他的开发人员只是帮他把产品做出来,而测试能够保证产品质量,提高客户满意度,带来更多的客户。让老板相信,软件是要开发和测试共同努力才能做好的。也让老板重视我们吧!!

  • 2月份总结

    2009-03-04 21:46:22

  • TP SYSTEMS开业!

    2009-02-21 20:40:55

  • 可悲的测试人员

    2009-01-14 22:59:17

    前两天去一个公司面试,遇到这么一幕

    当时是中午,会议室空荡荡的,刚开始就我一个人,做完题,就坐在那等了。

    在等待的时候,一个人拿着试题进来了

    他坐我后面

    突然,他拿着那份试题来问我,这是测试的题目吗,我看了下,确实是我刚才做的那个啊

    他指着前面的计算机基础题,表情很迷茫

    然后又看着后面的编程题,再问我,这个是测试的题目吗?我很肯定的回答:“是”

    之后他就是一副无奈的表情,和我说,他是来应聘软件测试,为什么考代码题啊~

    后来他问我大学是不是读软件的,我也很肯定的回答,不是~~

    最后,他就拿着那份让他感觉非常懊恼的试卷,交回给前台,然后离开了

    看着他的离去,总有些悲伤

    那些都是计算机基础知识啊,而且都是选择题,看一下,起码会几个吧~

    代码题也只是要求看代码,写结果而且,又不是要你去编

    看着这位同志,就像之前老师讲的,外界所认为的测试人员,只是最底层的执行人员,不需要懂代码,不需要懂方法,只要是一个人就可以了。

    但是,测试人员,虽然编程不需要多么精通,但起码要看懂代码啊;计算机知识应该算是最基础的东西吧,不要能背,起码给你做选择题,能回忆起来吧;这些都是最基本的啊!!

    想做测试,先了解清楚吧。不要连自己也认为,我做不了开发,所以搞测试;因为测试简单,容易混日子,所以搞测试!

  • 课程结束了,但学习还得继续!

    2008-12-28 15:49:08

    51的课程已经结束一个星期了

    22号的时候,本来有一次很好的机会,到平安银行做QTP自动化测试,可惜,自己非常不争气。早上去了,面试还好,但到机试的时候,对方经理随便找了台机器,给我10分钟,让我录制一个软件查询功能的测试脚本。机器可能开很长时间了,有点慢,开QTP+软件就用了2分多钟。刚开始只选了JAVA+WEB的add-in,但发现登录的时候录制的不到任何脚本,然后重开QTP,把能选的add-in全选上了,但还是录不了。当时就慌了~~把选项弄了大半天的,还是不行,最后只留下双击快捷键的一行命令。

    最后,因为机试没有通过,自己白白浪费了这次这么好的机会!

    事后和朴老师讲述面试的过程,和老师讲了当时录制脚本时的情况,老师也说了,可以自己写WSH,然后用SENDKEYS就可以啦~老师说了才想起来,对啊,录不了就自己写呗!当时可真郁闷。后来自己找了一个软件,尝试录制登录,但发现代码行根本就没有东西,好,用WSH+虚拟对象。发现根本就不难,如果之前做了练习,这些天可能已经在上班了。

    自己想了一下,其实根本在于自己。上课老师讲了,自己也听懂了。可是因为课上没遇到那情况(上课是录自带的Flight程序,自带的,当然想录什么都能录下来嘛),下课了,也只是拿Flight做练习,成功了就不管了。

    真正想要学东西,是要出错才能学到了。太顺利不好!

    其实那天面试失败,真的给我很沉重的打击。课程结束了,大部分人都已经找到工作了,自己有机会,没能把握,又快过年了,意识确实有些消沉。不过,刚好看到“假装不在”的【赠失业兄弟】,很是鼓舞!现在正是按照里面的7条做法,一步步的提升自己!

    嗯,虽然现在没有工作,但是做好充足的准备,我相信,工作很快就能找到的!!

  • 51培训结束了

    2008-12-20 21:50:23

    12月19号,在51testing的培训结束了。

    7月16号,第一天来上课,我是8:45到的课室,但已经坐满了人~~51的传统,第一天不讲课,发教材,讲51历史,讲课程安排,而且还要自我介绍。那天,我看到了徐老师,朴老师,盛老师。

    每一节课都非常认真的听讲,真的从未这么认真过。可能是因为高额的学费,可能是因为就业的压力,可能是因为班上的氛围。

    每个星期一三五上课,二四六自习or休息,就这样重复着。

    不知道什么时候,突然来了一个漂亮的老师,魏老师。哦,原来是我们班主任哦,呵呵~~同学们都非常高兴。那些天,我看魏老师都是好悠闲的过日子。

    也不知道什么时候,金融危机降临了,当时还没有什么感觉。

    后来,班上有几个大四还没毕业的同学要回学校弄他们的毕业论文,提前离开了51。

    再后来,就开始推荐就业了,不少的同学开始找工作了。我当时还不急,只是随随便便投了几个公司。但是,一直都没有回音,班上的同学也陆陆续续的离开了,来上课的人变得越来越少了。徐老师之前讲过,越到后面,心就越急了。确实如此,看着大家都离去了,自己还在这里,真有一种说不出的感受,偶尔只能用“他们浪费了培训的金钱”之类的借口来安慰自己了。

    之后就开始疯狂的投递简历,但可能因为是刚毕业,没有工作经验,所以网上投的根本就没有回应。

    到最后一周,每天就那5-8个人来上课,大家都没有什么心思听课了。

    一直以为自己不会是最后走的人,怎么知道...看着大家都把自己卖出去了,自己却还在这,自信心确实受到不小的打击。不过谢谢各位老师给我的鼓励,呵呵~~谢谢你们!!

    昨天,最后一天上课,因为魏老师推荐,所以有了一次去文思创新面试的机会,早上去了,下午回来,人都走光了。看着空荡荡的教室,回想起这5个月的点点滴滴。

    其实自从推荐就业以来,魏老师一直都忙着帮我们找企业,都希望我们能找到好的工作,每天很晚才下班。今天又有一个面试机会,大家都回学校面试,刚好给我看到魏老师的打卡记录,这些日子,老师都是8点多到学校,晚上10点多11点才走的。魏老师,辛苦你了。

    来51testing培训,学到了很多,也因为这里,得到了更多的机会。

    加入了51,就等于加入了一个黑社会!!我们在测试这一行,是有很多人脉的,呵呵!!

    祝愿51发展的更好,这样,我们学员也就走得更好了,呵呵!!!

    谢谢51,谢谢各位老师!!

  • QTP小结

    2008-11-25 16:11:40

    昨天朴老师给我们上了一天QTP的总结,朴老师实在喜欢折腾人。还记得月初的一次模拟面试,学习了3个多月,感觉自己还是挺牛的嘛,不过朴老师的技术面试简直是把我的自信心给完全打碎了。技术牛的人,就是喜欢深究,他问一个问题,你回答上了,他就会不停的在你的回答中寻找下一个问题,直至把你问倒!

    印象很深刻的一个问题,GUI功能测试和性能测试的区别:GUI是基于开发语言的,而性能测试是基于协议的。

    QTP识别对象的原理:QTP要求先在仓库文件里定义仓库对象,里面存有实际对象的特征属性的值,运行的时候,QTP会根据仓库对象的特征属性描述,寻找到实际对象,然后操作实际对象。
    QTP对象中有两个很重要的东西,就是Test Object(简称TO)和Runtime Object(简称RO)。根据字面意思,TO是静态的,RO是动态的,我们做自动化测试,大部分是使用动态数据,所以RO用得比较多。对于这两个概念,网上有很多资料,大家可以去搜搜看。

    昨天上课主要是做计算器的自动化框架,因为是数据驱动框架,所以分三层设计:配置层,驱动层,执行层。

    首先是配置层,就是读取config.txt配置文件,选取具体的数据来源(Access,SQL,Excel,File)。然后把配置文件内容传给驱动层,由驱动层选择相应的执行函数。编写完基本框架后,就是写增强型代码了。读取路径函数,自己通过Descrīption.Create()创建对象,减小对象库的空间。最后还可把代码放入lib.vbs中,在QTP加入相关vbs文件,即可直接调用相关函数,大大简化QTP中的代码行数。

    经过一天的努力,竟然写出一个近200行的代码,嗯,就像老师说的,感觉很爽,呵呵~~

    明天就是徐老师的LoadRunner,要养足精神,好好听课!


    '-------------------------------------------------------------------
    Dim dirpath
    dirpath = folder_path    '保存相对路径

    Dim sumresult

    SystemUtil.Run "calc.exe"
    Call Config_Level

    '-------------------------------------------------------------------
    '#########################################
    '#                创建对象
    '#########################################
    Sub  Object_Create(str_x_Button)
    Set  Win_Calc=Descrīption.Create()
    Win_Calc("regexpwndtitle").Value="计算器"
    Win_Calc("regexpwndclass").Value="SciCalc"

    Set Win_Calc_Btn=Descrīption.Create()
    Win_Calc_Btn("text").Value=str_x_Button
    Win_Calc_Btn("nativeclass").Value="Button"

    Window(Win_Calc).WinButton(Win_Calc_Btn).Click

    Set Win_Calc_Btn=Nothing
    Set Win_Calc=Nothing

    End Sub

    '-------------------------------------------------------------------
    '#########################################
    '#              得到相对路径
    '#########################################
    Function folder_path()
     Dim str_full_path 'as string
     Dim str_testname 'as string
     str_full_path = Environment("TestDir")
     str_testname = Environment("TestName")
     folder_path = mid(str_full_path,1,len(str_full_path) - len(str_testname) -len( "scrīpt")-1)
    End Function

    '-------------------------------------------------------------------
    '######################################
    '#             点击函数
    '######################################
    Function operation(num1,num2,operate)
       Dim tmp1
       Dim tmp2
     i = 1
     While i <= len(num1)
      tmp1 = mid(num1,i,1)
      Object_Create tmp1
      i = i + 1
     Wend
     Object_Create operate
     j = 1
     While  j <= len(num2)
      tmp2 = mid(num2,j,1)
      Object_Create tmp2
      j = j + 1
     Wend
     Object_Create "="
    End Function

    '-------------------------------------------------------------------
    '配置层
    '读取配置文件
    Sub Config_Level
     Dim fsoconfig
     Dim fconfig
     Set fsoconfig = CreateObject("scrīpting.FileSystemObject")
     Set fconfig = fsoconfig.OpenTextFile(folder_path + "\config\config.txt",1,False)

       Do While fconfig.AtEndOfLine <> True
        str_Config = fconfig.ReadLine
        Driver_Level str_Config
       Loop

       fconfig.Close
       Set fconfig = Nothing
       Set fsoconfig = Nothing
    End Sub

    '-------------------------------------------------------------------
    '驱动层
    Sub Driver_Level(s_Config)
       Dim str_file
       Dim i
        str_file = split(s_Config,",")
        For i = lbound(str_file) to ubound(str_file)
            Select Case str_file(i)
          Case "auto"
        Execute_AutoSource
       Case "f"
           Execute_FileSource
      End Select
     Next
    End Sub

    '-------------------------------------------------------------------
    '执行层
    '######################################
    '#             使用access数据库
    '######################################
    Sub Execute_AccessSource
     Dim Conn 'as Adodb.Connection
     Dim Rst  'as Adodb.RecordSet
     Set Conn = CreateObject("ADODB.Connection")
     Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + folder_path + "\data\data.mdb;Persist Security Info=False"
     Set Rst = CreateObject("ADODB.RecordSet")
        Rst.Open "select * from actest",Conn

     Rst.MoveFirst
     Do While Rst.Eof<>True
             acnum1 = Rst.Fields(1)
       acnum2 = Rst.Fields(2)
       acoperate = Rst.Fields(3)
       operation acnum1,acnum2,acoperate
       Rst.MoveNext
     Loop
    End Sub

    '######################################
    '#             使用txt文件
    '######################################
    Sub Execute_FileSource
      Dim fso
     Dim f
     Set fso = CreateObject("scrīpting.FileSystemObject")
     Set f = fso.OpenTextFile(folder_path + "\data\data.txt",1,False)

       Do While f.AtEndOfLine <> True
        str_temp = f.ReadLine
        temp_split = split(str_temp,",")
           num1 = temp_split(0)
        num2 = temp_split(2)
        ōperate = temp_split(1)
        operation num1,num2,operate
       Loop

       f.Close
       Set f = Nothing
       Set fso = Nothing  
    End Sub

    '######################################
    '#       自动产生随机数和操作符
    '######################################
    Sub Execute_AutoSource
     Dim num1
     Dim operate
     Dim num2
     Dim result

     '随机数1
       num1 = 10 * Rnd
       
     '随机数2
        num2 = 1000 * Rnd
       
     '随即操作符
     Randomize
     operate_temp = Int((4 * Rnd) + 1)
     Select Case operate_temp
         Case 1
                ōperate = "+"
      Case 2
       operate = "-"
      Case 3
       operate = "*"
      Case 4
       operate = "/"
     End Select

     operation num1,num2,operate
    End Sub

    '######################################
    '#            使用Excel数据
    '######################################
    Sub Execute_ExcelSource
       DataTable.Import(folder_path + "\data\data.xls")     '把excel数据导入default.xls中临时存放
       DataTable.SetCurrentRow (1)
       For i_Record_Count  = 1 to DataTable.GetRowCount
           operation DataTable("exnum1","Global"), DataTable("exnum2","Global"), DataTable("exoperate","Global")
        DataTable.SetNextRow
       Next
      
    End Sub
    '-------------------------------------------------------------------
    本人编码能力较差,代码是给自己留念和日后参考。 有许多漏洞,请各位见谅。

  • 想做好测试,必须要不断的思考!

    2008-11-16 22:16:19

    上星期,北京的马林老师给我们上了两天的课,虽然时间短暂,但老师给了我好多信息。

    之前可能收理论课程的影响,在做项目测试的时候,编写用例,都是非常的死板。看到输入框就是等价类,边界值。看到有下拉列表或者复选框,就选正交分析。思想好像就被固化掉了~

    马林老师刚到,就说要我们测“海达票务”,又是海达,又是测试。原本还以为要重复劳动了。第一次的分析,基本上和第一阶段时没啥区别,因为一直以来都只是上课听老师灌输知识,学到什么是什么,很少去思考真正应该怎样测试。

    但当其中一组在介绍功能点时,就发现了我们的不足,很严重的不足。对于一个被测试软件,我们只是看其表面,基本上是根据GUI去测试的。但经过马林老师的讲解,发现好多好多可测试点。要从软件的界面,输入框,去抠程序内部的一些逻辑问题,然后再分析这些逻辑,找出测试点。

    例如一个“船票查询”功能,有很多的组合,想当然的就使用正交分析,但如果要真正组合,那需要很多的用例啊。接着老师给我们分析,里面有一个工号和用户名两个可选项,如果有一个工号是000,用户名为admin的用户,我们选择工号001,用户名admin,查询的结果为空。这说明什么呢?!就是说明程序内部这个查询功能的select语句是使用and来连接所有的条件。

    这样分析之后,就发现用正交分析法是多余的了。选择所有条件组合测一遍就已经可以把所有组合都测试完毕了。因为使用and,你抽取某两个选项来测试,只是在and语句中去掉某些条件,那全部都能通过,其中的几个一样也能通过。

    通过马林老师这样的讲解,我真正明白了,测试不是那么简单,51也不仅仅是培训。第一阶段,xulinlin老师讲的理论知识非常重要,这是基础,只有打好地基,才能把楼建得更高,更好!每一个老师来讲课,都能吸收不同的思想。

    想做好测试,必须要不断的思考!

  • SugarCRM项目心得1

    2008-10-09 17:04:37

    放假回来以后,就进入到SugarCRM项目的实战了。

    做一个项目,首先要了解当前项目的基本知识。首先要了解什么是CRM,这个去Google一把,就一堆答案了。CRM的三大功能一定要记住:销售管理,市场管理,服务管理然后就是对测试的项目的了解。由于我们是使用SugarCRM这个开源的客户关系管理系统,所以,没有需求说明书,我们只能依靠纯英文的用户手册来自己总结出一些功能点,作为以后设定计划和方案的测试项。

    由于系统比较庞大,所以老师是给我们分组进行的。我们小组是负责Calendar和Activities模块。一上来,老师就直接叫我们阅读文档,然后总结功能点。由于之前没有任何经验,所以无从下手,只能依靠英语知识,来翻译用户手册。最后交付给老师的文档,是我们小组5人总结出来的内容。但经过老师课上的讲评,这是功能点的总结,而不是翻译。我们需要对文档仔细的阅读,对该模块内存在的功能点描述清楚就可以了。

    其实Calendar模块和Activities模块是有密切关系的两个模块。在我的理解,Calendar是对时间表的一个大致了解,能够知道你某个时间段内各活动的时间安排。Activities模块则是对活动的内容进行细化,安排每一个活动的细节内容。

    Calendar模块:
    1.以日视图,周视图,月视图,年试图,共享模式查看时间表
    2.安排电话
    3.安排会议
    4.添加任务
    5.电话管理
    6.会议管理
    7.任务管理

    Activities模块:
    1.安排电话
    2.安排会议
    3.添加任务
    4.电话管理
    5.会议管理
    6.任务管理
    (以上功能同Calendar模块)
    7.创建备忘录和附件
    8.添加存档电子邮件(电子邮件模块)
    9.备忘录管理
    10.存档电子邮件管理(电子邮件模块)
    11.今日管理
    12.导入备忘录
    13.搜索功能
    14.批量增加

    Activities模块是销售活动模块,它规定了具体的活动内容,而且与许多模块都有关联,例如Account,Opportunities等模块,这说明销售活动模块是这个系统内的一个主流程。是最重要的功能之一。

  • 第一阶段结束了~~

    2008-09-13 10:00:46

    从7月16号,到9月10号。第一阶段的学习结束了,也迎来了第一次的考试。

    首先说一下51吧。51的教学方法是1,3,5上课;2,4,6,7休息。我认为这是一种很好的教学方式,我很喜欢。因为这样,对于没有基础的同学(例如我),可以在休息的时候,恶补自己的计算机基础知识,什么编程语言啊,数据库知识,数据结构之类的。还可以给自己时间去消化课堂上的知识。如果没弄懂,又没时间精力去搞明白,然后第二天接着上课,这样,问题就会越积越多!回想起刚入学的时候,对软件测试毫无了解的我,经过51史上最有智慧的男人,xulinlin老师的教导后,终于对软件测试有了基本的了解。

    从小学开始,就不太喜欢学习的我,笔记自然也就很少。但是,在51这里,良好的学习氛围,还有就是面临着以后工作的压力,使得我真正的有了改变。第一阶段我就记了满满一本笔记本的笔记,自己看到还会觉得有些恐怖。因为我之前是读通信专业的,只是自己对电脑,对编程的热情,使自己对计算机系的内容有所了解,不过也就停留在皮毛上。

    好了,废话就说这么多,正式进入正题。

    软件测试基础,就像徐老师说的,其实所有的东西基本都是围绕这三个方面,就是成本,质量,进度。测试过程,软件质量,测试方法,各类的管理,个种测试类型等等,最终需要解决的就是怎样使这三方便达到一个平衡,或者说使他们的关系更符合你公司,你的产品的需要。

    第一阶段的内容,基本都是理论知识为主,都是基础内容。基础很重要,我已经是感受良多。小时候,对英语的热情,还有就是和朋友一起去参加补习,所以英语基础好。所以,初中,高中,大学的英语都能够学得比较轻松。但数学,语文,因为基础太差,所以无论怎么学,感觉都还是很困难。(本人文采基本为0,所以文章有什么问题,希望大家见谅)所以,大家一定要记住,有好的基础,才能使你更轻松的往上发展!

    这一次的考试,说难嘛,不会很难,说容易嘛,又有很多小问题会在复习的时候被忽略掉。好像“在oracle中,如何使用Sql*Plus查看表的表结构”;“在oracle中,使用什么命令过滤掉有重复的内容”;还有就是简答题,换一种问法,自己就不知道改怎么回答了,“谈谈你对Bug的认识”之类的。这还是因为自己平时忽略了一些问题,只是看笔记,但没有真正的去思考,去总结。

    说到总结,这真的很重要。如果记了笔记,背了笔记,你把考试考完了,基本上就忘了。所以,看笔记的时候,一定要结合几本参考书,上网找找相关资料,去理解,去总结!这样,你才能够真正把老师讲的变成你的东西。

    不知道以后会不会有什么师弟们会在搜索的时候,搜到我这篇东西呢。

    再给要准备第一阶段的人一个提醒,就是上课一定要认真听!!练习和作业一定要认真做!!因为题目很有可能是做过的!!还有,就是如果开通了权限,可以到“就业专版”,有一个同志非常厉害的用Mindjet MindManager Pro 7做了第一阶段各知识点的概括,总结。是一个非常不错复习资料!!

    好了,第二阶段开始了!!!真正的动手了~~~要继续努力!!!要记得自己入学时的计划,承诺!

Open Toolbar