接口自动化测试系列-接入测试平台

这篇具有很好参考价值的文章主要介绍了接口自动化测试系列-接入测试平台。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

测试平台目录
接口自动化测试系列-接入测试平台,接口自动化测试系列,python,测试平台,接口自动化
测试平台自建源码
后台核心代码

def add_api(kwags):
    """插入api数据"""
    try:
        join_info = CaseApi(name=kwags.get("name"), httpType=kwags.get("httpType"),
                            headers=kwags.get("headers") if kwags.get("headers") else '{}',
                            requestType=kwags.get("requestType"), apiAddress=kwags.get("apiAddress"),
                            requestParameterType=kwags.get("requestParameterType"),
                            project_id=filter_project(project_name=kwags.get("project"))[0].get("id"),
                            params=kwags.get("body") if kwags.get("body") else '{}',
                            create_time=kwags.get("create_time"), responseData='{}',
                            create_user=kwags.get("create_user"), update_time=kwags.get("update_time"),
                            update_user=kwags.get("update_user"))
        session.add(join_info)
        session.commit()
        return {"msg": "新增接口成功"}
    except Exception as e:
        logger.error(f"新增接口时失败:{e}")
        return {"msg": f"新增接口失败:{e}"}


def filter_api(kwags):
    """查询api列表数据"""
    try:
        logger.info("开始查询api列表")
        result = []
        # 获取页数
        page = kwags.get('page') if kwags.get('page') else 1
        # 获取条数
        limit = kwags.get('limit') if kwags.get('limit') else 20
        # 排序
        name = kwags.get('name')
        data_header = "session.query(CaseApi).filter_by"
        data_filter = '(name=name)' if name else '()'
        data_sort = f".order_by(CaseApi.id.asc()).all()" if kwags.get(
            'sort') == '+id' else f".order_by(CaseApi.id.desc()).all()"
        data = data_header + data_filter + data_sort
        data = eval(data)[(page - 1) * limit:limit]
        for i in data:
            case_item = i.to_json()
            case_item["project"] = filter_project(i.to_json()["project"])[0].get("project_name")
            result.append(case_item)
        return result
    except Exception as e:
        logger.error(f"查询api列表失败:{e}")

部分前端代码样例文章来源地址https://www.toymoban.com/news/detail-695777.html

