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

news2024/11/29 18:47:04

测试平台目录
在这里插入图片描述
测试平台自建源码
后台核心代码

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}")

部分前端代码样例

<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>

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

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

相关文章

Rhinoceros(犀牛)使用技巧:有关曲线和曲面的分析

Rhinoceros&#xff08;犀牛&#xff09; for Mac破解版是一款功能强大的高级建模软件&#xff0c;可以创建、编辑、分析、提供、渲染、动画与转换 NURBS 线条、曲面、实体与多边形网格。不受精度、复杂、阶数或是尺寸的限制&#xff0c;在本篇文章中&#xff0c;为您介绍的是有…

AI与科学知识共生的桥梁,在未来AI会不会取代大学呢?

原创 | 文 BFT机器人 2023年&#xff0c;随着GPT在各行各业的爆发&#xff0c;“是否能将GPT用于科研场景”成为了一个水到渠成的问题。当ChatGPT超越大部分人类在高考、SAT、美国法考、医考等领域取得令人咋舌的高分后&#xff0c;人们对于GPT驱动科研的兴趣愈发高涨。截止本…

layui表格高度

layui表格的高度设置时使用 height:‘full’ 高度就是表格每个页面的总高度。也可以直接写数值&#xff0c;但是这是定高。 也可以使用 height&#xff1a;“full-数值”&#xff0c;比如 height:full-80 那么就会在表格占据剩余div的时候底部留100px。相当于margin-bottom:10…

【AI测试】python文字图像识别tesseract

[AI测试]python文字图像识别tesseract github官网&#xff1a;https://github.com/tesseract-ocr/tesseract python版本&#xff1a;https://github.com/madmaze/pytesseract OCR&#xff0c;即Optical Character Recognition&#xff0c;光学字符识别&#xff0c;是指通过扫…

骨传导耳机用久了伤耳朵吗?骨传导耳机有什么优势

骨传导耳机用久了不伤耳朵&#xff0c;相对于传统的入耳式耳机来说&#xff0c;对耳朵的压力和损伤较小。由于骨传导技术不直接通过耳道传递声音&#xff0c;而是通过振动将声音传送到内耳&#xff0c;因此相比其他类型的耳机&#xff0c;它在减少听力损伤的风险方面具有优势。…

3月面试华为被刷,准备半年,9月二战华为终于上岸,要个27K不过分吧?

终于二战上岸了&#xff0c;二战华为也并不是说非华为不可&#xff0c;只是觉得心里憋着一口气&#xff0c;这就导致我当时有其他比较好的offer&#xff0c;我也没有去&#xff0c;就是想上岸华为来证明自己,现在也算是如愿了&#xff0c;来跟大伙们分享一下~ 个人情况 我本人…

如何检查Windows 11笔记本电脑电池健康状况

如果你拥有一台运行微软最新操作系统的便携式电脑&#xff0c;那么检查Windows 11笔记本电脑的电池健康状况可能很重要。 电池寿命显然是一件大事&#xff0c;无论你是在最好的商务笔记本电脑上工作&#xff0c;还是在目前市场上最好的游戏笔记本电脑上享受马拉松式的Starfiel…

自然语言处理(七):来自Transformers的双向编码器表示(BERT)

来自Transformers的双向编码器表示&#xff08;BERT&#xff09; BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是一种预训练的自然语言处理模型&#xff0c;由Google于2018年提出。它是基于Transformer模型架构的深度双向&#xff0…

DOM 简介 | 深入了解DOM

目录 一、DOM是什么 二、DOM的访问 三、DOM节点类型 四、DOM的分级 今天我们将了解WEB编程中一个重要的概念DOM&#xff08;Document Object Model&#xff09;文档对象模型&#xff0c;它帮助我们使用JavaScript&#xff08;或其他编程语言&#xff09;操纵文档。 一、DO…

java IDEA文件路径分层级

如下图这样 在设置里找到Compact Middle Packages&#xff0c;去掉勾选就行了

MEMS传感器的原理与构造——单片式硅陀螺仪

