commit
This commit is contained in:
parent
04a492919b
commit
89dc5ff5d0
|
@ -0,0 +1,4 @@
|
|||
课程内容:
|
||||
使用正则表达式高效替换用例数据
|
||||
|
||||
python内置模块re
|
|
@ -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
|
|
@ -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')
|
||||
|
||||
|
|
@ -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-----------------#
|
|
@ -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)
|
|
@ -0,0 +1,4 @@
|
|||
|
||||
课程内容:
|
||||
封装正则表达式
|
||||
复习动态设置以及获取类属性
|
|
@ -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
|
@ -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 (0–59)
|
||||
HOUR The hour of the day (0–23)
|
||||
DOM The day of the month (1–31)
|
||||
MONTH The month (1–12)
|
||||
DOW The day of the week (0–7) 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 command:windows环境用这个
|
||||
命令:python run_test.py (需要在服务器上安装python)
|
||||
Execute shell:linux环境用这个
|
||||
6、项目-工作区间
|
||||
先立即构建,会生成workspace的对应项目的文件夹:C:\Users\HopeXia\.jenkins\workspace\Python27ApiTest
|
||||
复制项目代码,放置到该文件夹里面
|
||||
刷新工作区间就能看到项目代码了
|
||||
这种方式只适用于从本地拉取代码。如果是从git, svn上拉取代码,不需要有此复制操作。
|
||||
|
||||
jenkins插件安装:Manage Jenkins-Manage Plugins
|
||||
我们需要用到这几个插件:git.hpi, subversion.hpi, email-ext.hpi, htmlpublisher.hpi
|
|
@ -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')
|
|
@ -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')
|
|
@ -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')
|
Loading…
Reference in New Issue