<template>
  <div class="app-container">
    <div class="filter-container">
      <el-row class="filter-row">
        <div class="filter-col">
          <el-col span="5">
            <label class="radio-label" style="font-style: normal;font-weight: normal">测试用例名称 </label>
            <el-input v-model="listQuery.name" style="width: 200px;" class="filter-item" clearable @keyup.enter.native="handleFilter" />
          </el-col>
          <el-col span="2">
            <el-button v-waves class="filter-item" type="primary" icon="el-icon-search" @click="handleFilter">
              Search
            </el-button>
          </el-col>
          <el-col span="2">
            <el-button v-waves class="filter-item" type="primary" icon="el-icon-circle-plus-outline" @click="add_case">
              新增用例
            </el-button>
          </el-col>
        </div>
      </el-row>
    </div>

    <el-table
      :key="tableKey"
      :data="list"
      :header-cell-style="getRowClass"
      border
      fit
      highlight-current-row
      style="width: 100%;margin-top:30px"
      @sort-change="sortChange"
    >
      <el-table-column type="expand">
        <template slot-scope="props">
          <el-form label-position="left" inline class="table-expand">
            <el-form-item label="请求类型:">
              <span>{{ props.row.httpType }}</span>
            </el-form-item>
            <el-form-item label="接口地址:">
              <span>{{ props.row.apiAddress }}</span>
            </el-form-item>
            <el-form-item label="传参类型:">
              <span>{{ props.row.requestParameterType }}</span>
            </el-form-item>
            <el-form-item label="请求header:">
              <span>{{ props.row.headers }}</span>
            </el-form-item>
            <el-form-item label="参数:">
              <span>{{ props.row.body }}</span>
            </el-form-item>
            <el-form-item label="响应code:">
              <span>{{ props.row.httpCode }}</span>
            </el-form-item>
            <el-form-item label="响应data:">
              <span>{{ props.row.responseData }}</span>
            </el-form-item>
          </el-form></template></el-table-column>
      <el-table-column label="ID" prop="id" sortable="custom" align="center" width="100" :class-name="getSortClass('id')">
        <template slot-scope="{row}">
          <span>{{ row.id }}</span>
        </template>
      </el-table-column>
      <el-table-column label="测试用例名称" width="300px" align="center">
        <template slot-scope="{row}">
          <span>{{ row.name }}</span>
          <i class="el-icon-document-copy" style="margin-left:10%" @click="copyValue(row.name)" />
        </template>
      </el-table-column>
      <el-table-column label="请求方式" width="110px" align="center">
        <template slot-scope="{row}">
          <span>{{ row.requestType }}</span>
        </template>
      </el-table-column>
      <el-table-column label="所属项目" width="300px" align="center">
        <template slot-scope="{row}">
          <span>{{ row.project }}</span>
        </template>
      </el-table-column>
      <el-table-column label="创建人" width="280px" align="center">
        <template slot-scope="{row}">
          <span>{{ row.create_user }}</span>
        </template>
      </el-table-column>
      <el-table-column label="响应" width="280px" align="center">
        <template slot-scope="{row}">
          <el-popover
            placement="top-start"
            width="300"
            trigger="hover"
            :disabled="row.responseData.length <= 80"
          >
            <span>{{ row.responseData }}</span>
            <span v-if="row.responseData.length <= 80" slot="reference">{{ row.responseData }}</span>
            <span v-if="row.responseData.length > 80" slot="reference">{{ row.responseData.substr(0, 80) + "..." }}</span>
          </el-popover>
        </template>
      </el-table-column>
      <el-table-column label="操作" width="280px" align="center" fixed="right">
        <template slot-scope="scope">
          <el-button type="success" size="small" icon="el-icon-video-play" :loading="loadingstatus" @click="runCase(scope.$index, scope.row)">运行</el-button>
          <el-button type="primary" size="small" @click="formEditDialog(scope.$index, scope.row)">编辑</el-button>
          <el-dialog :visible.sync="dialogFormVisible" :modal-append-to-body="false">
            <span slot="title" :model="editForm" style="font-weight:bold;">编辑用例:{{ editForm.id }}_{{ editForm.name }}</span>
            <el-form class="form" label-width="auto" :model="editForm" :rules="rules">
              <el-form-item label="用例名称:" prop="name" :rules="rules.name">
                <el-input v-model="editForm.name" />
              </el-form-item>
              <el-row>
                <el-col span="6">
                  <el-form-item label="http类型:">
                    <el-select v-model="editForm.httpType" placeholder="请选择http类型">
                      <el-option label="http" value="http" />
                      <el-option label="https" value="https" />
                    </el-select>
                  </el-form-item>
                </el-col>
                <el-col span="6">
                  <el-form-item label="请求方法:">
                    <el-select v-model="editForm.requestType" placeholder="请选择请求方法">
                      <el-option label="get" value="get" />
                      <el-option label="post" value="post" />
                      <el-option label="put" value="put" />
                      <el-option label="delete" value="delete" />
                    </el-select>
                  </el-form-item>
                </el-col>
                <el-col span="6">
                  <el-form-item label="参数类型:">
                    <el-select v-model="editForm.requestParameterType" placeholder="请选择参数类型">
                      <el-option label="data" value="data" />
                      <el-option label="json" value="json" />
                    </el-select>
                  </el-form-item>
                </el-col>
                <el-col span="6">
                  <el-form-item label="项目名:">
                    <el-select v-model="editForm.project" placeholder="项目名">
                      <el-option
                        v-for="item in options"
                        :key="item.id"
                        :label="item.project_name"
                        :value="item.id"
                      /></el-select>
                  </el-form-item>
                </el-col>
              </el-row>
              <el-form-item label="接口地址:" prop="apiAddress" :rules="rules.apiAddress">
                <el-input v-model="editForm.apiAddress" />
              </el-form-item>
              <el-form-item label="请求header:">
                <el-input v-model="editForm.headers" type="textarea" :rows="5" autocomplete="off" />
              </el-form-item>
              <el-form-item label="参数:">
                <el-input v-model="editForm.body" type="textarea" :rows="5" autocomplete="off" />
              </el-form-item></el-form>
            <div slot="footer" class="dialog-footer">
              <el-button @click="dialogFormVisible = false">取 消</el-button>
              <el-button type="primary" @click="formEditOn">确 定</el-button>
            </div>
          </el-dialog>
          <el-dialog :visible.sync="dialogFormVisibleAdd" :modal-append-to-body="false">
            <span slot="title" :model="addForm" style="font-weight:bold;">新增用例:</span>
            <el-form class="form" label-width="auto" :label-position="left" :model="addForm" :rules="rules">
              <el-form-item label="用例名称:" prop="name" :rules="rules.name">
                <el-input v-model="addForm.name" />
              </el-form-item>
              <el-row>
                <el-col span="6">
                  <el-form-item label="http类型:">
                    <el-select v-model="addForm.httpType" placeholder="请选择http类型">
                      <el-option label="http" value="http" />
                      <el-option label="https" value="https" />
                    </el-select>
                  </el-form-item>
                </el-col>
                <el-col span="6">
                  <el-form-item label="请求方法:">
                    <el-select v-model="addForm.requestType" placeholder="请选择请求方法">
                      <el-option label="get" value="get" />
                      <el-option label="post" value="post" />
                      <el-option label="put" value="put" />
                      <el-option label="delete" value="delete" />
                    </el-select>
                  </el-form-item>
                </el-col>
                <el-col span="6">
                  <el-form-item label="参数类型:">
                    <el-select v-model="addForm.requestParameterType" placeholder="请选择参数类型">
                      <el-option label="data" value="data" />
                      <el-option label="json" value="json" />
                    </el-select>
                  </el-form-item>
                </el-col>
                <el-col span="6">
                  <el-form-item label="项目名:">
                    <el-select v-model="editForm.project" placeholder="项目名">
                      <el-option
                        v-for="item in options"
                        :key="item.id"
                        :label="item.project_name"
                        :value="item.id"
                      /></el-select>
                  </el-form-item>
                </el-col>
              </el-row>
              <el-form-item label="接口地址:" prop="apiAddress" :rules="rules.apiAddress">
                <el-input v-model="addForm.apiAddress" />
              </el-form-item>
              <el-form-item label="请求header:" label-width="auto">
                <el-input v-model="editForm.headers" type="textarea" :rows="5" autocomplete="off" />
              </el-form-item>
              <el-form-item label="参数:">
                <el-input v-model="addForm.body" type="textarea" :rows="5" autocomplete="off" />
              </el-form-item></el-form>
            <div slot="footer" class="dialog-footer">
              <el-button @click="dialogFormVisibleAdd = false">取 消</el-button>
              <el-button type="primary" @click="formAdd">确 定</el-button>
            </div>
          </el-dialog>
        </template>
      </el-table-column>
    </el-table>
    <pagination v-show="total>0" :total="total" :page.sync="listQuery.page" :limit.sync="listQuery.limit" @pagination="getList" />
  </div>
