python接口自动化-实战(第五阶段)

全套视频教程便宜卖,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_sqlNone就不校验数据库

      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="[email protected]"
    _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()) #发送邮件
    

正则表达式

  • 学习正则的目的:正则表达式自行去匹配结果

  • 概念:正则表达式用一个规则匹配你想要的信息

  • 两个重点:元字符、限定符


    image
  • 示例

    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
  • 简单理解运行机制

    • 我把代码放到某处,比如D盘、比如Github上
    • jenkins到D盘把代码拿到复制到jenkins的工作目录下
    • 执行代码
      • python代码必须在有python环境下的电脑上,jenkins上才可以运行
  • 构建

    • jekins上有一个词-build,中文翻译为构建,实际是执行的意思。
    • jekins上需要执行的东西,都称为job,中文为任务,构建一个job,就是执行一次任务。
    • 构建队列,每次构建都会排队执行
  • demo

    • 创建一个job:jenkins主界面>new item>自由风格的项目>保存


      image
    • 跳转到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

        image
    • 如何触发发送邮件

      • job配置页,构建后操作,Editable E-mail Notification


        image
      • 可编辑

        • 收件人
        • 内容
        • 附件 根目录是工作空间,多文件可以逗号隔开
    • 立即构建

你可能感兴趣的:(python接口自动化-实战(第五阶段))