接口测试平台代码实现56:首页重构-4

简介: 本节继续开发首页右侧的显示效果,可能有的同学觉得这里节奏太慢了,不怕,咱养肥再看。

其实原因是,因为这是完全重新开发的一套平台,虽然简易,但是作者完全没有对着以前的成熟平台代码,所以难度还是有的。

   先打开我们的home.html,继续在右边做那个快速请求的调试版, 大家想,这个功能需要一大堆的输入框按钮,而且因为是在屏幕右侧,我们直接写的话,肯定会被安排到左侧请求记录的下方。所以我们一开始就要弄一个大div,把它的位置写死,飘起来,脱离文档流,固定在右侧。然后这一大堆输入框按钮 就放在这个div中就好了,最简单好理解的布局。

   我们先写出这个巨大的div

微信图片_20220624120904.png

它距离左边是固定的380px,宽度是浏览器总长度-390px。

   然后我们在里面添加那一套接口请求的东东,我们直接去P_aps.html中复制过来,然后进行修改即可。当然读者可以直接复制我这里修改过的代码,至于都要改什么,我们想,比如这个调试层是常显而不是之前点击具体接口才显示。

   显示后不需要显示什么show函数了,因为一直保持空内容即可。关于其中项目 接口 名字 id这些都不需要了。什么公共请求头项目公共变量这些 项目纬度的更不要了,也没有什么关闭/保存按钮和对应函数了 ,整个颜色大小也要重新设置等等 等等。

微信图片_20220624120928.png