</template>
<script>
import Pagination from '@/components/Pagination'
import axios from 'axios'
import { platformBaseUrl } from '@/api/baseHost'
export default {
  components: { Pagination },
  data() {
    return {
      // formInline: {
      //   caseName: ''
      // },
      dialogFormVisible: false,
      dialogFormVisibleAdd: false,
      // formLabelWidth: '120px',
      tableKey: 0,
      list: [],
      total: 0,
      loadingstatus: false,
      listLoading: true,
      id: '',
      params: {},
      options: [{ 'id': 1, 'project_name': 'WGP-SRVbak' }, { 'id': 2, 'project_name': 'WGP-ADMINbak' }],
      rules: {
        name: [{ required: true, message: '用例名称不能为空', tigger: 'change' }],
        apiAddress: [{ required: true, message: '接口地址不能为空', tigger: 'change' }]
      },
      addForm: {
        name: '',
        httpType: 'http',
        requestType: 'get',
        requestParameterType: 'data',
        project: 'WGP-SRV',
        apiAddress: '',
        body: '',
        headers: ''
      },
      editForm: {
        id: undefined,
        name: '',
        httpType: '',
        requestType: '',
        requestParameterType: '',
        project: '',
        apiAddress: '',
        body: '',
        headers: ''
      },
      listQuery: {
        page: 1,
        limit: 10,
        name: '',
        sort: '+id'
      },
      sortOptions: [{ label: 'ID Ascending', key: '+id' }, { label: 'ID Descending', key: '-id' }]
    }
  },
  created() {
    console.log('created')
    this.getProject()
    this.getList()
  },
  methods: {
    getList() {
      this.listLoading = true
      axios.post(platformBaseUrl + '/filter_Api/', this.listQuery)
        .then(response => {
          console.log(response.data)
          this.list = response.data.result.items
          this.total = response.data.result.total
        })
      setTimeout(() => {
        this.listLoading = false
      }, 1.5 * 1000)
    },
    getProject() {
      axios.post(platformBaseUrl + '/filter_Project/', {})
        .then(response => {
          console.log(response.data)
          this.options = response.data.result
        })
      setTimeout(() => {
        this.listLoading = false
      }, 1.5 * 1000)
    },
    copyValue(value) {
      console.log('cope 121212')
      const oInput = document.createElement('input') // 创建一个input标签
      oInput.setAttribute('value', value) // 设置改input的value值
      document.body.appendChild(oInput) //input添加到body
      oInput.select() // 获取input的文本内容
      document.execCommand('copy') // 执行copy指令
      document.body.removeChild(oInput) // 删除input标签
      this.$message({ message: '复制成功', type: 'success' })
    },

    handleFilter() {
      this.listQuery.page = 1
      this.getList()
    },
    formEditDialog(index, row) {
      this.dialogFormVisible = true
      this.id = index
      this.editForm = Object.assign({}, row)
      console.log(this.editForm)
    },
    runCase(index, row) {
      this.params = Object.assign({}, row)['id']
      // this.params = Object.assign({}, row)
      if ((this.params !== '')) {
        axios.post(platformBaseUrl + '/run_case/', this.params)
          .then(response => {
            console.log(response.data)
            this.dialogFormVisible = false
            // eslint-disable-next-line eqeqeq
            if (response.data.result.msg == '更新成功') {
              this.$message({ message: response.data.result.msg, type: 'success' })
              this.getList()
            } else {
              this.$message({ message: response.data.result.msg, type: 'error' })
            }
          })
        setTimeout(() => {
          this.listLoading = false
        }, 1.5 * 1000)
      }
    },
    formEditOn() {
      if ((this.editForm.name !== '' && this.editForm.apiAddress !== '')) {
        axios.post(platformBaseUrl + '/edit_Api/', this.editForm)
          .then(response => {
            console.log(response.data)
            this.dialogFormVisible = false
            // eslint-disable-next-line eqeqeq
            if (response.data.result.msg == '更新成功') {
              this.$message({ message: response.data.result.msg, type: 'success' })
              this.getList()
            } else {
              this.$message({ message: response.data.result.msg, type: 'error' })
            }
          })
        setTimeout(() => {
          this.listLoading = false
        }, 1.5 * 1000)
      }
    },
    add_case() {
      this.dialogFormVisibleAdd = true
    },
    formAdd() {
      if ((this.addForm.name !== '' && this.addForm.apiAddress !== '')) {
        this.dialogFormVisibleAdd = false
        axios.post(platformBaseUrl + '/add_Api/', this.addForm)
          .then(response => {
            console.log(response.data)
            if (response.data.result.msg === '新增接口成功') {
              this.$message({ message: response.data.result.msg, type: 'success' })
              this.getList()
            } else {
              this.$message({ message: response.data.result.msg, type: 'error' })
            }
          })
        setTimeout(() => {
          this.listLoading = false
        }, 1.5 * 1000)
      }
    },
    sortChange(data) {
      const { prop, order } = data
      if (prop === 'id') {
        this.sortByID(order)
      }
    },
    getRowClass({ row, column, rowIndex, columnIndex }) {
      if (rowIndex === 0) {
        return 'background:#C0C0C0;color:#666666;text-align:center;font-size:14px;font-weight:500;width: 100%'
      } else {
        return 'white-space: pre-line'
      }
    },
    sortByID(order) {
      if (order === 'ascending') {
        this.listQuery.sort = '+id'
      } else {
        this.listQuery.sort = '-id'
      }
      this.handleFilter()
    },
    getSortClass: function(key) {
      const sort = this.listQuery.sort
      return sort === `+${key}` ? 'ascending' : 'descending'
    }
  }
}
</script>

