This commit is contained in:
floraachy 2020-04-09 22:04:29 +08:00
parent 04a492919b
commit 89dc5ff5d0
12 changed files with 9457 additions and 0 deletions

View File

@ -0,0 +1,4 @@
课程内容:
使用正则表达式高效替换用例数据
python内置模块re

View File

@ -0,0 +1,43 @@
# 日志文件相关配置
[LOG]
# 自定义日志收集器名称
LOG_LOGGER = floralog
# 日志收集等级
LOG_LEVEL = DEBUG
# 输出到文件的日志等级
LOG_FILE_LEVEL = DEBUG
# 输出到控制台的日志等级
LOG_SH_LEVEL = ERROR
# 日志文件的名称
LOG_FILENAME = all.log
# 日志格式
LOG_FORMATS = %%(asctime)s ---%%(name)s--- [%%(filename)s-->line:%%(lineno)d] - %%(levelname)s: %%(message)s
[ENV]
BASE_URL = http://api.lemonban.com/futureloan
BASE_HEADERS = {'X-lemonban-Media-Type': 'lemonban.v2'}
PHONE = 131
[MYSQL]
HOST=120.78.128.25
PORT=3306
USER=future
PASSWORD=123456
CHARSET=utf8
[TEST]
PHONE=15500005679
PWD=12chyfghkll
ADMIN_PHONE=15500005682
ADMIN_PWD=@$?><@#$*()
LOGIN_URL=/member/login
lOGIN_METHOD=post
ADD_URL=/loan/add
ADD_METHOD=post
[REG]
age = 18
user = python
pwd = lemonban
name = flora

View File

@ -0,0 +1,22 @@
"""
=================================
Author: Flora Chen
Time: 2020/3/17 21:15
-_- -_- -_- -_- -_- -_- -_- -_-
=================================
"""
import os
from configparser import ConfigParser
class HandleConfig(ConfigParser):
"""
配置文件解析器类的封装
"""
def __init__(self, filename):
super().__init__()
self.read(filename, encoding='utf-8')
conf = HandleConfig(r'E:\PycharmProject\PythonClassChy\python27Class\unitTest\class04022020\config.ini')

View File

