自动化测试第六节-常用模块、操作数据库
1、linux操作系统命令:top(top -n l)---动态监控服务器,如cpu使用率等
2、python setup.py test:测试模块是否可以安装------python setup.py --help(查看帮助)
3、argv用法实例:点击右下角的Pannel:Terminal,cd到当前目录下执行命令python XX.py XX XX,执行结果是一个list,是用来获取你执行python文件的时候他的参数的,
第一个元素是你执行的这个python文件的文件名
print(sys.argv)#他是一个list,是用来获取你执行python文件的时候他的参数的,第一个元素是你执行的这个python文件的文件名
例子:
import sys
inpu=sys.argv#获取运行这个py文件传入的所有参数
if len(inpu)<3:
print('...')
else:
with open(inpu[1],'w',encoding='utf8') as i:
i.write(inpu[2])
4、json文件转换显示样式:文件必须是xx.json的才可以
5、redis模块:pip install redis
读1M的数据从磁盘上读和从内存上读,差100w倍
redis是从内存中读数据的
redis是一个数据库,他的数据全部都存放在内存中
redis支持每秒30w次的读写
import redis
r=redis.Redis(host='211.149.218.16',port=6378,password='123456',db=2)#连接数据库
r.set('yuanyuan','hello')#set值
print(r.get('yuanyuan').decode())#get值
print(r.keys())#获取所有的key
print(r.type('nina'))#判断是什么类型的string或者hash
for k in r.keys():#打印key和value
print('{k}:{v}'.format(k=k,v=r.get(k).decode()))
r.setex('sjj','hehe',9000)#指定key的超时时间
#操作string类型:
r.set('yuanyuan','hello')
print(r.get('yuanyuan').decode())
操作hash类型:
r.hset('nina','age','22')#set值
print(r.hget('nina','age'))#get值
nhy=r.hgetall('nina')#get值,打印出字典
print(nhy)
r.delete('yuanyuan')#删除key
例子:转换成一个新字典,去除b
nhy=r.hgetall('nina')#打印出字典
print(nhy)
new_nhy={}
for k in nhy:
new_k=k.decode()
v=nhy.get(k)
new_v=v.decode()
new_nhy[new_k]=new_v
print(new_nhy)
例子:把redis库例所有数据导入另一个redis里面
连接r1和r2两个数据库
获取r1的所有key
判断key的类型
r2=redis.Redis(host='211.149.218.16',port=6378,password='123456',db=2)
r1=redis.Redis(host='211.149.218.16',port=6378,password='123456',db=1)
r2_keys=r2.keys()
for key in r2_keys:
# if r2.type(key).decode()=='hash':都可以
if r2.type(key)==b'hash':
value=r2.hgetall(key)
for k,v in value.items():#循环刚才获取到的字典的key和value
r1.hset(key,k,v)
else:
value=r2.get(key)
r1.set(key,value)
6、hashlib模块:
Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等
撞库:由于md5不可以反解,只能通过撞库取匹配密码库得到结果
import hashlib
md5 = hashlib.md5()#创建一个MD5加密对象 ,md5不能反解,但是加密是固定的,就是关系是一一对应,所以有缺陷,可以被对撞出来
# md5.update(str('hashlib').encode())#要对哪个字符串进行加密,就放这里,encode()表示转换为bytes类型,decode()表示bytes转换为字符串
md5.update(b'hahlib')#要对哪个字符串进行加密,就放这里,b表示转换为bytes类型,作用同上
print(md5.hexdigest())#加密后的结果,用十六进制字符串表示
print(md5.hexdigest().upper())#加密后的结果,用十六进制字符串表示
print(md5.digest())#加密后的结果(二进制)
例子:md5加盐加密
def md5_passwd(str):
SALT='!@#$%^&^%$'#加盐
str=str+SALT
md=hashlib.md5()
md.update(str.encode())
return md.hexdigest()
print(md5_passwd('123456'))
7、random模块
import random, string
print(random.random()) # 随机浮点数,默认取0-1,不能指定范围
print(random.randint(1, 20)) # 随机整数,顾头不顾尾
print(random.choice(['x23serw41',1])) # 随机取一个元素,可以使字符串、列表、字典等可以迭代打的
print(random.sample('hello', 2)) # 从序列中随机取几个元素,放入list中
print(random.uniform(1, 9)) # 随机取浮点数,可以指定范围,顾头不顾尾
x = [1, 2, 3, 4, 6, 7]
random.shuffle(x) # 洗牌,打乱顺序,会改变原list的值
print(x)
print(string.ascii_letters + string.digits) # 所有的数字和字母
print(string.ascii_lowercase + string.ascii_uppercase + string.digits) # 所有的数字和字母
8、time模块
time & datetime模块
time和datetime模块主要用于操作时间
时间有三种表示方式,一种是时间戳、一种是格式化时间、一种是时间元组
import datetime, time
print(int(time.time())) # 获取当前时间戳--即从unix元年到现在过了多少秒
print(time.sleep(1)) # 休息几s
print(time.gmtime()) # 把时间戳转换成时间元组,如果不传的话,默认取标准时区的时间戳
print(time.localtime()) # 把时间戳转换成时间元组,如果不传的话,默认取当前时区的时间戳
print(time.mktime(time.localtime())) # 把时间元组转换成时间戳
print(time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime())) # 将时间元组转换成格式化输出的字符串--%Y是四位数年份,y是两位数年分
print(time.strptime("20160204 191919", "%Y%m%d %H%M%S")) # 将格式化的时间转换成时间元组
datatime模块
print(datetime.datetime.now()) # 当前时间格式化输出,datatime类型
print(datetime.datetime.now() + datetime.timedelta(3)) # 3天后的时间
print(datetime.datetime.now() + datetime.timedelta(-3)) # 3天前的时间
例子:
def transfer(timestamp,format='%Y-%m-%d %H:%M:%S'):#时间戳转换为格式化输出的字符串,utc时间
time_tuple=time.localtime(timestamp)
res=time.strftime(format, time_tuple)
print(res)
return res
transfer(1502161871)
def transfer_new(time_str,format='%Y-%m-%d %H:%M:%S'):#把格式化的时间字符串转换为时间戳
time_tuple=time.strptime(time_str,format)
res=time.mktime(time_tuple)
print(int(res))
return int(res)
transfer_new('1964-01-01 00:00:01')
def get_other_time(day,format='%Y%m%d %H:%M:%S'):#获取n天前的时间或者n天后的时间,day传入负数表示几天前,day传入整数表示几天后,可以不传整数
res=datetime.datetime.now()+datetime.timedelta(day)
res_time=res.strftime(format)
print(res_time)
return res_time
get_other_time(-4)
9、json模块
json是一种通用数据类型,所有语言都认识
json是一个字符串
json串必须是双引号
import json
names={
'name':'聂媛媛',
'age':28,
'color':'yellow'
}
with open('nina.json','w',encoding='utf8') as f:
# res=json.dumps(names,ensure_ascii=False)#dumps时传的时字典,把字典转换为json串,ensure_ascii=False后支持输入汉字,dumps时不可以用indent
# f.write(res)
res=json.dump(names,f,ensure_ascii=False,indent=10)#dump时传的是文件对象,不用再write一次,indent 表示写文件时有多少个缩进
print(type(res))#json串是str类型的<class 'str'>
with open('nina.json','r',encoding='utf8') as f:
# names=json.loads(f.read())#json串转换为字典,loads时传的时字符串
names=json.load(f)#load时传的是文件对象,不用在读一次文件
print(names)
print(type(names))#<class 'dict'>
10、操作mysql
cur.fetchall()#它一直返回的是一个二维的list,不管你指定了什么类型的游标
cur.fetchone()#它才返回的是具体的值,如果指定游标类型是字典,那么它就返回一个字典,否则返回的是list
如果你写的sql只有一条结果的话,用fetchone方便。
如果写的sql结果有多条,那么用fetchall。
例子:封装数据库的函数
def op_mysql(host,user,passwd,db,sql,port=3306,charset='utf8'):
import pymysql
from pymysql.cursors import DictCursor
coon=pymysql.connect(host=host,user=user,passwd=passwd,db=db,port=port,charset=charset)#连接数据库
# cur=coon.cursor()#建立游标,仓库管理员
cur=coon.cursor(DictCursor)##建立游标,仓库管理员,指定游标列表,返回字典
cur.execute(sql)#执行sql
if sql.strip().startswith('select'):
res = cur.fetchall()#获取sql执行的结果--获取结果方法1
# res=cur.fetchone()#获取sql执行的结果,一次读一行
#for c in cur:#直接循环游标,每次循环的时候就是每一列的数据(执行结果都在游标的身上)
#print(c)
else:
coon.commit()#提交才能生效
res='OK'
cur.close()#关闭游标
coon.close()#关闭数据库
print(res)
return(res)
if __name__=='__main__':
sql="update user_nyy set password='e10adc3949ba59abbe56e057f20f883e' where username in('nina','wxc');"
op_mysql('211.149.218.16','jxz','123456','jxz',sql)
11、小程序例子:
生成手机号码:
前三位固定,list存固定值,随获取一个
再从0-9中取8位
import random,string
def pho_num(num):
all_phone_numbers=set()
first_three=[138,137,186,187,170,135]
for i in range(num):
last_five=''.join(random.sample(string.digits,8))
first_three_new=str(random.choice(first_three))
phone_number=first_three_new+last_five+'\n'
all_phone_numbers.add(phone_number)
with open('phonenumberslist.txt','w',encoding='utf8') as p:
p.writelines(all_phone_numbers)
pho_num(5)