<style scoped>
.app-container{
  background: #f3f0f0;
  /* position: fixed; */
    width: 100%;
    height: 100%;
}
.filter-container{
background: #fdfdfd;
    width: 100%;
    height: 100px;
}
.filter-col{
  margin:30px 50px 10px 50px;
}
.table-expand {
    font-size: 0;
    border: 2px solid #078359;
  }
  .table-expand label {
    width: 90px;
    color: #99a9bf;
  }
  .table-expand .el-form-item {
    margin-right: 0;
    margin-bottom: 0;
    width: 50%;
  }
  .form{
    margin:0px 0px 10px 0px;
    width: 100%;

  border: 2px solid #078359;
    margin-bottom: 0;
  }
</style>

到了这里,关于接口自动化测试系列-接入测试平台的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【HttpRunnerManager】搭建接口自动化测试平台操作流程

    一、需要准备的知识点 1. linux: 安装 python3、nginx 安装和配置、mysql 安装和配置 2. python: django 配置、uwsgi 配置 二、我搭建的环境 1. Centos7 (配置 rabbitmq、mysql 、Supervisord) 2. python 3.6.8 (配置 django、uwsgi) 3. git 1.8.3.1 (克隆代码) 三、搭建过程 1. 配置数据库(安装 mysql ,自

    2024年02月10日
    浏览(71)
  • 接口自动化测试系列-yml管理测试用例

    项目源码 整体目录结构,目录说明参考 测试用例结构类似httprunner写法,可参考demo 主要核心函数 用例读取转换json 测试用例格式处理函数

    2024年02月09日
    浏览(44)
  • 接口自动化测试系列-excel管理测试用例

    代码源码: 框架结构 excel用例demo excel数据处理 requests请求封装 检查点函数 数据处理工厂 发送邮件函数

    2024年02月10日
    浏览(47)
  • react+unittest+flask 接口自动化测试平台

    目录 1 前言 2 框架 2-1 框架简介 2-2 框架介绍 2-3 框架结构 3 平台 3-1 平台组件图 1 新建用例 2 生成测试任务 3 执行并查看测试报告

    2024年02月17日
    浏览(49)
  • Apifox-比postman更优秀的接口自动化测试平台

    Apifox  是 API 文档、API 调试、API Mock、API 自动化测试一体化协作平台,定位  Postman + Swagger + Mock + JMeter 。通过一套系统、一份数据,解决多个系统之间的数据同步问题。只要定义好 API 文档,API 调试、API 数据 Mock、API 自动化测试就可以直接使用,无需再次定义;API 文档和

    2024年02月03日
    浏览(51)
  • 【jmeter+ant+jenkins】之搭建 接口自动化测试平台

           (1). 录制jmeter脚本   (2). 将jmeter的安装目录下的G:jmeterapache-jmeter-5.1.1extras中,将 ”ant-jmeter-1.1.1.jar”文件放到 ant的lib目录下   (3). 配置jmeter的xml配置文件,并放在ant目录的bin目录下,使用ant编译验证jmeter的build文件 build.xml文件 命令:Ant -buildfile build_jmeter.xml (

    2024年02月09日
    浏览(52)
  • Apifox(1)比postman更优秀的接口自动化测试平台

    Apifox  是 API 文档、API 调试、API Mock、API 自动化测试一体化协作平台,定位  Postman + Swagger + Mock + JMeter 。通过一套系统、一份数据,解决多个系统之间的数据同步问题。只要定义好 API 文档,API 调试、API 数据 Mock、API 自动化测试就可以直接使用,无需再次定义;API 文档和

    2024年02月09日
    浏览(46)
  • 基于 python 的接口自动化测试,让你轻松掌握接口自动化

    目录 目录 一、简介                ​编辑二、引言 三、环境准备 四、测试接口准备 接口信息 五、编写接口测试 六、优化 封装接口调用   本文从一个简单的登录接口测试入手,一步步调整优化接口调用姿势; 然后简单讨论了一下接口测试框架的要点; 最后介绍了一下

    2023年04月19日
    浏览(74)
  • 自动化测试平台(三):用户token验证及用户增删改查接口开发

    上一篇我们实现了用户登录的验证并返回token。那如何去校验请求的token是否有效呢?这篇内容为你讲解token的验证及用户管理(增删改查)的功能。 完整教程地址:《从0搭建自动化测试平台》 项目在线演示地址:http://121.43.43.59/ (帐号:admin 密码:123456)

    2024年02月03日
    浏览(74)
  • python自动化接口测试

    前几天,同组姐妹说想要对接口那些异常值进行测试,能否有自动化测试的方法。仔细想了一下,工具还挺多,大概分析了一下: 1、soapui:可以对接口参数进行异常值参数化,可以加断言,一般我们会加httpcode是否200的较验,或者返回值json里是否有success标识等 2、LR:脚本容

    2024年02月22日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包