@ -0,0 +1,125 @@
"""
=================================
Author: Flora Chen
Time: 2020/4/2 20:38
-_- -_- -_- -_- -_- -_- -_- -_-
=================================
"""
import re
"""
findall查找所有符合规范的数据
参数1匹配规则
参数2被查找的字符串
返回值list - 所有符合规范的数据
search匹配一个符合规范的数据
参数1匹配规则
参数2被查找的字符串
返回值匹配对象
match:
sub:
"""
s1 = '130aaaaaa130bbbbb130ccccc'
# print(re.findall('130', s1))
# -----------正则表达式的匹配规则-单字符匹配--------------#
s2 = '11\naa\taa33245678asfghJwert'
print(re.findall('.', s2)) # .表示匹配任意一个字符(除\n之外
# 输出结果:['1', '1', 'a', 'a', '\t', 'a', 'a', '3', '3', '2', '4', '5', '6', '7', '8', 'a', 's', 'f', 'g', 'h', 'j', 'w', 'e', 'r', 't']
print(re.findall('[1-3a-gJ-S]', s2)) # 匹配[]列举的字符这里匹配数字1~3, a~g, J~S
# 输出结果:['1', '1', 'a', 'a', 'a', 'a', '3', '3', '2', 'a', 'f', 'g', 'J', 'e']
print(re.findall('\d', s2)) # \d表示数字0~9
# 输出结果:['1', '1', '3', '3', '2', '4', '5', '6', '7', '8']
print(re.findall('\D', s2)) # \D表示非数字0~9除外其他都匹配
# 输出结果:['\n', 'a', 'a', '\t', 'a', 'a', 'a', 's', 'f', 'g', 'h', 'J', 'w', 'e', 'r', 't']
s3 = ' aa\t b\n '
print(re.findall('\s', s3)) # \s表示空白键
# 输出结果:[' ', '\t', ' ', '\n', ' ', ' ']
print(re.findall('\S', s3)) # \S表示非空白键
# 输出结果:['a', 'a', 'b']
s4 = 'asdfGHJK_E&*&*你好'
print(re.findall('\w', s4)) # \w表示单词字符即a~z, A~Z, 0~9, _, (中文也算)
# 输出结果:['a', 's', 'd', 'f', 'G', 'H', 'J', 'K', '_', 'E', '你', '好']
print(re.findall('\W', s4)) # \W表示非单词字符
# 输出结果:['&', '*', '&', '*']
# -----------正则表达式的匹配规则-多字符匹配--------------#
s5 = '131aaaaaa133bbbbb138ccccc1234j987654'
# {n}表示前一个字符出现n次
print(re.findall('\d{3}', s5)) # 匹配所有数字长度为3
# 输出结果:['131', '133', '138', '123', '987', '654']
# {n,m}表示前一个字符出现n-m次
print(re.findall('\d{3,5}', s5)) # 匹配所有数字长度为3~5尽可能匹配更多的内容
# 输出结果:['131', '133', '138', '1234', '98765']
"""
贪婪模式最符合匹配的规范之内尽可能匹配更多的内容默认开启了贪婪模式
非贪婪模式最符合匹配的规范之内尽可能匹配更少的内容
"""
# 使用?关闭贪婪模式
print(re.findall('\d{3,5}?', s5)) # 匹配所有数字长度为3~5尽可能匹配更少的内容
# 输出结果:['131', '133', '138', '123', '987', '654']
# {m,}表示一个字符至少出现m次
print(re.findall('\d{3,}', s5)) # 匹配所有数字长度为3+
# 输出结果:['131', '133', '138', '1234', '987654']
s6 = 'abc123'
# * 表示前一个字符串出现0次或者n次0次以上
print(re.findall('\d*', s6))
# 输出结果:['', '', '', '123', '']
# + 表示前一个字符串出现1次或者n次1次以上
print(re.findall('\d+', s6))
# 输出结果:['123']
# -------------边界---------------------#
# \b 单词边界(要么是开头,要么以空格或者标点符号间隔)
s7 = 'python123python456python'
print(re.findall('python', s7))
# 输出结果:['python', 'python', 'python']
print(re.findall(r'\bpython', s7))
# 输出结果:['python']
s8 = 'python123 python456?python3python'
print(re.findall(r'\bpython', s8))
# 输出结果:['python', 'python', 'python']
# \B 非单词边界
print(re.findall(r'\Bpython', s8))
# 输出结果:['python']
# -------------字符串开头结尾-------------------#
s9 = 'react123java567php'
print(re.findall('^react', s9)) # 匹配以react开头的
# 输出结果:['react']
print(re.findall('php$', s9)) # 匹配以php结尾的
# 输出结果:['php']
# -------------匹配多组内容------------------#
s10 = 'phone1234pwd456'
print(re.findall('phone|pwd', s10)) # 匹配多个规范,每个规范用|隔开
# 输出结果:['phone', 'pwd']
data = "{'user': '#user#', 'pwd': '#pwd#', 'name': '#name#', 'age': #age#}"
print(re.findall('#.*?#', data))
# 输出结果:['#user#', '#pwd#', '#name#', '#age#']
print(re.findall('#(.*?)#', data)) # ()表示匹配分组
# 输出结果:['user', 'pwd', 'name', 'age']
# -------------search-----------------#

View File

@ -0,0 +1,69 @@
"""
=================================
Author: Flora Chen
Time: 2020/4/2 20:47
-_- -_- -_- -_- -_- -_- -_- -_-
=================================
"""
import re
from python27Class.unitTest.class04022020.handle_config import conf
user = 'python'
pwd = 'lemonban'
name = 'flora'
age = 18
data = "{'user': '#user#', 'pwd': '#pwd#', 'name': '#name#', 'age': #age#}"
# 用replace方法需要多次替换 (缺点:每次只能替换一个数据,效率太低)
data = data.replace('#user#', user)
data = data.replace('#pwd#', pwd)
data = data.replace('#name#', name)
data = data.replace('#age#', str(age))
print(data)
# 使用正则替换
data = "{'user': '#user#', 'pwd': '#pwd#', 'name': '#name#', 'age': #age#}"
# rule = re.search('#(.*?)#', data)
# print(rule) # 输出结果:<re.Match object; span=(10, 16), match='#user#'>
#
# # 获取匹配到的数据
# key = rule.group()
# print(key) # 输出结果:#user#
#
# # 获取匹配规则中()里面的内容, 1表示第一个()里的内容
# item = rule.group(1)
# print(item) # 输出结果user
#
# value = conf.get('REG', item)
# data = data.replace(key, value)
# print(data)
test = {
'user': 'python',
'name' : 'flora',
'pwd' : 'lemonban',
'age' : 18
}
def replace_data(data):
while re.search('#(.*?)#', data):
rule = re.search('#(.*?)#', data)
# 获取匹配到的数据
key = rule.group()
# 获取匹配规则中()里面的内容, 1表示第一个()里的内容
item = rule.group(1)
# 用字典中的值来替换
value = str(test[item])
# 用配置文件中的值来替换
# value = conf.get('REG', item)
data = data.replace(key, value)
return data
res = replace_data(data)
print('结果:', res)

View File

@ -0,0 +1,4 @@
课程内容:
封装正则表达式
复习动态设置以及获取类属性

