全套视频教程便宜卖,web、 接口 、app自动化测试,python全栈自动化测试
目标
- 数据库如何写成一个类,如何校验数据库的数据?怎么添加校验让它自动校验
- 发送邮件
- jenkins相关
- jenkins环境部署
- jenkins一键集成
- jenkisn自动化部署
- 构建定时job
写一个对数据库操作的类
-
在配置文件中,配置数据库连接信息
[DB] db_config={ "host":"127.0.0.1", "user":"root", "password":"admin1234", "port":3306, "database":"testing01", "buffered":True }
-
写一个操作数据库的类
import json import sys reload(sys) sys.setdefaultencoding('utf-8') import mysql.connector from common.public.read_config import * from common.public.project_path import * class DoMysql: def do_mysql(self,query_sql,state="all"): """ :param query_sql: sql语句 :param state: all代表返回所有数据,1代表返回一条数据 :return:返回是查询结果,格式处理,1条是元组,多条是列表嵌套元组,但是编码问题,要对结果处理 """ #从配置文件读取数据库连接信息 db_config=eval(ReadConfig().get_config(case_config_path,"DB","db_config")) #创建一个数据库连接 cnn=mysql.connector.connect(**db_config) #建立游标cursor cursor=cnn.cursor() #执行语句 cursor.execute(query_sql) #获取结果 if state==1: res=cursor.fetchone() else: res=cursor.fetchall() #关闭游标 cursor.close() #关闭连接 cnn.close() return res
可以利用反射,对于需要从数据库获取值进行获取、保存。
如:上个请求结束后,会在数据库创建一个随机字段值-
对于需要进行数据库校验的接口,在请求前后进行数据库值对比。
如:充值前和充值后都要对数据库数据进行对照,应有的余额是否正确。
那么在请求前需要查一次余额,请求后需要查一次余额- 解决:配置文件中新增配置,通过配置
sheet_name
来判断是否需要请求前后查询余额[CHECKLEAVEAMOUNT] check_list=["recharge","invest"]
使用:
#get_data.py check_list=eval(ReadConfig.get_config(case_config_path, "CHECKLEAVEAMOUNT", "check_list"))`
#test_http_request.py if item["sheet_name"] in getattr(GetData,"check_list"): #TODO:请求之前,根据用户id查询数据库余额 res=HttpRequest().http_request(,item["url"],item["method"],eval(item["payload"])) #TODO:请求之后,根据用户id再次查询数据库余额 #判断(请求后余额-请求前余额)是否等于充值余额,存储判断结果 else: res=HttpRequest().http_request(,item["url"],item["method"],eval(item["payload"]))
- 解决:配置文件中新增配置,通过配置
-
另一种解决思路:
上述方法相当于一个模块所有用例都要去check一次,但实际中并不一定需要。
另一个解决思路:在excel中新增一个字段
check_sql
,格式:{sql:select name from students where age=20}
,检测如果有query_sql
就校验数据库,query_sql
为None
就不校验数据库if item["check_sql"]!=None: query_sql=eval(item["check_sql"]["sql"]) #TODO:请求之前数据库余额 res=HttpRequest().http_request(,item["url"],item["method"],eval(item["payload"])) #TODO:请求之后数据库余额 #TODO:判断(请求后余额-请求前余额)的绝对值是否等于充值余额,存储判断结果 if (请求后余额-请求前余额)的绝对值==充值余额: check_sql_result="数据库校验通过" else: check_sql_result="数据库校验不通过" #TODO:将结果写回 DoExcel.write_back_data(test_data_path,item["sheet_name"],item["case_id"]+1,10,str(check_sql_result)) else: res=HttpRequest().http_request(,item["url"],item["method"],eval(item["payload"]))
把结果写回的函数修改,记得把result和TestResult字段的代码修改:
#do_excel.py @staticmethod def write_back_data(file_name,sheet_name,row,col,result): wb=load_workbook(file_name) sheet=wb[sheet_name] sheet.cell(row,col).value=result wb.save(file_name) #保存
#result写回 DoExcel.write_back_data(test_data_path,item["sheet_name"],item["case_id"]+1,8,str(json.dumps(res.json(), encoding="utf-8", ensure_ascii=False))) #TestResult写回 DoExcel.write_back_data(test_data_path,item["sheet_name"],item["case_id"]+1,9,str(TestResult))
-
怎么把数据库校验结果写到excel中?
思路:多一个CheckResult字段
-
检查多个点,需要多个sql语句怎么办?
思路:[{sql1:xxxx},{sql2:xxx},....]
技巧:代码调试时,多使用日志,写完后,可以通过改日志级别控制输出的日志。
发送邮件
该部分了解即可,一般不用这么发送文件,jenkins集成以后,直接通过jenkins发送邮件
-
设置授权码
常识:咱们平时登录邮箱通过用户名和密码,但是如果通过代码发送邮件,需要在邮箱中设置授权码,通过授权码登录邮箱、发送邮件。
设置授权码一般在设置POP3/SMTP服务处。具体百度吧。
-
写一个发送邮件的类
import smtplib import time from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.application import MIMEApplication #发件人的用户名和第三方授权码 _user="xxxxxx@qq.com" _pwd="第三方授权码" #时间戳 now=time.strftime() class SendEmail: def send_email(self,email_to,filepath): """ email_to:收件人邮箱地址 filepath:发送的附件地址 """ msg=MIMEMultipart() msg["Subject"]=now+"测试报告" msg["From"]=_user msg["To"]=email_to #文字部分 part=MIMEText("本次自动化测试报告,请查收") msg.attach(part) #附件部分,只能发一个附近,需要多个附件,对下面代码做for循环 part=MIMEApplication(open(filepath,"rb").read()) part.add_header("Content-Disposition","attachment",filename=filepath) msg.attach(part) #发送 s=smtplib.SMTP_SSL("smtp.qq.com",timeout=30) #连接SMTP邮件服务,默认端口是25 s.login(_user,_pwd) #登录服务器 s.sendmail(_user,email_to,msg.as_string()) #发送邮件
正则表达式
学习正则的目的:正则表达式自行去匹配结果
概念:正则表达式用一个规则匹配你想要的信息
-
两个重点:元字符、限定符
-
示例
import re from common.public.get_data import GetData #re.match s="www.baidu.com" #目标字符串 res=re.match("www",s) #全匹配 print res #输出:<_sre.SRE_Match object at 0x102753370> 是一个内存地址 print res.group() #输出:www res_1=re.match("(w)(ww)",s) print res_1.group() #www print res_1.group(0) #www print res_1.group(1) #w print res_1.group(2) #ww #group()按括号分组,group()=group(0),拿到匹配的全字符,group(1)是第一个括号匹配的字符,group(2)是第二个括号匹配的字符 #re.findall s="helloworllod" res=re.findall("llo",s) #返回s中与"llo"想匹配的字符串,存在列表里 print res #输出:['llo', 'llo'] #没有group()功能 #re.search payload='{"user_phone": "${common_phone}", "sms_code": "0088"}' res=re.search("\$\{(.*?)\}",payload) print res.group() #输出:${common_phone} print res.group(0) #输出:${common_phone} print res.group(1) #输出:common_phone new_payload=payload.replace(res.group(0),str(getattr(GetData,res.group(1)))) print new_payload
#get_data.py common_phone=(pandas.read_excel(test_data_path, sheet_name="init")).ix[1,0]
- 可以使用re.search方法简化我们的do_excel代码
-
$
、{
、}
在正则中有特殊含义,需要进行转义
-
写成一个类
import re from common.public.get_data import GetData class DoRegex: @staticmethod def do_regex(s): while re.search("\$\{(.*?)\}", s): key=re.search("\$\{(.*?)\}", s).group(0) value=re.search("\$\{(.*?)\}", s).group(1) s=s.replace(key,str(getattr(GetData,value))) return s if __name__ == '__main__': s='{"user_phone": "${common_phone}", "sms_code": "${code}"}' res=DoRegex.do_regex(s) print res
jenkins
-
学习目标
- 介绍jenkins&安装jenkins
- 完成第一个jenkins配置job
- 发送邮件&附件&定时任务job
- 实用
- 定时跑任务
- 部署测试环境(一旦有新代码提交,那么就会自动化从svn上拉取代码,然后打包、然后部署成功-shell脚本)
- svn跑自动化测试
-
jenkins是什么?
- 开源的,友好操作界面的持续集成(CI)工具,起源于Hudson(Hudson是商用),主要用于持续、自动的构建/测试软件项目、监控外部任务的运行,jenkins用java语言编写,可在tomcat等流行servlet容器中运行,也可独立运行。
- 通常与版本管理工具(SCM)、构建工具结合使用:常用的版本控制工具有SVN、GIT,构建工具有Maven、Ant、Gradle
-
项目中的实际作用:
- 部署测试环境
- 跑定时任务(结合自动化/测试工具可以使用)
-
安装jenkins
.smi
版本,是在windows电脑上界面操作,点击下一步、下一步....-
.war
版本,在linux、win上都可以安装- 上传war包到tomcat下webapps
- 启动tomcat/bin下,输入./startup.sh
- 安装jenkins,输入地址:8080/jenkins
- 安装之后会有输入密码的界面
-
以前写的安装教程:https://www.jianshu.com/p/bd841873d323
- 启动jenkins :
java -jar jenkins.war --httpPort=8080
- 启动jenkins :
-
简单理解运行机制
- 我把代码放到某处,比如D盘、比如Github上
- jenkins到D盘把代码拿到复制到jenkins的工作目录下
- 执行代码
- python代码必须在有python环境下的电脑上,jenkins上才可以运行
-
构建
- jekins上有一个词-build,中文翻译为构建,实际是执行的意思。
- jekins上需要执行的东西,都称为job,中文为任务,构建一个job,就是执行一次任务。
- 构建队列,每次构建都会排队执行
-
demo
-
创建一个job:jenkins主界面>new item>自由风格的项目>保存
-
跳转到job的配置页
-
general
常规,测试一般用名称(最好不要带中文)、项目描述
-
源码管理
存放源码的地方,无代表存在本地,Git……如果没有公司的代码托管工具,可以安装插件
-
构建触发器
设置触发执行的条件,达到条件执行job
-
构建环境
执行任务时的空间
-
构建
构建时,执行的脚本之类
执行我们的api_auto的run.py文件
选择shell,命令为:(mac)
python /Users/leitianxiao/Work/beefriend_interface/api_auto/run.py
-
-
- 构建后操作
构建后进行的操作
>参考:https://www.cnblogs.com/QAroad/p/11424919.html
- job界面
- 修改记录
- 工作空间
构建第一次后,在jenkin/workspace目录下生成一个文件夹
- Build Now
立即构建按钮
- 配置
进入job配置页
- 进行第一次构建
![image](https://upload-images.jianshu.io/upload_images/12041448-cf8e5d9055d3feaf?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
-
定时任务
- 设置:构建触发器>build periodically 日程表
- 设置定时语法
定时器构建语法 * * * * *(星号中间用空格隔开) 第一个* 表示分钟,取值0~59 第二个* 表示小时,取值0~23 第三个* 表示一个月的第几天,取值1~31 第四个* 表示第几个月,取值1~12 第五个* 表示一周中的第几天,取值0~7,其中0和7代表的都是周日 用法举例: 每30分钟构建一次:H代表形参 H/30 * * * * 每2个小时构建一次: H H/2 * * * 每天的8点,12点,22点,一天构建3次:(多个时间点中间用逗号隔开) 0 8,12,22 * * * 每天早上8点到晚上6点每三小时检查一次 H 8-18/3 * * *
-
jenkins连接代码托管工具(svn为例)
- Repository URL:源码地址
- 添加凭据:标题、登录代码托管工具的用户名、密码
- 执行shell
python run.py
- 因为代码托管平台代码拉到了工作空间,没有顶级目录了,直接执行run.py
-
发邮件
-
安装插件Email Extension Plugin
- 插件管理安装
- 设置代理安装
- 离线安装
-
配置发邮件相关: Manage Jenkins>Configure System
Jenkins Location-系统管理员邮件地址:发送邮件的地址
-
邮件通知 如果安装插件没有成功,他就只有邮件通知
- SMTP服务:收邮件的服务,qq邮箱是smtp.qq.com
- POP3服务:发邮件的服务
-
勾选使用SMTP认证
- 用户名:邮箱地址,要跟系统管理员邮件地址一直
- 密码:第三方授权码
- 使用SSL协议:qq邮箱勾选、163邮箱不用勾选
- SMTP端口:qq邮箱是465,126是25
-
测试是否发送成功:勾选通过发送测试邮件测试配置
- 写一个别的邮箱,看是否能发送邮件成功
- 可能会被识别为垃圾邮件,需注意
-
触发器,在什么条件加触发发邮件这个动作,Default Triggers
-
如何触发发送邮件
-
job配置页,构建后操作,Editable E-mail Notification
-
可编辑
- 收件人
- 内容
- 附件 根目录是工作空间,多文件可以逗号隔开
-
立即构建
-