-
QTP-action模板
2009-02-08 22:34:38
新建一个文本,输入一些新建Action时常包含的信息,然后保存为ActionTemplate.MST文件,
并复制到QTP/dat目录下;这样每次新建action都会包含固定的信息了;
例如:
'-------------------脚本说明---------------
'产品版本: __Build( )
'测试员:
'编写日期:
'测试功能:
'脚本类型:
'被测试对象初始状态:
'进展程度:
'基本思路:
'主要功能函数:
'历史修改:
'没解决的问题:
'--------------------脚本内容-------------当然了,脚本的说明内容可以随意修改,但必须保存到dat目录下,并且文件的名字为:ActionTemplate.MST
《!出自别人的日志》来自:http://butestnote.spaces.live.com/blog/cns!58DD013E49E92756!148.trak
-
QTP 关于文件的操作
2009-02-08 22:10:04
创建文件
dim fso, f
set fso = CreateObject("scrīpting.FileSystemObject")
set f = fso.CreateTextFile("d:\test.txt", true) '第二个参数表示目标文件存在时是否覆盖
f.Write("写入内容")
f.WriteLine("写入内容并换行")
f.WriteBlankLines(3) '写入三个空白行(相当于在文本编辑器中按三次回车)
f.Close()
打开并读文件
dim fso, f
set fso = CreateObject("scrīpting.FileSystemObject")
set f = fso.OpenTextFile("C:\test.txt", 1, false) '第二个参数 1 表示只读打开,第三个参数表示目标文件不存在时是否创建
f.Skip(3) '将当前位置向后移三个字符
f.SkipLine() '将当前位置移动到下一行的第一个字符,注意:无参数
response.Write f.Read(3) '从当前位置向后读取三个字符,并将当前位置向后移三个字符
response.Write f.ReadLine() '从当前位置向后读取直到遇到换行符(不读取换行符),并将当前位置移动到下一行的第一个字符,注意:无参数
response.Write f.ReadAll() '从当前位置向后读取,直到文件结束,并将当前位置移动到文件的最后
if f.atEndOfLine then
response.Write("一行的结尾!")
end if
if f.atEndOfStream then
response.Write("文件的结尾!")
end if
f.Close()
set f = nothing
set fso = nothing
打开并写文件
dim fso, f
set fso = CreateObject("scrīpting.FileSystemObject")
set f = fso.OpenTextFile("C:\test.txt", 2, false) '第二个参数 2 表示重写,如果是 8 表示追加
f.Write("写入内容")
f.WriteLine("写入内容并换行")
f.WriteBlankLines(3) '写入三个空白行(相当于在文本编辑器中按三次回车)
f.Close()
set f = nothing
set fso = nothing
判断文件是否存在
dim fso
set fso = CreateObject("scrīpting.FileSystemObject")
If fso.FileExists("d:\test.txt") then
msgbox "目标文件存在"
else
msgbox "目标文件不存在"
end if
移动文件
dim fso
set fso = CreateObject("scrīpting.FileSystemObject")
call fso.MoveFile("d:\test2.txt", "e:\test111.txt") '两个参数的文件名部分可以不同. "e:\test111.txt"文件如果存在,则出错提示文件已经存在.
复制文件
dim fso
set fso = CreateObject("scrīpting.FileSystemObject")
call fso.CopyFile("d:\test2.txt", "e:\test111.txt") '两个参数的文件名部分可以不同. "e:\test111.txt"如果已经存在,也会被覆盖为新的。
删除文件
dim fso
set fso = CreateObject("scrīpting.FileSystemObject")
fso.DeleteFile("C:\test.txt")
set fso = nothing
创建文件夹
dim fso
set fso = CreateObject("scrīpting.FileSystemObject")
fso.CreateFolder("C:\test") '目标文件夹的父文件夹必须存在
set fso = nothing
判断文件夹是否存在
dim fso
set fso = CreateObject("scrīpting.FileSystemObject")
if fso.FolderExists("d:\Windows") then
msgbox"目标文件夹存在"
else
msgbox"目标文件夹不存在"
end if
set fso = nothing
删除文件夹
dim fso
set fso = CreateObject("scrīpting.FileSystemObject")
fso.DeleteFolder("C:\test") '文件夹不必为空
set fso = nothing -
QTP中生成随机数
2009-02-08 21:22:00
如下:
n=randomnumber.value(1,255)
msgbox n
用msgbox可以看到每次运行时显示的都是不同的数。范围在1,255内。
-
拷贝的脚本无法用
2009-02-08 20:28:11
经常把一个脚本的代码拷贝到另一个新脚本中,运行是会出错,找不到对象的。
今天看了一下论坛才知道要整个目录拷贝才可以,这样就会连对象库都一起拷贝了。
转了以下的问题及答案,可以解答此问题。
问题:请教,对象库中找不到相应的测试对象?
回答:1、键要看你的对象库,Copy过来的脚本为什么不能用,就是因为在你现在的这个脚本中的对象库你没有测试对象,所以QTP无法运行。你只是Copy了脚本,但对象不会和随脚本一起Copy过来。呵呵。。。还有就是你要看你的对象是不是变了,包括对象的属性等等,因为QTP是靠对象的属性去查找应用程序中的对象的。我上次也碰到这样的情况,在我的脚本中有一个对象是时间。但时间在变,所以我把周二录的脚本在周四的时候就不能回放,也是由于对象名变了,QTP就无法去识别应用程序的对象了。这样的话只要在对象库中把相应的属性改一下就可以了。 如果是copy 的代码,就要把整个目录下的代码都复制过去,还有运行环境要一致,这样才有可能不出错。 -
测试总结:安装卸载测试
2009-02-08 15:32:45
对C/S结构的应用软件测试也进行了一年多了,是时候总结一下这些测试了。
第一:安装测试。
所有的应用软件都需要进行安装测试。而且也是一个很重要的测试。主要测试点回顾总结了一下。
1:安装过程中每个选择项的测试。即勾选与不勾选,安装后是否一致。
2:安装过程中,快捷键使用是否正常。一般都会提供键盘的快捷键的。
3:安装过程中,取消安装是否正常。
4:是否能安装多份,一般软件是可以的。安装多份情况下,每一个安装目录下的是否能正常使用。安装在不同的路径下或安装同一路径下。
5:覆盖到同一目录下的安装是否正常。
6:安装后的快捷方式使用是否正常。
7:程序中是否存在。是否能正常使用。
8:安装过程中,是否出现文字错误。界面是否能最大化,最小化。
安装测试目前先写着这么多,回去看看用例再补充。
第二:卸载测试
1:从安装目录下的uninstall.exe卸载。
2:从控制面板进行卸载。
3:从程序中提供的卸载功能进行卸载。
4:安装多份时,卸载的应该是最后一份,其它之前安装的应该仍然能正常使用。
5:卸载中取消后,是否仍能正常使用。
6:当前正在使用该软件,卸载应该会有提示。一般软件都是这样的处理。
7:卸载后安装目录是否仍然存在。有的不会存在,有的会存在,这要看软件的处理方式。
8:卸载过程中,界面与及文字的测试。
-
写入TXT文件
2009-02-08 15:06:23
代码:
Set ōbjth = CreateObject("scrīpting.Filesystemobject")
Set adfile = objth.OpenTextFile("d:\test.txt",2,true)
adfile.write "china"
adfile.close如果没有d:\test.txt则会创建,并且写入"china".如果已经存在d:\test.txt,并且将文档的内容重新写入"china".原来的内容不会再保存.
("d:\test.txt",2,true),2为打开文件.1则为读取文件.true,表示文件不存在时进行创建。set f = fso.OpenTextFile("d:\test.txt", 1, false) '第二个参数 1 表示只读打开,第三个参数表示目标文件不存在时是否创建
还有一个参数是8,目前还不知道8是怎么用。
另一例子:只有两个参数时。dim fso, f
set fso = CreateObject("scrīpting.FileSystemObject")
set f = fso.CreateTextFile("d:\test.txt", true) '第二个参数表示目标文件存在时是否覆盖,为false时,文件如果存在,则不覆盖,并且脚本运行到此处会提示文件已经存在。
f.Write("写入内容")
f.WriteBlankLines(3) '写入三个空白行(相当于在文本编辑器中按三次回车)
f.WriteLine("写入内容并换行")f.Close()
-
winlistview中select的使用
2009-02-08 14:58:47
今天发现了winlistview中,居然可以用行号来代替点击的关键字。
如:Dialog("AA").WinListView("WinListView").Select "重要"
可以用:Dialog("AA").WinListView("WinListView").Select 1
修改行号后,它会自动指向该行。实在方便。呵呵
简单代码:Dialog("AA").Activate
Dialog("AA").WinButton("Button").ClickDim a
a = 10
Dialog("AA").WinListView("WinListView").Select a这里会指向WinListView的第十行的数据了。
用FOR能每一行都能覆盖到.
如下这样就能指向WinListView中的第一行了。
Dim a
for a = 1 to 10
Dialog("AA").WinListView("WinListView").Select anext
msgbox "ok"
-
获取WinListView的具体值,并导出表中
2009-02-08 14:55:11
Dialog("AA").Restore
Dialog("AA").WinButton("Button").Click
Dialog("AA").WinListView("WinListView").Select "重要"
#下面这四行都是对datatable添加列名,并且初始化为0。
DataTable.GlobalSheet.AddParameter "类型", 00
DataTable.GlobalSheet.AddParameter "kb号", 00
DataTable.GlobalSheet.AddParameter "描述", 00
DataTable.GlobalSheet.AddParameter "当前状态", 00#定义变量
Dim i,kb1,kb2,kb3,kb4#由于有16行要输出,所以循环从1到16。
For i = 1 to 16#下面这四行是对WinListView的取值。(i,0)表求第i行,第0列。一共有四列。
kb1 = Dialog("AA").WinListView("WinListView").GetSubItem( i, 0)
kb2= Dialog("AA").WinListView("WinListView").GetSubItem( i, 1)
kb3 = Dialog("AA").WinListView("WinListView").GetSubItem( i, 2)
kb4 = Dialog("AA").WinListView("WinListView").GetSubItem( i, 3)#这四行是将取得的值放入到datatable中,相应的列名下。如将kb1的值放入到"类型“下。
DataTable.Value( "类型") = kb1
DataTable.Value( "kb号") = kb2
DataTable.Value( "描述") = kb3
DataTable.Value( "当前状态") = kb4#下面这行是将当前的行指向下一行,这样数据都一行一行地插进去。如果没这一行,取到的数据永远只放到第一行。永远只能取到一行的数据。
DataTable.SetCurrentRow (i+1)Next
#这行是将数据表导出到data.xls中。
datatable.Export("d:\data.xls")开始时,没有修改地这相关的配置,导致循环时,总是从头开始循环,导致重新检测很多次。数据重复插入很多次。而脚本的目的只是循环只需要for中的,其它的都不需要。
解决:
从file -> settings -->run 中将data table iterations 改为run one iteration only。问题即可解决。一般情况下这里默认是run on all rows。即循环针对所有的行。 -
open( )
2009-01-19 23:41:15
f=open('test.txt','r') 读方式打开文件
f=open('test.txt','w')写方式打开文件
f=open('test.txt','rb')读二进制文件
f=open('test.txt','wb')写二进制文件
f=open('test.txt','w+')追加写文件
-
<更新版>从文件夹拷贝文件
2009-01-19 21:19:55
import os
import time
from os import listdir
from os.path import isdir
import shutil
source = 'D:\\python test'
target_dir = 'D:\\python test2'
now = time.strftime('%Y%m%d')
if isdir(source) != True:
print('Error: source is not a directory')
exit()
filelist = listdir(source)
print(filelist)
filelist2 = []
for name in filelist :
if name.find('txt') >=0 or name.find('png') >=0 :
filelist2.append(name)
print(filelist2)
#exit()
for name in filelist2 :
srcFilename = source + '\\' + name
desFilename = target_dir + '\\' + now + '_' + name
shutil.copyfile(srcFilename, desFilename)使用了shutil.copyfile(src, dst) 这个函数。比上一个程序简单了很多。
>>> import shutil
>>> shutil.copyfile('test.txt','cc.txt')把test.txt复制到cc.txt.cc.txt可以存在,也可以不存在。
-
QTP令我很痛苦!
2009-01-19 19:45:43
06年毕业出来后,07年就开始接触QTP,自学。
一段时间后会录一些脚本,那本基础手册基本上都学了一遍。以为自己行了,对QTP已经掌握得不错了。
跳了一家公司后,由于都是C/S结构的程序,所以没用QTP,也一直以为这块不能用QTP。眼光真是太狭隘了。
这样混了一年,QTP原来的基础也丢了,上司说我应该用QTP来做点自动化,我还认为是她太过气了。认为她太看重QTP,什么都能用QTP。一直赌气,不想再接触。
直至最近,另一同事用QTP录了一些自动化脚本,虽然并不是很高深的脚本,但我还是被雷到了。而且主要是他们说的那些函数用法,我居然没用过。他们多是直接修改脚本,我以前一直就只用在界面上录脚本,对里面的代码根本就没想去过弄明白,原来他们一直是在代码里修改的。
我觉得自己不能再这样了。魔蝎座的人,受不了自己比别人差,没错。我受不了自己居然如此之差。
我觉得自己要奋起了,我不能再这样下去了,我要追赶他们。这段时间,我开始自动学习QTP,但一接触,真的很痛苦,之前那些已经丢光了,现在想做点什么,能帮助的文档太少了。
虽然很痛苦,但我一直为自己打气,只要坚持,我能行的。一定可以的。我不会比他们差太远的。
现在虽然仍然进步很少,但总比什么都没进步强。
努力,希望过一段时间有点眉目,不用再这样摸索着前进。真的很痛苦。不过什么事物都这样,开头都是难的,只要能坚持下去,总有一天会觉得这是一件很容易的事。
努力,加油。
-
从文件夹拷贝文件
2009-01-19 00:01:41
今天做这个例子,真是郁闷死了,遇到一问题怎么也解决不了。直到现在也解决不了,狭死瞎黄穑故钦庋?/P>
先发这个东西上来:
import os
import time
from os import listdir
from os.path import isdir
#source = ['/home/swaroop/byte', '/home/swaroop/bin']
source = 'D:\\python test'
target_dir = 'D:\\python test2'
now = time.strftime('%Y%m%d')
if isdir(source) != True:
print('Error: source is not a directory')
exit()
k=0
filelist = listdir(source)
print(filelist)
t = 0
for name in filelist :
if name.find('txt') == -1 and name.find('png') == -1 :
del(filelist[t])
t = t + 1
print(filelist)
#exit()
for name in filelist :
srcFilename = source + '\\' + name
srcFilename = '"' + srcFilename + '"'
desFilename = target_dir + '\\' + now + '_' + name
desFilename = '"' + desFilename + '"'
copy_command = "copy %s %s" % (srcFilename, desFilename)
print(copy_command)
if os.system(copy_command) == 0:
k = k + 1
print('Successful backup to copy from', srcFilename, 'to' ,desFilename)
else:
print('Fail to copy', srcFilename, 'to', desFilename)
print('total copy', k, 'files')我原来是想拷贝txt , png的文件到目标文件夹,源文件夹中有txt,png,py后缀的文件若干过,就是去掉不匹配txt,png的。
可是结果,txt,png的都拷了,这没错,可是py也还是有。真郁闷。怎么调都不行。
t = 0
for name in filelist :
if name.find('txt') == -1 and name.find('png') == -1 :
del(filelist[t])
t = t + 1
问题肯定出现这里,这里从数组filelist中del了一个py文件后,整个数组就重新排了,就如执行到1时,去掉一个py文件,但原来位置在2的py文件在新数组中变成了位置1,但循环却又从2开始了,所以不再执行1了,就漏掉检测这一个了。这里导致的结果就是删了一个不匹配的文件后,总会导致下一个漏掉检测,整个结果就会出现比原来想要的多了几个。
这里一直找不到怎么解决。只好有待解决了。
2008-1-19号
问题终于解决了,得到了想要的结果.答案是不能这样操作,在循环中del就有错的。高手一看就知道我错在哪里了,他只稍微修改了另一种方式就可以了。
filelist2 = []
for name in filelist :
if name.find('txt') >=0 or name.find('png') >=0 :
filelist2.append(name)增加一个空数组,只要匹配的就放到这个数组中,这样不会改变原来的。name.find('txt') >=0表示匹配。
这样终于解决问题了。其实很简单。
-
复制(拷贝)对象(转)
2009-01-18 23:42:31
需求:
你想复制一个对象.因为在Python中,无论你把对象做为参数传递,做为函数返回值,都是引用传递的.
讨论:
标准库中的copy模块提供了两个方法来实现拷贝.一个方法是copy,它返回和参数包含内容一样的对象.
import copy
new_list = copy.copy(existing_list)
有些时候,你希望对象中的属性也被复制,可以使用deepcopy方法:
import copy
new_list_of_dicts = copy.deepcopy(existing_list_of_dicts)
当你对一个对象赋值的时候(做为参数传递,或者做为返回值),Python和Java一样,总是传递原始对象的引用,而不是一个副本.其它一些语言当赋值的时候总是传递副本 .Python从不猜测用户的需求 ,如果你想要一个副本,你必须显式的要求.
Python的行为很简单,迅速,而且一致.然而,如果你需要一个对象拷贝而并没有显式的写出来,会出现问题的,比如: >>> a = [1, 2, 3]
在这里,变量a和b都指向同一个对象(一个列表),所以
>>> b = a
>>> b.append(5)
>>> print a, b
[1, 2, 3, 5] [1, 2, 3, 5],一旦你修改了二者之一,另外一个也会受到影响.无论怎样,都会修改原来的对象.
注意:
要想成为一个Python高手,首先要注意的问题就是对象的变更操作和赋值,它们都是针对对象的引用操作的.一个语句比如a = []将a重新绑定给一个新对象,但不会影响以前的对象.然而,对象复制却不同,当对象复制后,对象变更操作就有了区别.
如 果你想修改一个对象,而且想让原始的对象不受影响,那你就需要对象复制.正如本节说的一样,你可以使用copy模块中的两个方法来实现需求.一般的,可以 使用copy.copy,它可以进行对象的浅复制(shallow copy),它复制了对象,但对于对象中的元素,依然使用引用.
浅复制,有时无法获得一个和原来对象完全一致的副本,如果你想修改对象中的元素,不仅仅是对象本身的话:
>>> list_of_lists = [ ['a'], [1, 2], ['z', 23] ]
>>> copy_lol = copy.copy(lists_of_lists)
>>> copy_lol[1].append('boo')
>>> print list_of_lists, copy_lol
[['a'], [1, 2, 'boo'], ['z', 23]] [['a'], [1, 2, 'boo'], ['z', 23]]
在这里,变量list_of_lists,copy_lol指向了两个不同的对象,所以我们可以修改它们任何一个, 而不影响另外一个.然而,如果我们修改了一个对象中的元素,那么另一个也会受影响 ,因为它们中的元素还是共享引用.
如果你希望复制一个容器对象,以及它里面的所有元素(包含元素的子元素),使用copy.deepcopy,这个方法会消耗一些时间和空间,不过,如果你需要完全复制 ,这是唯一的方法.
对于一般的浅拷贝,使用copy.copy就可以了,当然,你需要了解你要拷贝的对象.要复制列表L,使用list(L),要复制一个字典d,使用dict(d),要复制一个集合s,使用set(s),这样,我们总结出一个规律 ,如果你要复制一个对象o,它属于内建的类型t,那么你可以使用t (o)来 获得一个拷贝.dict也提供了一个复制版本,dict.copy,这个和dict(d)是一样,我推荐你使用后者 ,这个使得代码更一致,而且还少几个字符.
要复制一个别的类型,无论是你自己写的还是使用库中的,使用copy.copy,如果你自己写一个类,没有必要费神去写clone和copy函数,如果你想定义自己的类复制的方式,实现一个__copy__ ,或者__getstate__和__setstate__ .如果你想定义自己类型的deepcopy,实现方法_ _deepcopy__.
注意你不用复制不可修改对象(string,数字,元组),因为你不用担心修改它们.如果你想尝试一下复制,依然会得到原来的.虽然无伤大雅,不过真的浪费尽力:
>>> s = 'cat'
>>> t = copy.copy(s)
>>> s is t
True
is操作符用于不仅判断两个对象是否完全一致,而且是同一个对象(is判断标识符,要比较内容,使用==),判断标识符是否相等对于不可修改对象没有什么意义.然而 ,判断标识符对于可修改对象有时候是很重要的,比如 ,你不确定a和b是否指向同一个对象,使用a is b会立刻得到结果.这样你可以自己判断是否需要使用对象拷贝.
注意:
你可以使用另一种拷贝方式,给定一个列表L,无论是完整切片L[:]或者列表解析[x for x in L],都会获得L的浅拷贝,试试L+[],L*1.. .但是上面两种方法都会使人迷惑,使用list(L )最清晰和快速,当然,由于历史原因,你可能会经常看到L[: ]的写法.
对于dict,你可能见过下面的复制方法:
>>> for somekey in d:
... d1[somekey] = d[somekey]
或者更简单一些的方法,d1={},d1.update(d),无论怎样,这些代码都是缺乏效率的,使用d1=dict(d)吧.
相关说明:
copy(x)
Shallow copy operation on arbitrary Python objects.
See the module's __doc__ string for more info.
deepcopy(x, memo=None, _nil=[])
Deep copy operation on arbitrary Python objects.
See the module's __doc__ string for more info. -
获取系统目录
2009-01-18 12:53:42
import os
print(os.getenv('WINDIR')) -
常用的python模块(转)
2009-01-18 12:52:24
[转]常用的python模块adodb:我们领导推荐的数据库连接组件
bsddb3:BerkeleyDB的连接组件
Cheetah-1.0:我比较喜欢这个版本的cheetah
cherrypy:一个WEB framework
ctypes:用来调用动态链接库
DBUtils:数据库连接池
django:一个WEB framework
docutils:用来写文档的
dpkt:数据包的解包和组包
MySQLdb:连接MySQL数据库的
py2exe:用来生成windows可执行文件
Pylons:我们领导推荐的web framework
pysqlite2:SQLite的连接组件
pythonwin:Python的Windows扩展
setuptools:无奈,PEAK的一套python包管理机制
sqlalchemy:数据库连接池
SQLObject:数据库连接池
twisted:巨无霸的网络编程框架
wxPython-2.6:因为需要保持与linux相同的版本才没用最新的,GUI编程框架
pypcap:抓包的
python-dnet:控制网络安全的其他设备
pyevent:Python的事件支持
pydot:画图的,graphiz
sendpkt:Python发包
simplejson:JSON的支持
DPKT:raw-scoket网络编程
Cx-oracle:连接oracle的好东东
Mechanize:爬虫连接网站常用
PIL:图像处理工具包
reportlab for PDF 文件。
PyQt4 for GUI界面feedparser: rss解析
chardet:编码检测
scons: 项目构建工具,写好了模板用起来还是很方便的
scapy: 网络包构建分析框架,可编程的wireshark,有兴趣的google “Silver Needle in the Skype”
pefile: windows pe文件解析器
winpdb: 自己的程序或者用别的库不太明白的时候就靠它了
pywmi: 省了好多折腾功夫
pylint: 培养良好的编码习惯
下面是准备用的,不做评论:pygccxml
pyparsing
pymacs
idapython
paimei
pysvn
pyLucene
wikidpad1.Python操作PDF文件
2.Python連接PostgreSQL引擎
3.Python的.NET2.0的曲線表http://pybrary.net/
—————————————————–
1.Python Image Libary
2.Tkinter Libaryhttp://www.pythonware.com/index.htm
—————————————————–
1.Karrigellhttp://karrigell.sourceforge.net/
—————————————————–
1.The Standard Python Libaryhttp://effbot.org/librarybook/
—————————————————–
1.Python操作PDF的Libaryhttp://reportlab.org/
—————————————————–
1.Python cURL Libaryhttp://pycurl.sourceforge.net/
—————————————————–
1.urlgrabberhttp://linux.duke.edu/projects/urlgrabber/
—————————————————–
1.MySQL-Pythonhttp://mysql-python.sourceforge.net/
—————————————————–
1.pyscrīpter
2.Python for Delphihttp://mmm-experts.com/Products.aspx
—————————————————–
1.Python Cookbookhttp://aspn.activestate.com/ASPN/Python/Cookbook/
—————————————————–
1.pygamehttp://www.pygame.org/news.html
——————————————————
1.pymediahttp://www.pymedia.org
——————————————————
1.pydbfhttp://dbfpy.sourceforge.net/
——————————————————
1.Pexpecthttp://pexpect.sourceforge.net/
——————————————————
1.dabo
desktop application frameworkshttp://dabodev.com/
——————————————————
1.pySerialhttp://pyserial.sourceforge.net/
http://wiki.woodpecker.org.cn/moin/PySerial
——————————————————
1.python’s dochttp://wiki.woodpecker.org.cn/moin/PythonZhDoc
——————————————————
1.The Visual Module of VPython(3D)http://vpython.org/index.html
——————————————————
1.PyLucenehttp://pylucene.osafoundation.org/
——————————————————
1.DBUilshttp://www.webwareforpython.org/DBUtils
——————————————————
1.http://happyiww.popo.blog.163.com/blog/a good people’s blog
——————————————————
1.Applescrīpt,OSAComponents,HtmlCalendarhttp://freespace.virgin.net/hamish.sanderson/index.html
——————————————————
1.Pypcaphttp://code.google.com/p/pypcap/
http://monkey.org/~dugsong/dpkt/
http://www.winpcap.org/install/default.htm
python-memcached client module for memcached
Kodos,python的正则表达式调试工具,
PLY (Python Lex-Yacc)
http://www.dabeaz.com/ply/
正在用它写汇编器.wxPython - GUI Framework
omniORBpy - CORBA Library
ZODB3 - an OODB implement
ReportLab - PDF generating solution
numpy+scipy+matplotlib
hachoir 各种多媒体元数据解析
python-orge 演示用数据库的:
sqlalchemy
sqlobject
MySQL-python (easy_install的时候就是这个名字)
routes
beaker两个模板引擎:
genshi
makopaster
另外还有知道的
PyCrypto 加密的
paramiko 这个可以帮你写sftp,比twisted里面的那个好用一些twisted 写服务器玩的
PyOpenGL
PyGame
Psyco 传说可以加速你的python程序
PIL (Python Image Library) 处理图片
PyObjC 这个是苹果上用的,写Cocoa程序
Python desktop client GUI application:
wxPython
PyOpenGL
PyXML -
文件由后面到前面读取,读取到另一文件中
2009-01-17 18:54:33
def readfiles():
f = open("test.txt","r")
l = f.seek(0 ,2)
content = ""
for c in range(l-1,-1,-1):
f.seek(c)
content += f.read(1)
f.close()
m = open("test2.txt","w")
m.write(content)
m.close()if __name__ == "__main__":
readfiles()这里把当前目录下,test.txt的文件从后面读取,然后写入到test2.txt中。即运行后,test2中的内容是test的尾部读取得到的。
l = f.seek(0 ,2)
取得最后一个字节的位置。f.seek(c)
content += f.read(1)定位一个位置,将此位置的内容写入content中。 -
用python创建任意个文件
2009-01-17 18:38:45
def creatfiles(x):
i = 0
while i < x:
bb = "fds"+str(i)+".txt"
f = open(bb,"w")
f.write("today is 2009-1-7\n")
f.write("I am very happy!")
f.close()
i = i+1
if __name__ == "__main__":
m = int(input('creatfile_numbers: '))
creatfiles(m)运行后会提示要求输入生成文件的个数,输入后,即可以当前目前生成内容为以下的txt文件。如输入为5000,则运行后,会在当前目录下生成5000个文件。内容都是如下这些:
today is 2009-1-7
I am very happy!
内容都是写定的,文件名也相当于写定。只在当前脚本所在的文件夹生成文件。
如果想改为在其它文件夹下生成文件,可以在bb = "fds"+str(i)+".txt" 这里修改,比如在d:\test\目录下生成文件,则可以写成:"d:\\test\\"+"fds"+str(i)+".txt" .这样就可以在d:\test\目录下生成文件.
备注:python 3.0中,print是需要括号的。
-
python 函数参数的传递(参数带星号的说明)
2009-01-17 18:30:23
以下转自其它博客。觉得总结得太好了,所以拿来自己参考一下。
python中函数参数的传递是通过赋值来传递的。函数参数的使用又有俩个方面值得注意:1.函数参数是如何定义的 2.在调用函数的过程中参数是如何被解析
先看第一个问题,在python中函数参数的定义主要有四种方式:
1.F(arg1,arg2,...)
这是最常见的定义方式,一个函数可以定义任意个参数,每个参数间用逗号分割,用这种方式定义的函数在调用的的时候也必须在函数名后的小括号里提供个数相等的值(实际参数),而且顺序必须相同,也就是说在这种调用方式中,形参和实参的个数必须一致,而且必须一一对应,也就是说第一个形参对应这第一个实参。例如:
def a(x,y):
print x,y
调用该函数,a(1,2)则x取1,y取2,形参与实参相对应,如果a(1)或者a(1,2,3)则会报错。
2.F(arg1,arg2=value2,...)
这种方式就是第一种的改进版,提供了默认值
def a(x,y=3):
print x,y
调用该函数,a(1,2)同样还是x取1,y取2,但是如果a(1),则不会报错了,这个时候x还是1,y则为默认的3。上面这俩种方式,还可以更换参数位置,比如a(y=8,x=3)用这种形式也是可以的。
3.F(*arg1)
上面俩个方式是有多少个形参,就传进去多少个实参,但有时候会不确定有多少个参数,则此时第三种方式就比较有用,它以一个*加上形参名的方式来表示这个函数的实参个数不定,可能为0个也可能为n个。注意一点是,不管有多少个,在函数内部都被存放在以形参名为标识符的tuple中。
>>> def a(*x):
if len(x)==0:
print 'None'
else:
print x
>>> a(1)
(1,) #存放在元组中
>>> a()
None
>>> a(1,2,3)
(1, 2, 3)
>>> a(m=1,y=2,z=3)Traceback (most recent call last):
File "<pyshell#16>", line 1, in -toplevel-
a(m=1,y=2,z=3)
TypeError: a() got an unexpected keyword argument 'm'
4.F(**arg1)
形参名前加俩个*表示,参数在函数内部将被存放在以形式名为标识符的dictionary中,这时调用函数的方法则需要采用arg1=value1,arg2=value2这样的形式。
>>> def a(**x):
if len(x)==0:
print 'None'
else:
print x
>>> a()
None
>>> a(x=1,y=2)
{'y': 2, 'x': 1} #存放在字典中
>>> a(1,2) #这种调用则报错Traceback (most recent call last):
File "<pyshell#25>", line 1, in -toplevel-
a(1,2)
TypeError: a() takes exactly 0 arguments (2 given)
上面介绍了四种定义方式,接下来看函数参数在调用过程中是怎么被解析的,其实只要记住上面这四种方法优先级依次降低,先1,后2,再3,最后4,也就是先把方式1中的arg解析,然后解析方式2中的arg=value,再解析方式3,即是把多出来的arg这种形式的实参组成个tuple传进去,最后把剩下的key=value这种形式的实参组成一个dictionary传给带俩个星号的形参,也就方式4。
>>> def test(x,y=1,*a,**b):
print x,y,a,b
>>> test(1)
1 1 () {}
>>> test(1,2)
1 2 () {}
>>> test(1,2,3)
1 2 (3,) {}
>>> test(1,2,3,4)
1 2 (3, 4) {}
>>> test(x=1,y=2)
1 2 () {}
>>> test(1,a=2)
1 1 () {'a': 2}
>>> test(1,2,3,a=4)
1 2 (3,) {'a': 4}
>>> test(1,2,3,y=4)Traceback (most recent call last):
File "<pyshell#52>", line 1, in -toplevel-
test(1,2,3,y=4)
TypeError: test() got multiple values for keyword argument 'y' -
重新回来
2008-05-12 10:03:22
为了以后可以回头看看自己走过的痕迹,所以重新回来这里来了。
现在负责杀毒软件及安全相关方面的测试了,所以以后日志就只写这些相关的技术了。因为自己的相关方面
知识实在太缺乏了,一定要努力点,还要经常写下总结,才可以慢慢进步。
-
如何说服他人修改BUG
2008-04-03 11:58:56
要说服他人认可你提交的BUG,那就需要你要执着,站在客户角度看问题,不要轻易被他人说服你。前提一定要有耐心,要尊重他们。不能说强制他们去修改。现在有很多测试人员,找到人家的问题,就态度很不好,说人家的能力不好。这样肯定说服不了的。
1、测试人员要执着,站在客户的角度看问题。
通常情况下,如果是需求明确提出的,你提交BUG后,一般开发人员都会修改,不修改情况下就找需求说明书出来。那有根有据的情况,他们肯定会修改的。
很多情况下,都是那些体验上的BUG,易用性上的,不是功能性的。开发人员如果不是很注重体验的话,就会觉得你很挑剔,就会反过来以浪费时间,项目紧之类的理由来说服你。例如,一个按钮的使用,或且一些界面上的排列,图标之类的问题。通常你提出来,他们都会以不必要修改去说服你的。
这种情况下,就看你站在哪方了。如果你从开发人员的角度出来,想着,也对,不修改也没什么问题。修改还要那么麻烦,浪费时间,而且项目又紧,那你就会反过来被他们说服的了。
但如果你站在客户的角度,想着这个不好用,会很影响一个人对这个东西的评价的。你现在不修改,到时客户提出来再修改,那后果就严重了。那你就可以从公司的利益出来,体验不好,对公司的影响,客户的影响来说服他们。特别是交接后,客户又提出这些问题的话,那就需要很大的维护成本了。通常开发人员会被你说服的。
2、从同类软件中对比来说服他们
可以从现有的同类的又优秀的软件中提出对比,让他们看到改与不改的好处。这样他们看到好的地方果真比自己做的好多了,那也会很容易接受你的BUG。
3、业务一定要很精通。
很多情况下,一个开发人员或设计人员,只负责一部分的开发或设计,对整个系统不会很清楚,所以有些东西做出来后,单独去看是不会有问题,但整体上会影响别人的模块。测试人员,很清楚业务上的东西,知道哪里受了影响,受了什么影响,那在说服他的时候就很很容易了。
4、提高自己的开发水平,提高他们对你的认可度和尊重度。
还有一些情况下,就需要你自己具备的说服力。你要使自己在开发人员中,具有说服力,也要提高自己的各方面的水平。很多情况下,开发人员总是觉得测试人员只会随便点击,其它什么都不会。所以提出一些问题,就得不到他们的重视。但如果你也具备一定的开发水平,那在找到问题时,你可以从开发的角度去说服他们,他们看到你的能力,更加容易被你说服,不会说因为看不起你而不肯去修改。
标题搜索
我的存档
数据统计
- 访问量: 179574
- 日志数: 80
- 建立时间: 2007-09-18
- 更新时间: 2011-11-30