<div style="position: absolute;top: 100px;left: 380px;width: -webkit-calc(100% - 390px);">
    {# 调试弹层及函数 #}
        <ul class="nav navbar-nav" style="width: 98%">
            <li>
                <select id="ts_method" style="height: 40px;" class="form-control">
                    <option value="none"> 请求方式</option>
                    <option value="post" > POST</option>
                    <option value="get" > GET</option>
                    <option value="put" > PUT</option>
                    <option value="delete"> DELETE</option>
                </select>
            </li>
            <li style="width: -webkit-calc(100% - 225px)">
                <input id="ts_url" style="color: black;padding-left: 10px;width: 100%;height: 40px;" type="text" placeholder='url: 如 /abcd/efgh/' value="">
            </li>
            <li >
                <button onclick="ts_send()" type="button"
                        style="height: 40px;width: 120px;"
                        class="btn btn-default"><span style="font-size: large">Send</span></button>
            </li>
        </ul>
        <br><br><br>
        <ul class="nav navbar-nav" style="width: 98%">
            <li style=" width: -webkit-calc(100% - 63px)">
                 <input id="ts_host"  style="color: black;padding-left: 10px;width: 100%;height: 40px;" type="text" placeholder='host: 如http(s)://xxxx.ccc.com' value="">
            </li>
             <li >
                <button type="button"
                        style="height: 40px;width: 60px;"
                        class="btn btn-default"><span>Clear</span></button>
            </li>
        </ul>
        <br><br><br>
        <ul class="nav navbar-nav" style="width: 98%">
            <li style="width:  -webkit-calc(100% - 63px)">
                 <input id="ts_header"  style="color: black;padding-left: 10px;width: 100%;height: 40px;" type="text"
                       placeholder='header请求头:如{"Content":"application/json"}' value="">
            </li>
             <li >
                <button type="button"
                        style="height: 40px;width: 60px;"
                        class="btn btn-default"><span>Clear</span></button>
            </li>
        </ul>
        <br><br><br>
        <ul id="myTab" class="nav nav-tabs" >
            <li class="active"><a id="click_none" href="#none" data-toggle="tab" >none</a></li>
            <li ><a href="#form-data" data-toggle="tab" >form-data</a></li>
            <li ><a href="#x-www-form-urlencoded" data-toggle="tab" >x-www-form-urlencoded</a></li>
            <li class="dropdown">
                <a href="#" class="dropdown-toggle" data-toggle="dropdown">raw <b class="caret"></b></a>
                <ul class="dropdown-menu" role="menu" aria-labelledby="myTabDrop1">
                    <li><a href="#Text" tabindex="-1" data-toggle="tab">Text</a></li>
                    <li><a href="#JavaScript" tabindex="-1" data-toggle="tab">JavaScript</a></li>
                    <li><a href="#Json" tabindex="-1" data-toggle="tab">Json</a></li>
                    <li><a href="#Html" tabindex="-1" data-toggle="tab">Html</a></li>
                    <li><a href="#Xml" tabindex="-1" data-toggle="tab">Xml</a></li>
                </ul>
            </li>
            <li ><a href="#response" data-toggle="tab" >返回体</a></li>
        </ul>
        <div id="myTabContent" class="tab-content">
            <div class="tab-pane fade in active" id="none" style="text-align: center;color: grey">
                <h3>这个请求将不会携带任何请求体</h3>
                <h5>This request will not carry any request-body</h5>
            </div>
            <div class="tab-pane fade" id="form-data">
                <div class="table-responsive" style="width: 98%;color: black">
                    <table class="table table-bordered table-striped" id="mytable" style="background-color:white">
                        <thead style="color: #337ab7;font-size: x-small">
                          <tr>
                            <td style="width: 30%">Key</td>
                            <td style="width: 50%">Value</td>
                          </tr>
                        </thead>
                        <tbody id="mytbody">
                          <tr>
                            <td></td>
                            <td></td>
                          </tr>
                        </tbody>
                    </table>
                </div>
                <button class="btn btn-default" id="add"><i class="fa fa-plus"></i> 添加新参数</button>
                <script>window.jQuery || document.write('<script src="/static/201801271505/js/jquery-1.11.0.min.js"><\/script>')</script>
                <script type="text/javascript" src="/static/201801271505/js/bootstable.js"></script>
            </div>
            <div class="tab-pane fade" id="x-www-form-urlencoded">
                <div class="table-responsive" style="width: 98%;color: black">
                    <table class="table table-bordered table-striped" id="mytable2" style="background-color:white">
                        <thead style="color: #337ab7;font-size: x-small">
                          <tr>
                            <td style="width: 30%">Key</td>
                            <td style="width: 50%">Value</td>
                          </tr>
                        </thead>
                        <tbody id="mytbody2">
                          <tr>
                            <td></td>
                            <td></td>
                          </tr>
                        </tbody>
                    </table>
                </div>
                <button class="btn btn-default" id="add2"><i class="fa fa-plus"></i> 添加新参数</button>
                <script>window.jQuery || document.write('<script src="/static/201801271505/js/jquery-1.11.0.min.js"><\/script>')</script>
                <script type="text/javascript" src="/static/201801271505/js/bootstable.js"></script>
            </div>
            <div class="tab-pane fade" id="Text">
                <textarea name="" id="raw_Text" style="color: black;width: 98%;height: 300px"></textarea>
            </div>
            <div class="tab-pane fade" id="JavaScript">
                <textarea name="" id="raw_JavaScript" style="color: black;width: 98%;height: 300px"></textarea>
            </div>
            <div class="tab-pane fade" id="Json">
                <textarea name="" id="raw_Json" style="color: black;width: 98%;height: 300px"></textarea>
            </div>
            <div class="tab-pane fade" id="Html">
                <textarea name="" id="raw_Html" style="color: black;width: 98%;height: 300px"></textarea>
            </div>
            <div class="tab-pane fade" id="Xml">
                <textarea name="" id="raw_Xml" style="color: black;width: 98%;height: 300px"></textarea>
            </div>
            <div class="tab-pane fade" id="response">
                <textarea name="" id="ts_response_body" disabled="disabled" style="background-color: #e4f3f5;color: black;width: 98%;height: 300px"></textarea>
            </div>
        </div>
        <br>
</div>

大家看看效果:微信图片_20220624121101.png

前端的html我们已经复制过来了,至于需不需要再改什么,之后我们再研究。当务之急,我们需要把send函数,和控制这个form-data / x-www-form-urlencoded的 js函数都给弄过来。

微信图片_20220624121131.png

现在我们复制过来后,就要对这个ts_send()函数进行修改了。我们需要去掉比如获取接口名字id这些代码,而且请求的接口我们也不能沿用旧的了,需要重新创造一条链路。修改后的ts_send()如下:

function ts_send() {
            // 获取接口的所有数据
            var ts_method = document.getElementById('ts_method').value ;
            var ts_url = document.getElementById('ts_url').value ;
            var ts_host = document.getElementById('ts_host').value ;
            var ts_header = document.getElementById('ts_header').value ;
             // 判断顶部的数据是否填充完
            if(ts_method == 'none'){alert('请选择请求方式!');return}
            if(ts_url == ''){alert('请输入url!');return}
            if(ts_host == ''){alert('请输入host!');return}
             //判断关键数据是否符合规则
            if(ts_host.slice(0,7) != 'http://' && ts_host.slice(0,8) != 'https://'){
                alert('host必须以http://或https://开头!');return
            }
            if(ts_header != ''){
                try {
                    JSON.parse(ts_header)
                }catch (e) {
                    alert('header请求头不符合json规范!');
                    return
                }
            }
            var ts_body_method = $('ul#myTab li[class="active"]')[0].innerText;
            if(ts_body_method == 'none'){
                var ts_api_body = ''
            }
            if(ts_body_method == 'form-data'){
                var ts_api_body = []; //新建这个空列表用来存放后续的数据
                var tbody_ = $("table#mytable tbody")[0]; //获取该表格的内容部分
                var trlist = tbody_.children ; //获取下面所有tr,每个tr就是一个键值对实际上
                for(var i=0;i<trlist.length;i++) {
                    var tdarr = trlist[i].children; // 获取tr下的俩个td
                    var key = tdarr[0].innerText; // 获取key
                    var value = tdarr[1].innerText; // 获取value
                    ts_api_body.push([key, value]);// 作为一个数组,存放到这个大数组里。
                }
                ts_api_body = JSON.stringify(ts_api_body);
            }
            if(ts_body_method == 'x-www-form-urlencoded'){
                var ts_api_body = []; //新建这个空列表用来存放后续的数据
                var tbody_ = $("table#mytable2 tbody")[0]; //获取该表格的内容部分
                var trlist = tbody_.children ; //获取下面所有tr,每个tr就是一个键值对实际上
                for(var i=0;i<trlist.length;i++) {
                    var tdarr = trlist[i].children; // 获取tr下的俩个td
                    var key = tdarr[0].innerText; // 获取key
                    var value = tdarr[1].innerText; // 获取value
                    ts_api_body.push([key, value]);// 作为一个数组,存放到这个大数组里。
                }
                ts_api_body = JSON.stringify(ts_api_body);
            }
            if(ts_body_method == 'Text'){
                var ts_api_body = document.getElementById('raw_Text').value;
            }
            if(ts_body_method == 'JavaScript'){
                var ts_api_body = document.getElementById('raw_JavaScript').value;
            }
            if(ts_body_method == 'Json'){
                var ts_api_body = document.getElementById('raw_Json').value;
            }
            if(ts_body_method == 'Html'){
                var ts_api_body = document.getElementById('raw_Html').value;
            }
            if(ts_body_method == 'Xml'){
                var ts_api_body = document.getElementById('raw_Xml').value;
            }
            // 发送请求给后台
             $.get('/Api_send_home/',{
                'ts_method':ts_method,
                'ts_url':ts_url,
                'ts_host':ts_host,
                'ts_header':ts_header,
                'ts_body_method':ts_body_method,
                'ts_api_body':ts_api_body
            },function (ret) {
                $("li a[href=#response]").click(); //点击一下返回体按钮
                document.getElementById('ts_response_body').value = ret ;//把返回值显示到返回值多行文本框中
            })
        }

目前整理成这样,不过不保证后续是不是需要修改。注意我把$.get()的url后面加了个_home,来表示这个请求是首页发出去的,并不是项目管理中接口库发出的。

我们现在要去urls.py中写好映射:

微信图片_20220624121221.png

然后去views.py中 写好这个Api_send_home函数,内容大部分都是复制Api_send,我们删掉了接口idname,和最后一次请求体的设计,一来是简化代码,二来是营造一种体验差异化。告诉使用者,要想获得完整体验就去进入项目管理创建接口吧。

代码如下,直接复制即可:

# 首页发送请求
def Api_send_home(request):
    # 提取所有数据
    print('qwe')
    ts_method = request.GET['ts_method']
    ts_url = request.GET['ts_url']
    ts_host = request.GET['ts_host']
    ts_header = request.GET['ts_header']
    ts_body_method = request.GET['ts_body_method']
    ts_api_body = request.GET['ts_api_body']
    # 发送请求获取返回值
    try:
        header = json.loads(ts_header) #处理header
    except:
        return HttpResponse('请求头不符合json格式!')
    # 拼接完整url
    if ts_host[-1] == '/' and ts_url[0] =='/': #都有/
        url = ts_host[:-1] + ts_url
    elif ts_host[-1] != '/' and ts_url[0] !='/': #都没有/
        url = ts_host+ '/' + ts_url
    else: #肯定有一个有/
        url = ts_host + ts_url
    try:
        if ts_body_method == 'none':
            response = requests.request(ts_method.upper(), url, headers=header, data={} )
        elif ts_body_method == 'form-data':
            files = []
            payload = {}
            for i in eval(ts_api_body):
                payload[i[0]] = i[1]
            response = requests.request(ts_method.upper(), url, headers=header, data=payload, files=files )
        elif ts_body_method == 'x-www-form-urlencoded':
            header['Content-Type'] = 'application/x-www-form-urlencoded'
            payload = {}
            for i in eval(ts_api_body):
                payload[i[0]] = i[1]
            response = requests.request(ts_method.upper(), url, headers=header, data=payload )
        else: #这时肯定是raw的五个子选项:
            if ts_body_method == 'Text':
                header['Content-Type'] = 'text/plain'
            if ts_body_method == 'JavaScript':
                header['Content-Type'] = 'text/plain'
            if ts_body_method == 'Json':
                header['Content-Type'] = 'text/plain'
            if ts_body_method == 'Html':
                header['Content-Type'] = 'text/plain'
            if ts_body_method == 'Xml':
                header['Content-Type'] = 'text/plain'
            response = requests.request(ts_method.upper(), url, headers=header, data=ts_api_body.encode('utf-8'))
        # 把返回值传递给前端页面
        response.encoding = "utf-8"
        return HttpResponse(response.text)
    except Exception as e:
        return HttpResponse(str(e))

好了,写完之后,我们重启服务,刷新页面,填几个数据,试一下:

微信图片_20220624121344.png

看来是打通了,没有引起后台/页面 报错即可。


本节课到这就为止了,下节课我们要让左侧的请求记录和右侧的请求模块 联动起来!

相关文章
|
1月前
|
数据采集 机器学习/深度学习 大数据
行为检测代码(一):超详细介绍C3D架构训练+测试步骤
这篇文章详细介绍了C3D架构在行为检测领域的应用,包括训练和测试步骤,使用UCF101数据集进行演示。
36 1
行为检测代码(一):超详细介绍C3D架构训练+测试步骤
|
1月前
|
机器学习/深度学习 人工智能 监控
提升软件质量的关键路径:高效测试策略与实践在软件开发的宇宙中,每一行代码都如同星辰般璀璨,而将这些星辰编织成星系的过程,则依赖于严谨而高效的测试策略。本文将引领读者探索软件测试的奥秘,揭示如何通过精心设计的测试方案,不仅提升软件的性能与稳定性,还能加速产品上市的步伐,最终实现质量与效率的双重飞跃。
在软件工程的浩瀚星海中,测试不仅是发现缺陷的放大镜,更是保障软件质量的坚固防线。本文旨在探讨一种高效且创新的软件测试策略框架,它融合了传统方法的精髓与现代技术的突破,旨在为软件开发团队提供一套系统化、可执行性强的测试指引。我们将从测试规划的起点出发,沿着测试设计、执行、反馈再到持续优化的轨迹,逐步展开论述。每一步都强调实用性与前瞻性相结合,确保测试活动能够紧跟软件开发的步伐,及时适应变化,有效应对各种挑战。
|
4天前
|
JSON Java 测试技术
SpringCloud2023实战之接口服务测试工具SpringBootTest
SpringBootTest同时集成了JUnit Jupiter、AssertJ、Hamcrest测试辅助库,使得更容易编写但愿测试代码。
29 3
|
8天前
|
监控 安全 测试技术
构建高效的精准测试平台:设计与实现指南
在软件开发过程中,精准测试是确保产品质量和性能的关键环节。一个精准的测试平台能够自动化测试流程,提高测试效率,缩短测试周期,并提供准确的测试结果。本文将分享如何设计和实现一个精准测试平台,从需求分析到技术选型,再到具体的实现步骤。
40 1
|
1月前
|
测试技术
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
本文介绍了如何使用Pytest和Allure生成自动化测试报告。通过安装allure-pytest和配置环境,可以生成包含用例描述、步骤、等级等详细信息的美观报告。文章还提供了代码示例和运行指南,以及重构项目时的注意事项。
149 1
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
|
26天前
|
人工智能 监控 测试技术
云应用开发平台测试
云应用开发平台测试
42 2
|
8天前
|
监控 安全 测试技术
构建高效精准测试平台:设计与实现全攻略
在软件开发过程中,精准测试是确保产品质量的关键环节。一个高效、精准的测试平台能够自动化测试流程,提高测试覆盖率,缩短测试周期。本文将分享如何设计和实现一个精准测试平台,从需求分析到技术选型,再到具体的实现步骤。
29 0
|
1月前
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
56 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
|
2月前
|
移动开发 JSON Java
Jmeter实现WebSocket协议的接口测试方法
WebSocket协议是HTML5的一种新协议,实现了浏览器与服务器之间的全双工通信。通过简单的握手动作,双方可直接传输数据。其优势包括极小的头部开销和服务器推送功能。使用JMeter进行WebSocket接口和性能测试时,需安装特定插件并配置相关参数,如服务器地址、端口号等,还可通过CSV文件实现参数化,以满足不同测试需求。
230 7
Jmeter实现WebSocket协议的接口测试方法
|
2月前
|
JSON 移动开发 监控
快速上手|HTTP 接口功能自动化测试
HTTP接口功能测试对于确保Web应用和H5应用的数据正确性至关重要。这类测试主要针对后台HTTP接口,通过构造不同参数输入值并获取JSON格式的输出结果来进行验证。HTTP协议基于TCP连接,包括请求与响应模式。请求由请求行、消息报头和请求正文组成,响应则包含状态行、消息报头及响应正文。常用的请求方法有GET、POST等,而响应状态码如2xx代表成功。测试过程使用Python语言和pycurl模块调用接口,并通过断言机制比对实际与预期结果,确保功能正确性。
242 3
快速上手|HTTP 接口功能自动化测试

热门文章

最新文章