通用技术 自动化测试与持续集成方案

news2024/11/24 17:44:06

目录

前言:

传统接口测试

接口测试自动化

接口自动化的持续集成


前言:

在现代软件开发中,自动化测试和持续集成是两个不可或缺的环节。自动化测试可以提高测试效率、减少人工错误,并确保软件的质量。持续集成则可以帮助开发团队更快地集成和交付代码,提高开发效率和团队协作。

  1. 传统接口测试
  2. 接口自动化测试
  3. 接口自动化的持续集成
  4. 探讨

传统接口测试


不知道别人家的接口测试是怎么做的。这边是用 postman 这个 google 插件。测试人员按照接口开发人员的 wiki,设计测试用例,然后 post/get 一下。查看返回 json 的状态或者字段。


弱点是不便于管理 case 和不方便统计结果,执行要一个一个手工去点,效率低下。

接口测试自动化


我用 python 写了个脚本,将 case 写在 excel 里,然后读取 excel 来实现这个过程,并自动判断和统计结果,生成报告。
case 这么设计的。


脚本这么写的:

#encoding:utf-8

import ConfigParser
import os
import xlrd
import re
import httplib
import urllib
from urlparse import urlparse
import json
import time
import unittest
import pdf

currentdir=os.path.split(os.path.realpath(__file__))[0]
class test_class():
    def getexcel(self):
        casefile=currentdir + '/case.xls'
        if ((os.path.exists(casefile))==False):
            print "当前路径下没有case.xls,请检查!"
        data=xlrd.open_workbook(casefile)
        table = data.sheet_by_name('login')
        nrows = table.nrows #行数
        ncols = table.ncols #列数
    #colnames = table.row_values(1) #某一行数据
        for rownum in range(1,nrows):
            for col in range (3, ncols):
                value=table.cell(rownum,col).value
                if (col==3):
                    method=value
                if (col==4):
                    url=value
        return table,nrows,ncols

    def getexceldetail(self,table,row,ncols):
        #rownum = table.row_values(row) #某一行数据

        for col in range (0, ncols):
            value=table.cell(row,col).value
            if (col==0):
                caseid=value
        print caseid
            if (col==3):
                method=value
        print method
            if (col==4):
                url=value
        return method,url,caseid

    def httpget(self,url):
        httpClient = None
        conn = urlparse(url)
        url=url.encode('utf-8')
        try:
            httpClient = httplib.HTTPConnection(conn.netloc, timeout=10)
            httpClient.request('GET', url)

        # response是HTTPResponse对象
            response = httpClient.getresponse()
            print response
            d0=response.read()
            d0=d0.decode('unicode_escape')
        except Exception, e:
            print e
        finally:
            if httpClient:
                httpClient.close()
    return response.status,d0

    def httppost(self,url):
        httpClient = None
        conn = urlparse(url)
        url=url.encode('utf-8')
        try:
            header = {"Content-type": "application/x-www-form-urlencoded",
                  "Accept": "text/plain"}

            httpClient = httplib.HTTPConnection(conn.netloc, timeout=30)
            httpClient.request("POST", url)
            response1 = httpClient.getresponse()
            d1=response1.read()
            d1=d1.decode('unicode_escape')
        except Exception, e:
            print e
        finally:
            if httpClient:
                httpClient.close()
        return response1.status,d1

代码太多了点,没写下。其实就是一个读 excel,一个 post,一个 get 的过程。
后面还有一个对 json 的解析过程。开始以为是一个字典就搞定了,后面发现有些{}里面嵌套了好几层。
最后用了个递归搞定。

#! /usr/bin/env python
#coding=utf-8
import urllib2
import json


class readjson():
    def read(self,obj,key):
        collect = list()
        for k in obj:
            v = obj[k]

            if isinstance(v,str) or isinstance(v,unicode):
                if key== ' ':
                    collect.append({k:v})
                else:
                    collect.append({str(key)+"."+k:v})
            elif isinstance(v,int):
                if key== ' ':
                    collect.append({k:v})
                else:
                    collect.append({str(key)+"."+k:v})
            elif isinstance(v,bool):
                if key== ' ':
                    collect.append({k:v})
                else:
                    collect.append({str(key)+"."+k:v})
            elif isinstance(v,dict):
                collect.extend(read(v,k))
            elif isinstance(v,list):
                collect.extend(readList(v,key))
        return collect

    def readList(self,obj,key):
        collect = list()
        for index,item in enumerate(obj):
            for k in item:
                v = item[k]
                if isinstance(v,str) or isinstance(v,unicode):
                    collect.append({key+"["+str(index)+"]"+"."+k:v})
                elif isinstance(v,int):
                    collect.append({key+"["+str(index)+"]"+"."+k:v})
                elif isinstance(v,bool):
                    collect.append({key+"["+str(index)+"]"+"."+k:v})
                elif isinstance(v,dict):
                    collect.extend(read(v,key+"["+str(index)+"]"))
                elif isinstance(v,list):
                    collect.extend(readList(v,key+"["+str(index)+"]"))
        return collect


