Python官方文档:https://docs.python.org/zh-cn/3/
-0-
python常见内置函数
len() #长度
None #空
type() #查看数据类型
format()#格式化
replace()-替换
find()-查找
join(())-拼接
split()-分割
lower()-转小写
upper()-转大写
bool() id() float() int()len() list() str() type() tuple()
"{}:{}".format('jack', 300)
res=s.replace('123','999',2)
res=s.find('23',4,10) #从第五开始找
res = ' '.join((s1, s2, s3))
res.strip('+')
-1-
一、安装python、pycharm
二、新建项目
三、pycharm设置集合
1.pycharm设置作者信息
2.设置项目解释器-setting-project-齿轮号
四、python package 和普通文件夹区别
python package有init文件
init文件作用:
1.标识该目录是一个python的模块包(module package)
2.简化模块导入操作
-包在被导入时会执行init文件-可放初始化代码
五、输入、输出、数值类型、数值运算符、比较运算符、转义符
#输入-输出
a = input('输出dotcpp的网站:')
b = float(input('我认为适宜的温度:'))
index = list(map(int,input().split()))
#这种方式可以输入任意个int型的数字,在这里采用列表来存储。输入时空格分开
print(index)
print(index[0])
#数值类型
int float bool
c = 9
d =9.9
e = True
数值运算符
+ - * / //取整 %取余
比较运算符
> < >= <= == != is is not
转义符 \
print("children\'s class") #children's class
制表符 \t
六、字符串格式化-format
插入字符、格式小数位数、百分位数、长度、填充、不支持反向索引
占位符:%s -任意类型 %d-整数 %f -浮点类型
print("您的体重是:%d" %(33))
#format两种方式,可标序号,可不标序号,从0开始
#format:
desc = "您的姓名是:{0}。您的体重是:{1}。"
name = 'Jack'
weight = 200
print(desc.format(name, weight))
#倒序
desc = "您的姓名是:{1}。您的体重是:{0}。"
#不填序号
print("您的姓名是:{}。您的体重是:{}。".format('jack', 300))
#格式化小数位数-保留两位小数-得到1.75
desc2 = "您的身高是{:.2f}".format(1.755)
#格式化百分数显示-保留两位小数-得到33%
print('通过率为{:.2f}'.format(1/3))
#格式化字符串中的长度
{:<20}占20字符左对齐
{:>20}占20字符右对齐
{:^20}占20字符居中对齐
{:*>20}占20字符右对齐-*号填充空白
字符串的f表达式-3.7版本后
desc = F'您的姓名是:{name}。您的体重是:{weight}。'
七、索引、切片-字符串、列表、元组
[:0] [0:1] [0:5:2]
#索引-找单个[:3]-第4个-d
#结果=数据[索引值]
s1 = ‘abcde’
res = s1[2] #正向c-从0开始
res = s1[-1] #反向e-从-1开始
循环打印单个字符串
s1 = 'abcde'
for i in range(len(s1)):
print(s1[i])
i = i+1
#切片-找多个[1:3]-取头不取尾-取第2、3位-bc
#结果=数据[start:end]
#切片2-跨步取值-[0:5:2] -ab cd e -跨两步,得ace
列表:[]
元组:() 不可修改
八、替换-replace
s ='123rrr123ttt123'
res=s.replace('123','999',2)
#参数1被参数2替换,替换参数3个,无参数3时全替换
#只能替换字符串型,不能替换数值型
九、查找-find-返回第一个位置索引
s ='123rrr123ttt123'
res=s.find('23')
res=s.find('23',4,10) #从第五开始找
十、字符串拼接-join(())
s1 = 'Kacy'
s2 = 'Mick'
s3 = 'Judy'
res = ' '.join((s1, s2, s3))
res = '@love@'.join([s1, s2, s3])
print(res)
#Kacy@love@Mick@love@Judy
#字符串的join()方法只能带1个入参,多个字符串用list或元组
十一、字符串分割-split()
s5='@Kacy@love@Mick@love@Judy@'
res = s5.split('@')
#得到的是['','Kacy', 'love', 'Mick', 'love', 'Judy', '']
#注意有首尾有空
十二、字符串去除前后字符-strip()
#去除前后空白字符
print(res.strip())
#去除前后特定字符
print(res.strip('+'))
#去除左边字符
res.lstrip()
#去除右边字符
res.rstrip()
十三、列表的增删改查
li = [123,12]
#添加数据
li.append(111) 结尾处添加元素
li.insert(0,'第一个‘)指定位置添加元素
li.insert(-1,'倒数第二个’)插到倒数第二个 -0,-1
li.extand([123,2232]) 两个列表合并
#删除数据
li.remove(12)删除指定第一个数据
li.pop() 删除指定索引
li.clear() 清空所有数据
#修改数据
li[0]='111'
# 查找数据
li[0] 索引取值
li.index(‘111’)查找元素对应索引
# 字符串查找数据,参数只能是str
‘asd1aas’.index('1')
‘asd1aas’.find('1')
# 统计某元素个数
li.count(1)
# 复制:copy()只复制值
# 列表反序
li.reverse()
li[::-1] 切片反序
#Ctrl查看,如果返回不指向None,使用时需要再建个变量给来接收返回数。如果指向None,直接使用原变量即可
# 将字符串转换成列表-内置函数eval()-去掉最外层格式
li = eval('[11,22]')
# 排序 sort()
li.sort() 升序
li.sort(reverse=True) 降序
#切片:[1,2,3,4,5,6,7,8,9]
[2::3]从第三个切到最后,步长为3
十四、元组()
li=(123,'122')
元组特性:与列表接近、数据不可变
十五、字典{}
字典{}:有键值对,列表和元组必须知道序号才可以提取值
li = {'age':18,'name':'jack'} 键不能重复,键只能是数值、字符串、元组等不可变类型数据。多用字符串。
# 增
li = {}
li['sex'] = 'woman'
li.update({'sex':'woman'}) 添加
# 改
li['sex'] = 'woman'
li.update({'sex':'woman'}) 有则改、无则增
# 删
li.pop('name') 删除对应键的值
li.popitem() 删除最后一个键,并以元组形式返回,实际type还是dict
li.clear() 清空
# 查
li['name']
dict.keys() 返回所有键
dict.values() 返回所有值
通常转成列表或元组使用
dict.items() 以元组形式返回键和值
与for循环结合
创建字典:{} dict()
eval() 字符串转字典
十六、集合{}
set={11,22,33}
set = set() #定义空集合
集合内没有重复元素
去除列表内重复元素:list-set-list\
li = [1,22,22,33]
a = list(set(li))
十七、随机数
import random
res = random.randint(1,999) 随机整数
res = random.random() 随机小数,0-1之间
res = random.uniform(10,20) 10-20之间的小数
li = [1,33,55]
res = random.choice(li) 在列表中挑选一个随机值
十八、条件判断
if elif else
逻辑运算:and or not
成员运算:in ,not in
身份运算:is ,is not 判断内存id
赋值运算:= ,+= ,-= ,*= ,/= ,%=
十九、循环
while True:break continue
for i in [1,2,3]/dic/dic.value/dic.items():
元组拆分-遍历键和值:
for k,v in dic.items():
列表循环
li2 = ['www{}'.format(i) for i in range(10)]
li = [ i+1 for i in (11,22,33)]
二十、range内置函数
生成指定序列
li = list(range(100))
li = list(range(9,99,2))
二十二、函数
1、必备参数 def func(a,b)
2、默认参数 def func(a=11,b=22)
3、不定长参数 def func(*args)
*args只能位置传参
**kwargs 只能使用关键字传参
4、函数拆包-*可以对列表或元组拆包,**可以对字典拆包
func(*[11,22,33])
for i,v in enumerate li:
print(i,v)
5、lambda 函数
func = lambda x: 2*x
6、min(li) max(li) sum(li)
7、eval(‘1+22’)识别表达式
8、enumerate 获取列表中的数据及索引
9、zip 数据聚合打包
title =['name','sex']
data =[‘张三’,‘女’]
res=zip(title,data)
10、filter 过滤函数
res= filter(lambda x:x>80,stu)
11、自定义排序规则sort(key=)
li.sort(key=func)
li.sort(key=lambda x:x[2])
二十三、文件操作和模块导入
f = open(file='biji.txt',mode='r',encoding='utf-8')
mode =r/w/a(追加、自动创建文件) rb wb ab 以二进制读取 +可读可写
f.read()
f.readline()
f.readlines() ->list
f.write()
f.close()
with open(file ='',mode='rb') as f: 自动关闭
res=f.read()
二十四、相对路径、绝对路径
1、绝对路径 C:\Users\A80\Desktop\需求\WMS
2、相对路径 .当前层级 .. 上个层级
3、文件路径转义 file=r‘C:\Users\A80\Desktop\需求\WMS’ 加r关闭转义
二十五、模块和包
模块:python文件
包:python文件夹 有init文件
导入模块
from src/ss import SS
导入包
import requests
from requests import session
只直接运行此文件时成立
if __name__ == "__main__":
import sys (所有可用包)
二十六、异常
自定义异常类型:
class TooLongExceptin(Exception):
"this is user's Exception for check the length of name "
def __init__(self,leng):
self.leng = leng
def __str__(self):
return "姓名长度是"+str(self.leng)+",超过长度了"
try:
name = "1111"
print("1")
if len(name) > 2:
raise TooLongExceptin(leng=len(name))
raise ValueError("只能小于2")
except Exception as e:
print(e)
else:
print("没报错")
finally:
print("还是要执行")
常用异常类型:
https://blog.csdn.net/csdnbian/article/details/113447496
二十七、类和对象
1、属性:
类属性(共有)、类名.属性名=属性值
对象/实例(独有)属性 对象.属性名=属性值
class Cat:
leg= 4 类属性
cat = Cat()
cat.name = 55 实例属性
2、方法
实例方法:self代表对象本身,没有self,无法使用对象调用方法,只能使用类调用
class Cat:
def func(self):
print(1)
类方法
@classmethod
def func(cls,name=‘’): cls代表类本身,可以类调用,也可以对象调用 里面不要用self.name实例属性
静态方法
@staticmehod
def func()内部不使用类属性和类方法,也不使用对象属性和时
初始化方法 def __init__(self,name='',age=''): 通过类创建对象时自动调用
二十八、继承和属性动态操作
1、私有属性:__attr只能在类内使用、 _attr表示私有,实际类外部能调用
2、私有方法:def __attr(),def _attr()
3、继承
重写:同名方法,优先子类、私有属性不继承
拓展父类:在子类调用父类方法super.func(),
class Father:
def __init__(self,name):
self.name=name
class Child(Father):
def __init__(self,name,price):
Father.__init__(self,name) 或者 super().__init__()
self.price=price
4、动态属性 内置方法 用于属性是字符串时 如 "age"="18"
MyClass.__dict__ 显示类所有相关属性
设置属性setattr(MyClass,key,value) 获取getattr(MyClass,key)
删除delattr(MyClass,key) 判断属性是否存在hasattr(MyClass,key)
例:把字典中的键值对设置为类属性和属性值
data = {"name":"muse',"age":"18"}
for k,v in data.items():
set(MyClass,k,v)
5、常用关键字
del li[3] del dic['b']
二十九、unittest的使用
1、测试用例类必须继承unittest.TestCase
class TestLogin(unittest.TestCase):
2、test开头方法为测试用例、使用实例方法
3、编写测试用例
1)准备用例数据
2)调用被测功能函数
3)断言
4、编写主运行文件 run.py
import unittest
# 创建套件
suite = unittest.TestSuite()
# 创建用例加载器
load = unittest.TestLoader()
# 加载用例套件
suite.addTest(load.discover(r'文件路径'))
~~替代
suite = unittest.defaultTestLoader.discover(r'F:\file\src\news')
# 创建测试用例运行程序
runner =unittest.TextTestRunner()
# 运行测试用例
runner.run(suite)
5、测试用例生成报告 run_report.py pip3 install unittestreport
https://pypi.org/ 官方查找拓展包及其使用方法
6、TestFixture 前置方法、后置方法
def setUp(self) def tearDown(self) 方法级别,每个测试方法都运行
@classmethod 类级别
def setUpClass(cls) def tearDownClass(cls)
7、断言方法
self.assertEqual(a,b)
self.assertIn('成功','成功了')
assert a ==b
8、测试用例路径
# file = 'test_jtyoui.py'
# case_path = os.path.join(os.getcwd(), "testsuite")
# case_path = os.path.join(os.path.dirname(os.path.abspath(file)))
suite = unittest.defaultTestLoader.discover(case_path)
三十、ddt的使用和excel的数据读取
# ddt使用步骤
# 1.测试类前使用@ddt
# 2.在测试方法前使用@list_ddt(测试数据)
# 3.在测试方法中定义一个参数,用于接受用例数据|
# install
import unittest
from ddt import ddt,list_data
#from unittestreport import import ddt,list_data
@ddt
class TestMusen(unittest.TestCase):
@list_data([1,2,3])
def test(self, item):
print(item)
# excel的使用
# Excel使用xlsx格式,解析成三个对象,工作簿workbook、表单Sheet、单元格Cell
import openpyxl
workbook = openpyxl.load_workbook('test1.xlsx')
print(workbook.sheetnames)
sh = workbook['Sheet1']
print(sh.cell(row=3,column=3).value)
#按行读取 rows 按列读取 column
res = list(sh.rows)
for i in res:
print(i,i.value)
# 转为字典格式
res = list(sh.rows)
title = [i.value for i in res[0]]
cases = []
for item in res[1:]:
data = [i.value for i in item]
dic = dict(zip(title,data))
print(dic)
cases.append(dic)
@ddt
class TestMusen(unittset.TestCase)
@list_data(cases)
def test(self, item):
expected = eval(item['espected'])
params = eval(item['data'])
res = func(**params)
self.assertEqual(expectet,res)
# 结果
{'case':'1','data':'2','expected:'3'}
{'case':'1','data':'2','expected:'3'}
# 封装Excel
import openpyxl
class HandleExcel:
def __init__(self,filename,sheetname):
self.filename = filename
self.sheetname = sheetname
self.workbook = openpyxl.load_workbook(filename)
self.sheet = self.workbook[sheetname]
def read_data(self):
res = list(self.sheet.rows)
title = [i.value for i in res[0]]
cases = []
for item in res[1:]:
data = [i.value for i in item]
dic = dict(zip(title, data))
cases.append(dic)
return cases
def write_data(self,row_no:int,colunm_no:int,value):
self.sheet.cell(row=row_no,column=colunm_no,value=value)
self.workbook.save(filename=self.filename)
@ddt
class TestMusen(unittest.TestCase):
excel = HandleExcel('仓库作业-入库.xlsx', 'Sheet1')
cases = excel.read_data()
@list_data(cases)
def test(self, item):
expected = eval(item['expected'])
params = eval(item['params'])
res = func(**params)
self.assertEqual(True, res)
#run.py
import unittest
import os
if __name__ == '__main__':
# file = 'test_jtyoui.py'
# case_path = os.path.join(os.getcwd(), "testsuite")
# case_path = os.path.join(os.path.dirname(os.path.abspath(file)))
# print(case_path)
suite = unittest.defaultTestLoader.discover(r'F:\file\src\news')
# 创建测试用例运行程序
runner = unittest.TextTestRunner()
# 运行测试用例
runner.run(suite)
三十一、日志输出
# -*- coding: utf-8 -*-
"""
@Time : 2022/10/28 17:34
@Auth : dengyunman
@File :log.py
"""
import logging
def create_log(name='mylog',level="DEBUG",filename='log,log',sh_level='DEBUG',fh_level='DEBUG'):
# 1、创建日志收集器
log = logging.getLogger(name)
# 2、设置日志收集器的收集等级
log.setLevel(level)
# 3、设置输出渠道
# 3.1 输出到文件
fh = logging.FileHandler(filename,encoding='utf-8')
fh.setLevel(fh_level)
log.addHandler(fh)
# 3.2 输出到控制台
sh = logging.StreamHandler()
sh.setLevel(sh_level)
log.addHandler(sh)
# 4、设置输出格式
log_format = logging.Formatter('%(asctime)s--%(filename)s-%(levelno)s:%(message)s')
sh.setFormatter(log_format)
fh.setFormatter(log_format)
return log
mylog = create_log()
log = create_log()
log.debug("---debug---")
log.info("---info---")
log.warning("---warning---")
log.error("---error---")
log.critical("---critical---")
test.py
from log import mylog
mylog.error("---error---")
三十二、配置文件
ini文件格式: .ini 配置工具ini -settings -plugins -ini搜索安装
ini.ini
[logging]
level = DEBUG
file = log.log
sh_level = info
[mysql]
host = 127.0.0.1
port = 3306
username = root
password = root
name1 = deng
ini操作-读取 写入(少用)
from configparser import ConfigParser
# 1.创建配置文件解析器对象
cp = ConfigParser()
# 2.读取配置文件内容到配置文件解析器中
cp.read('ini.ini', encoding='utf-8')
# 3.读取配置内容
res = cp.get('logging', 'file')
print(res)
# cp.getint()
# cp.getboolean()
# cp.getfloat()
# 写入
cp.set('mysql','name1','deng')
cp.write(fp=open('ini.ini','w',encoding='utf-8'))
yaml文件格式 .yaml 配置工具yaml -settings -plugins -yaml搜索安装
pip3 insatll pyyaml
yaml.yaml
# yaml文件读取出来不是列表就是字典|最外层要统一为列表或统一为字典
# 字典 冒号后面必加空格
# 嵌套字典
case:
data:
user: jack
pwd: pass
expected:
msg: 通过
# 列表
list:
- 1
- 2
readyaml.py
import yaml
with open('yaml.yaml','r',encoding='utf-8') as f:
res =yaml.load(f,Loader=yaml.Loader)
print(res,type(res))
print(res['case']['data'])
三十三、json数据
json.json
{
"?mysql": "json文件字段必加双引号",
"mysql": {
"name": "jack",
"pwd": "root",
"gender": "女",
"habits":["football","tennis"],
"is18+":true,
"rings": "None"
}
}
readjson.py
import json
with open("json.json",'r',encoding='utf-8') as f:
res =json.load(f)
print(res,type(res))
print(res['mysql']['is18+'],type(res['mysql']['is18+']))
# ---------------json转python---------------
# 将json字符串转为python数据
run = '{"aa":true,"bb":null}'
pydata = json.loads(run)
# ---------------python转json---------------
# 将python数据(列表或字典)转换为json -变为str类型
dic = {"mysql": {
"name": "jack",
"pwd": "root",
"gender": "女",
"habits":["football","tennis"],
"is18+": True,
"rings": None
}}
# 变为str类型
json_res =json.dumps(dic)
三十四、综合应用
项目结构:
用例数据文件 --->datas
日志文件 ---->logs
测试报告 ---->reports
配置文件 ---->conf
测试用例模块 ---->cases
封装的公共模块---->common
封装的读取、操作excel的模块
封装的读取创建日志收集器的模块
项目运行启动模块
发表评论