View File

@ -0,0 +1,33 @@
"""
=================================
Author: Flora Chen
Time: 2020/4/8 9:42
-_- -_- -_- -_- -_- -_- -_- -_-
=================================
"""
class EnvData:
"""
定义一个类用来保存用例执行过程中提取出来的数据
当成环境变量的容器
"""
pass
data = {"member_id": 188, "mobile_phone": "13567895555"}
token = "dfgfdgfdgdf dfgfdg dfgfdg dyjyui"
# 动态的设置类属性
setattr(EnvData, "member_id", data['member_id'])
setattr(EnvData, "token", token)
setattr(EnvData, "mobile_phone", data['mobile_phone'])
# 动态获取类属性
print(getattr(EnvData, "member_id"))
print(getattr(EnvData, "token"))
print(getattr(EnvData, "mobile_phone"))
# 通过以下方式也可以获取类属性
print(EnvData.member_id)
print(EnvData.token)
print(EnvData.mobile_phone)

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,55 @@
课程内容:
python发送邮件 - sendEmail.py
1、QQ 邮箱-设置-账户-SMTP服务-开启-发送密保-获取授权码
2、python有内置模块
import smtplib
from email.mime.text import MIMEText
python发送测试报告到邮箱 - sendReportByEmail.py
import smtplib
from email.mime.text import MIMEText # 用来发送邮件
from email.mime.application import MIMEApplication # 用来添加附件
from email.mime.multipart import MIMEMultipart # 用来构造多组件邮件
封装发送邮件的方法 - send_email.py
python集成jenkins
1、新建自由风格的项目
2、源码管理
通过Git Subversion管理代码需要安装插件
3、构建触发器
触发远程构建
设置令牌
通过url地址触发构建http://127.0.0.1:8081/job/Python27ApiTest/build?token=flora
* Build after other projects are built
开发/运维部署完项目立马触发测试代码,无需手动操作。即新版本上线立即进行自动化测试。
关注的项目:填写项目名字
* Build periodically
定期执行项目
日程表:*(分钟)*(小时)*(天)* (月)* (星期)
MINUTE Minutes within the hour (059)
HOUR The hour of the day (023)
DOM The day of the month (131)
MONTH The month (112)
DOW The day of the week (07) where 0 and 7 are Sunday.
30 22 15 6-9 1-7表示6-9月的15号周一到周日的22:30运行
GitHub hook trigger for GITScm polling
GitHub代码一更新立马触发构建。
Poll SCM
设置时间,定期轮询开发代码更新
4、构建环境
Delete workspace before build starts
每次构建时删除workspace代码用Git或SVN上最新的代码
5、构建
Execute Windows batch commandwindows环境用这个
命令python run_test.py 需要在服务器上安装python
Execute shelllinux环境用这个
6、项目-工作区间
先立即构建会生成workspace的对应项目的文件夹C:\Users\HopeXia\.jenkins\workspace\Python27ApiTest
复制项目代码,放置到该文件夹里面
刷新工作区间就能看到项目代码了
这种方式只适用于从本地拉取代码。如果是从git, svn上拉取代码不需要有此复制操作。
jenkins插件安装Manage Jenkins-Manage Plugins
我们需要用到这几个插件git.hpi subversion.hpi email-ext.hpi, htmlpublisher.hpi

View File

@ -0,0 +1,39 @@
"""
=================================
Author: Flora Chen
Time: 2020/4/9 20:20
-_- -_- -_- -_- -_- -_- -_- -_-
=================================
"""
"""
qq邮箱1622042529@qq.com
smtp授权码luvkjunkpjlweaab
QQ邮箱的smtp服务器地址smtp.qq.com端口是465
163邮箱的smtp服务器地址smtp.163.com端口是465/25 (25连接时直接使用smtplib.SMTP())
"""
import smtplib
from email.mime.text import MIMEText
# 第一步连接smtp服务器并登录
# 连接到smtp服务器
smtp = smtplib.SMTP_SSL(host='smtp.qq.com', port=465)
# 登录smtp服务邮箱账号+授权码登录)
smtp.login(user='1622042529@qq.com', password='luvkjunkpjlweaab')
# 第二步:构造一封邮件
# 邮件内容
msg = MIMEText('flora测试邮件-内容', _charset='utf-8')
# 邮件主题
msg['Subject'] = '测试邮件-主题'
# 收件人:是邮件中显示的收件人,不是实际的收件人
msg['To'] = '920514906@qq.com'
# 发件人:是邮件中显示的发件人,不是实际的发件人
msg['From'] = '1622042529@qq.com'
# 第三步:发送邮件
# from_addr是真正的发件人地址 to_addrs真正的收件人地址
smtp.send_message(msg, from_addr='1622042529@qq.com', to_addrs='920514906@qq.com')

