-
Objects in JavaScript
2012-03-07 15:34:49
1. 2 ways to create Object in JavaScript.: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.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.
- Dot notation: obj.myProp
- 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 thethis
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 bon a.constraint_name=b.constraint_name
left join user_constraints CON C.R_CONSTRAINT_NAME=a.constraint_name
left join user_cons_columns don 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 definitionhttp://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 bon a.constraint_name=b.constraint_name
left join user_constraints CON C.R_CONSTRAINT_NAME=a.constraint_name
left join user_cons_columns don 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=NothingEnd 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
Loopfconfig.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",ConnRst.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
Loopf.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 Selectoperation 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做了第一阶段各知识点的概括,总结。是一个非常不错复习资料!!
好了,第二阶段开始了!!!真正的动手了~~~要继续努力!!!要记得自己入学时的计划,承诺!
标题搜索
我的存档
数据统计
- 访问量: 13543
- 日志数: 16
- 建立时间: 2008-08-05
- 更新时间: 2012-03-07