#ojt=test_data1

#print read(ojt,' ')

最后是结果:


是用 python 写图表,生成 pdf.

from reportlab.graphics.shapes import Drawing  
from reportlab.graphics.charts.barcharts import VerticalBarChart  
from urllib import urlopen    
from reportlab.graphics.shapes import *    
from reportlab.graphics.charts.lineplots import LinePlot    
from reportlab.graphics.charts.textlabels import Label    
from reportlab.graphics import renderPDF  
class pdfreport():
    def createpdf(self,datas):
        drawing = Drawing(400, 200)
        #data = [(13, 5, 20),(14, 6, 21)]
        data=datas
        bc = VerticalBarChart()
        bc.x = 50
        bc.y = 50
        bc.height = 125
        bc.width = 300
        bc.data = data
        bc.strokeColor = colors.black
        bc.valueAxis.valueMin = 0
        bc.valueAxis.valueMax = 50
        bc.valueAxis.valueStep = 10
        bc.categoryAxis.labels.boxAnchor ='ne'
        bc.categoryAxis.labels.dx = 8
        bc.categoryAxis.labels.dy = -2
        bc.categoryAxis.labels.angle = 30
        bc.categoryAxis.categoryNames = ['Jan-99','Feb-99','Mar-99']
        #bc.categoryAxis.categoryNames =ytype
        drawing.add(bc)

        drawing.add(String(250,150,"ss", fontSize=14,fillColor=colors.red))
        #drawing.add(String(250,150,des, fontSize=14,fillColor=colors.red))
        renderPDF.drawToFile(drawing,'report1.pdf','API')
        #renderPDF.drawToFile(drawing,'APIReport.pdf','API')

datas=[(0,20),(0,25)]
f=pdfreport()
f.createpdf(datas)

接口自动化的持续集成


配置到 jenkins 上也很简单,这里就不过多描述。现在问题是,生成的报告是 pdf。Jenkins 里面不太好展现出来。弄成 zip 附件查看不方便。最后我写个脚本将其传到共享里面,或者写脚本用邮件发出来。后面写打包的时候会讲到的。

  作为一位过来人也是希望大家少走一些弯路

在这里我给大家分享一些自动化测试前进之路的必须品,希望能对你带来帮助。

(WEB自动化测试、app自动化测试、接口自动化测试、持续集成、自动化测试开发、大厂面试真题、简历模板等等)

相信能使你更好的进步!

点击下方小卡片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/760860.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

18.JavaWeb-JWT(登录、鉴权)

1.CSRF跨站请求伪造 跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的…

SOCKET编程基本原理

测试模拟环境 python 3.8—对应Pycharm 专业版 for linux 本文采用的环境是vmware + ubantu_64 先简单配置一下netstat工具 sudo apt-get install net-tools netstate基本用法 sudo netstat -at | grep 1234 // |管道函数 grep匹配正则表达式移除端口用Kill就可以了 SOCK…

Calendar类中的字段常量有哪些?

一、Calendar类介绍 Calender类是Java中用于处理日期和时间的类之一。它提供了一组方法,可以对日期和时间进行各种操作,如获取当前日期和时间、计算日期间的差值、设置特定日期和时间等。 Calendar类是一个抽象类,不能直接实例化&#xff0…

MySQL基础管理

目录 ​编辑 一、数据库管理 1.1语言分类 1.2、DDL 二、MySQL相关文件 三、MySQL相关命令 3.2.1创建表的流程 1.创建新的数据库 2.查看创建的数据库 3.进入text库中,创建表 4.查看text下的所有表 5.查看表的属性 6.向表中添加数据 7.查看表中的数据 1.3查看…

TinyKv调用流程梳理二