一、前言 机械转子式陀螺仪在很长的一段时间内都是唯一的选项&#xff0c;也正是因为它的结构和原理&#xff0c;使其不再适用于现代小型、单体、集成式传感器的设计。常规的机械转子式陀螺仪包括平衡环、支撑轴承、电机和转子等部件&#xff0c;这些部件需要精密加工和…

如何建设一个安全运营中心(SOC)?

然信息安全管理问题主要是个从上而下的问题&#xff0c;不能指望通过某一种工具来解决&#xff0c;但良好的安全技术基础架构能有效的推动和保障信息安全管理。随着国内行业IT应用度和信息安全管理水平的不断提高&#xff0c;企业对于安全管理的配套设施如安全运营中心&#xf…

PMD 检查java代码:在条件语句中避免使用硬编码的字面量(AvoidLiteralsInIfCondition )

https://docs.pmd-code.org/pmd-doc-6.55.0/pmd_rules_java_errorprone.html#avoidliteralsinifcondition 在条件语句中&#xff0c;避免避免使用硬编码的字面量。可以将字面量声明为有描述意义的静态成员或者私有成员&#xff0c;提升可维护性。默认忽略"-1" 和&qu…

Spring IoC 的工作流程

概况 IOC 是什么 Bean 的声明方式 IOC 的工作流程 IOC 是什么 IOC 的全称是 Inversion Of Control, 也就是控制反转&#xff0c;它的核心思想是把对象的管理权限交给容器。 应用程序如果需要使用到某个对象实例&#xff0c;直接从 IOC 容器中去获取就行&#xff0c;这样设计的好…

CSP 202303-1 田地丈量

样例输入 4 10 10 0 0 5 5 5 -2 15 3 8 8 15 15 -2 10 3 15 样例输出 44 答题 首先写一个计算面积的函数&#xff0c;既然大小固定就省去了比较&#xff0c;然后是将在范围之外的矩阵给忽略掉&#xff0c;接下来将碰到的矩阵大小缩小为范围之内的&#xff0c;累加即可 #in…

剪辑App的MMKV应用优化实践

作者 | 我爱吃海米 导读 移动端开发中&#xff0c;IO密集问题在很多时候没有得到充足的重视和解决&#xff0c;贸然的把IO导致的卡顿放到异步线程&#xff0c;可能会导致真正的问题被掩盖&#xff0c;前人挖坑后人踩。其实首先要想的是&#xff0c;数据存储方式是否合理&#x…

阿里云服务器2核4G5M配置一年和五年价格明细表

阿里云2核4G服务器5M带宽可以选择轻量应用服务器或云服务器ECS&#xff0c;轻量2核4G4M带宽服务器297元一年&#xff0c;2核4G云服务器ECS可以选择计算型c7、c6或通用算力型u1实例等&#xff0c;买5年可以享受3折优惠&#xff0c;阿腾云分享阿里云服务器2核4G5M带宽五年费用表&…

数字城市:科技革命下的未来之城

随着科技的不断进步&#xff0c;数字城市已经成为了未来城市发展的关键趋势。数字城市是指利用先进的信息技术、互联网和大数据等工具&#xff0c;将城市各个方面进行数字化、智能化、互联化的发展模式。它不仅仅是一种技术&#xff0c;更是一种对城市管理、发展和居民生活方式…

基于Springcloud微服务框架 +VUE框架开发的智慧工地系统源码

建筑行业快速发展&#xff0c;各建筑工程的建设规模在不断扩大&#xff0c;各岗位工作人员的工作内容所涉及的方面也越来越广泛。随着信息技术水平不断提高,人工记录的方式已经不能够满足大项目的管理要求&#xff0c;就此&#xff0c;创造出一种新型的施工管理技术——智慧工地…

题①拷贝构造相关笔试题

问&#xff1a;此代码中有几次构造&#xff0c;几次拷贝构造&#xff1f; W f&#xff08;W u&#xff09; {W v(u);W w v;return w; } int main() {w x;w y f(x);return 0;解析&#xff1a;一次构造&#xff0c;四次拷贝构造。 再来一题 W f&#xff08;W u&#xff09;…