View File

@ -0,0 +1,60 @@
"""
=================================
Author: Flora Chen
Time: 2020/4/9 20:20
-_- -_- -_- -_- -_- -_- -_- -_-
=================================
"""
"""
qq邮箱1622042529@qq.com
smtp授权码luvkjunkpjlweaab
QQ邮箱的smtp服务器地址smtp.qq.com端口是465
163邮箱的smtp服务器地址smtp.163.com端口是465/25 (25连接时直接使用smtplib.SMTP())
"""
import smtplib
from email.mime.text import MIMEText # 用来发送邮件
from email.mime.application import MIMEApplication # 用来添加附件
from email.mime.multipart import MIMEMultipart # 用来构造多组件邮件
# 第一步连接smtp服务器并登录
# 连接到smtp服务器
smtp = smtplib.SMTP_SSL(host='smtp.qq.com', port=465)
# 登录smtp服务邮箱账号+授权码登录)
smtp.login(user='1622042529@qq.com', password='luvkjunkpjlweaab')
# 第二步1构造一封邮件
# 读取报告中的内容,作为正文发送(缺陷:邮件中显示不友好)
# with open('04-08-2020 10_16_56.html', encoding='utf-8') as f:
# content = f.read()
# msg = MIMEText(content, _subtype='html', _charset='utf-8')
# 读取报告中的内容,作为附件发送
# 第二步2构造一封多组件邮件
msg = MIMEMultipart()
# 邮件主题
msg['Subject'] = 'HTML测试报告'
# 收件人:是邮件中显示的收件人,不是实际的收件人
msg['To'] = '920514906@qq.com'
# 发件人:是邮件中显示的发件人,不是实际的发件人
msg['From'] = '1622042529@qq.com'
# 构建文本内容
text = MIMEText('邮件中的文本内容', _charset='utf-8')
# 将构造的文本内容,添加到多组件邮件中
msg.attach(text)
# 构造邮件附件
# 读取报告中的内容,作为附件发送
with open('04-08-2020 10_16_56.html', 'rb') as f:
content = f.read()
report = MIMEApplication(content)
report.add_header('content-disposition', 'attachment', filename='04-08-2020 10_16_56.html')
msg.attach(report)
# 第三步:发送邮件
# from_addr是真正的发件人地址 to_addrs真正的收件人地址
smtp.send_message(msg, from_addr='1622042529@qq.com', to_addrs='920514906@qq.com')

View File

@ -0,0 +1,56 @@
"""
=================================
Author: Flora Chen
Time: 2020/4/9 20:59
-_- -_- -_- -_- -_- -_- -_- -_-
=================================
"""
import smtplib
from email.mime.text import MIMEText # 用来发送邮件
from email.mime.application import MIMEApplication # 用来添加附件
from email.mime.multipart import MIMEMultipart # 用来构造多组件邮件
def send_email():
"""
通过邮件发送报告的方法
:return:
"""
# 第一步连接smtp服务器并登录
# 连接到smtp服务器
smtp = smtplib.SMTP_SSL(host='smtp.qq.com', port=465)
# 登录smtp服务邮箱账号+授权码登录)
smtp.login(user='1622042529@qq.com', password='luvkjunkpjlweaab')
# 第二步1构造一封邮件
# 读取报告中的内容,作为正文发送(缺陷:邮件中显示不友好)
# with open('04-08-2020 10_16_56.html', encoding='utf-8') as f:
# content = f.read()
# msg = MIMEText(content, _subtype='html', _charset='utf-8')
# 读取报告中的内容,作为附件发送
# 第二步2构造一封多组件邮件
msg = MIMEMultipart()
# 邮件主题
msg['Subject'] = 'HTML测试报告'
# 收件人:是邮件中显示的收件人,不是实际的收件人
msg['To'] = '920514906@qq.com'
# 发件人:是邮件中显示的发件人,不是实际的发件人
msg['From'] = '1622042529@qq.com'
# 构建文本内容
text = MIMEText('邮件中的文本内容', _charset='utf-8')
# 将构造的文本内容,添加到多组件邮件中
msg.attach(text)
# 构造邮件附件
# 读取报告中的内容,作为附件发送
with open('04-08-2020 10_16_56.html', 'rb') as f:
content = f.read()
report = MIMEApplication(content)
report.add_header('content-disposition', 'attachment', filename='04-08-2020 10_16_56.html')
msg.attach(report)
# 第三步:发送邮件
# from_addr是真正的发件人地址 to_addrs真正的收件人地址
smtp.send_message(msg, from_addr='1622042529@qq.com', to_addrs='920514906@qq.com')