addNode生成peer func (c *client) heartbeatStreamLoop() {defer c.wg.Done()for {select {case <-c.ctx.Done():returndefault:}ctx, cancel : context.WithCancel(c.ctx)c.connMu.RLock()stream, err : c.leaderClient().RegionHeartbeat(ctx)c.connMu.RUnlock()if err !…

golang waitgroup

案例 WaitGroup 可以解决一个 goroutine 等待多个 goroutine 同时结束的场景&#xff0c;这个比较常见的场景就是例如 后端 worker 启动了多个消费者干活&#xff0c;还有爬虫并发爬取数据&#xff0c;多线程下载等等。 我们这里模拟一个 worker 的例子 package mainimport (…

Redis实现skipList(跳表) 代码有详解

Redis实现skipList(跳表) 项目介绍 非关系型数据库redis&#xff0c;以及levedb&#xff0c;rockdb其核心存储引擎的数据结构就是跳表。 本项目就是基于跳表实现的轻量级键值型存储引擎&#xff0c;使用C实现。插入数据、删除数据、查询数据、数据展示、数据落盘、文件加载数…

Java-API简析_java.lang.Runtime类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/131714695 出自【进步*于辰的博客】 因为我发现目前&#xff0c;我对Java-API的学习意识比较薄弱…

【GESP】2023年06月图形化四级 -- 按身高排序

按身高排序 【题目描述】 默认小猫角色和白色背景。有两个列表,第一个列表“names”存储名字,第二个列表“heights”存储这组名字对应的身高,这些身高由互不相同的正整数组成。 请按身高由大到小排序,同时能够得到对应名字的列表“names”。 例如: 名字列表:names = …

变压器试验交流耐压

试验目的 交流耐压试验是鉴定电力设备绝缘强度最有效和最直接的方法。 电力设备在运行中&#xff0c; 绝缘长期受着电场、 温度和机械振动的作用会逐渐发生劣化&#xff0c; 其中包括整体劣化和部分劣化&#xff0c;形成缺陷&#xff0c; 例如由于局部地方电场比较集中或者局部…

unity 调用C++ dll 操作升级套娃函数调用

之前一直以为C生成dll&#xff0c;在unity中调用时要把传出去的值设置在主函数中&#xff0c;以参数或反回值的形式。 当然在DLL工程中可以说没有主函数&#xff0c;那个可以运行一个函数&#xff0c;其会调用其他函数从而一直调其他相关函数。 那问题是在层级是二或三------…

Android CoroutineScope Dispatchers.Main主线程delay,kotlin

Android CoroutineScope Dispatchers.Main主线程delay&#xff0c;kotlin import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.util.Log import android.view.View import android.view.View.OnClickListener import android.widget.Bu…

【sgWaterfall】Vue实现图文瀑布流布局模式,图片预加载显示占位区域阴影,加载完成后向上浮动动画出现,支持不同浏览器尺寸宽度下自适应显示列数

特性&#xff1a; 自动计算每个图片最佳坐标位置&#xff0c;以达到最新加在图片占据位置尽量让整体更加协调图片预加载显示占位区域阴影加载完成后向上浮动动画出现支持不同浏览器尺寸宽度下自适应显示列数 Vue实现图文瀑布流布局模式&#xff0c;图片预加载显示占位区域阴影&…

SQL语法与数据库快速入门(2)

目录&#xff1a; 多表简介SQL 约束-外键约束多表关系简介多表查询多表查询-内连接查询多表查询-外连接查询子查询简介子查询实战数据库进阶redis 内存数据库mongodb nosql 数据库neo4j 图数据库 1.多表简介 多表及使用场景介绍&#xff1a; 多表顾名思义就是在数据库设计中…

【NacosSync】注册中心同步组件使用教程ZooKeeper迁移到Nacos

目录 介绍系统模块架构获取安装包数据库配置启动服务器控制台添加注册中心集群信息添加同步任务注意事项 介绍 NacosSync是一个支持多种注册中心的同步组件,基于Spring boot开发框架,数据层采用Spring Data JPA,遵循了标准的JPA访问规范,支持多种数据源存储,默认使用Hibernate…

【论文阅读】《Distilling the Knowledge in a Neural Network》

【论文阅读】《Distilling the Knowledge in a Neural Network》 推荐指数&#xff1a; 1. 动机 &#xff08;1&#xff09;虽然一个ensemble的模型可以提升模型的效果&#xff0c;但是在效率方面实在难以接受&#xff0c;尤其是在每个模型都是一个大型的网络模型的时候。 &…

《TCP IP网络编程》第五章

第5章 基于 TCP 的服务端/客户端&#xff08;2&#xff09; 5.1 回声客户端的完美实现 先回顾一下服务器端的 I/O 相关代码&#xff1a; //持续接收客户端发送的数据&#xff0c;并将数据原样发送回客户端&#xff0c;直到客户端关闭连接。 while ((str_len read(clnt_sock,…

CMS垃圾收集器三色标记-JVM(十二)

上篇文章说了CMS垃圾收集器是赋值清除&#xff0c;所以他不可以碎片整理&#xff0c;于是jvm支持两个参数&#xff0c;几次fullGC之后碎片整理压缩空间。Cms他会抢占cpu资源&#xff0c;因为是并行运行&#xff0c;所以会有浮动垃圾。还有执行不确定性&#xff0c;垃圾收集完&a…

Python爬虫学习笔记(三)————urllib

目录 1.使用urllib来获取百度首页的源码 2.下载网页图片视频 3.总结-1 4.请求对象的定制&#xff08;解决第一种反爬&#xff09; 5.编解码 &#xff08;1&#xff09;get请求方式&#xff1a;urllib.parse.quote&#xff08;&#xff09; &#xff08;2&#xff09;get请求…

深度学习——RNN解决回归问题

详细代码与注释 import torch from torch import nn import numpy as np import matplotlib.pyplot as plt# 有利于复现代码 # torch.manual_seed(1) # reproducible# Hyper Parameters TIME_STEP 10 # rnn time step # 输入sin函数的y值&#xff0c;所以输入尺寸为1 INP…