接口测试平台188: 并发报告(4)

简介: 接口测试平台188: 并发报告(4)

好的,本节课我们要解决的就是 上节课我们拼好的json中的 各层级的result结果:


   先来看我们当前的数据:

{'result': '',
 'cases': [
       {'case_id': 21, 
       'case_name': '大用例1', 
       'result_case': '', 
       'steps': [
               {'step_id': 67, 
               'step_name': '调用A接口步骤', 
               'result_step': '', 
               'data': {
                     'request_data': '{"url": "http://127.0.0.1:8000/test_api_A", "method": "get", "api_body": "", "api_body_method": "none"}', 
                     'response': '{"errcode": "0"}', 
                     'assert_result': '{}'
                     }
                  }
                ]
       },
       {'case_id': 22,
        'case_name': '大用例2',
         'result_case': '', 
         'steps': [
                {'step_id': 68, 
                'step_name': '测试B接口步骤1', 
                'result_step': '', 
                'data': {
                    'request_data': '{"url": "http://127.0.0.1:8000/test_api_B", "method": "get", "api_body": "", "api_body_method": "none"}',
                     'response': '{"errcode": "0"}',
                      'assert_result': '{}'
                      }
                  }, 
                 {'step_id': 69, 
                 'step_name': '测试B接口步骤2',
                  'result_step': '', 
                  'data': {
                       'request_data': '{"url": "http://127.0.0.1:8000/test_api_B", "method": "get", "api_body": "", "api_body_method": "none"}', 
                       'response': '{"errcode": "0"}',
                        'assert_result': '{}'
                        }
                    }
                ]
            }
         ]
    }

我们先来思考下:


最外层的resutl 是由谁决定的?当然是内层的result_case

result_case又是由谁决定的呢?当然是自己内层的result_step

那么result_step 又是由谁决定的呢?当然是内部的assert_result。


所以我们的开发思路,必然是从内向外逐步进展。


那就要先考虑这个最内部的assert_result。

我们先回顾下 这个断言结果,我们存入数据库的时候代码是怎么写的?

image.png

上面代码可以看出,每个step的断言,都是一个字典,key为这个断言的设置文本本身。值为 真 / 假 (True/False)


而我们的最终结果,无论哪一级,都不会关心key,只会关心value是否存在False


所以我们的result_step 要怎么确定?

当然是遍历这个assert_result ,只要保证它内部没有False值,那么result_step就是True !


但是这个assert_result又是什么呢?原来它是tmp_assert_result的 json 字符串...


image.png


所以我们要遍历它的话,就只能先给它恢复成字典。


所以代码如下:

image.png

上图中,我们遍历了这个字典,判断内部是否有False , 只要发现一个False,我们就会给tmp_step["result_step"] 立即变成False, 并且终止循环,因为已经无需再测了。


如果一直到循环结束,都没有发现False, 那么就可以给tmp_step["result_step"]光荣的写成True了。


然后我们继续思考下一个问题。

如果这个s_report.assert_result 为空呢?也就是说这个接口步骤压根没有任何断言。


那么我们应该理所应当的,给tmp_step["result_step"] 写成True了。所以要在这个for 外面裹上一层判断if:

image.png

注意,这个if, 我并没有简单的写成 == ‘’  ,而是写成了 in [None,'',' ']

这样的好处是可以增加很大的容错性,因为我也害怕数据库因为某些意外存的并不是空字符串,而是None空型或者 其他纯空格什么的...  以后如果发现其他异常的参数,都可以写到这个列表中,更方便。


好,到这里我们搞定了这个step层级的result,然后继续往外搞result_case:


这里我们要思考下在哪里写这个判断代码,按理说应该是循环steps,判断其中的result_step是否有false, 来判断result_case的结果。


但是这样做显然需要额外一个for循环,会严重拖慢速度,那么有什么简单的方式呢?


当然有,而且很多。


比如,我们给result_case 一开始就默认设置成True ,然后如果发现result_step有False,则给result_case 再改成False不迟。 这样代码量会大大减少,而且没有额外增加循环:

image.png

其实这个道理 可以应用在任何层级上。就连我们刚刚写的result_step的值 也可以先变成True,然后查到一个assert_result[i] 为False 再改不迟。但是既然已经写完了,就算了。


我们继续往外写,最外层的结果:

res["result"]


这个的道理我们同样,可以给先变成True, :

image.png


改成这样后,我们就可以测试了:之前的大用例,虽然有俩个,但是很明显,我们没有给任何step加断言,所以结果一定是成功的。显示如下:

 'cases': [{'case_id': 21, 'case_name': '大用例1', 
            'result_case': True, 
            'steps': [{'step_id': 67, 'step_name': '调用A接口步骤',
             'result_step': True, 
             'data': {'request_data': '{"url": "http://127.0.0.1:8000/test_api_A", "method": "get", "api_body": "", "api_body_method": "none"}', 'response': '{"errcode": "0"}', 'assert_result': '{}'}}]}, 
           {'case_id': 22, 'case_name': '大用例2',
            'result_case': True, 
            'steps': [{'step_id': 68, 'step_name': '测试B接口步骤1',
             'result_step': True, 
             'data': {'request_data': '{"url": "http://127.0.0.1:8000/test_api_B", "method": "get", "api_body": "", "api_body_method": "none"}', 'response': '{"errcode": "0"}', 'assert_result': '{}'}},
              {'step_id': 69, 'step_name': '测试B接口步骤2',
               'result_step': True, 
               'data': {'request_data': '{"url": "http://127.0.0.1:8000/test_api_B", "method": "get", "api_body": "", "api_body_method": "none"}', 'response': '{"errcode": "0"}', 'assert_result': '{}'}}]}]}

看到了吧。不过我们现在要在第二个大用例的第二个步骤的断言中 手动写个False, 来测试一下:

image.png

测试结果 出现错误!!!

image.png


我们来看这段代码:

image.png


大家发现我挖的坑了么?

s_report.assert_result 只是个字符串json, 没法用[i]的方式拿到里面的值,而我们前面for中的 是用了json.loads() ,所以这里我们需要改成:

image.png


这样大家印象深刻了么?json只不过是个字符串哦~

那报错到底说的什么意思呢?说的是:

“字符串的下标必须是整形!”  

原来系统把我们[i] 当成是求下标了,其实我们是求字典的值哦,所以i 并不是整形而是某个字符串....


好了明白之后修复好我们再次测试:

image.png


这次就有了结果了,方便大家查看,我再次加几个回车展示给大家:

{'result': False, 
'cases': [
     {'case_id': 21, 'case_name': '大用例1', 
     'result_case': True, 
     'steps': [{'step_id': 67, 'step_name': '调用A接口步骤',
            'result_step': True, 'data': {'request_data': '{"url": "http://127.0.0.1:8000/test_api_A", "method": "get", "api_body": "", "api_body_method": "none"}', 'response': '{"errcode": "0"}', 'assert_result': '{}'}}]},
     {'case_id': 22, 'case_name': '大用例2', 
     'result_case': False, 
     'steps': [{'step_id': 68, 'step_name': '测试B接口步骤1',
               'result_step': True, 'data': {'request_data': '{"url": "http://127.0.0.1:8000/test_api_B", "method": "get", "api_body": "", "api_body_method": "none"}', 'response': '{"errcode": "0"}', 'assert_result': '{}'}},
                {'step_id': 69, 'step_name': '测试B接口步骤2', 
                'result_step': False, 'data': {'request_data': '{"url": "http://127.0.0.1:8000/test_api_B", "method": "get", "api_body": "", "api_body_method": "none"}', 'response': '{"errcode": "0"}', 'assert_result': '{"aaa":false}'}}]}]}

我们的预期,就是第二个用例的第二个步骤 出错,导致第二个用例也是错的,导致最终结果是错的。

但是第一个用例和内部的step都是无辜的,所以仍然保持True 。


好了,结果完美成功,本节课到此结束,欢迎关注下节课。

下节课我们就要开始写个前端报告页面了。来使用这套数据展示。


欢迎关注:测试开发干货

相关文章
|
6天前
|
JSON Java 测试技术
SpringCloud2023实战之接口服务测试工具SpringBootTest
SpringBootTest同时集成了JUnit Jupiter、AssertJ、Hamcrest测试辅助库,使得更容易编写但愿测试代码。
34 3
|
10天前
|
监控 安全 测试技术
构建高效的精准测试平台:设计与实现指南
在软件开发过程中,精准测试是确保产品质量和性能的关键环节。一个精准的测试平台能够自动化测试流程,提高测试效率,缩短测试周期,并提供准确的测试结果。本文将分享如何设计和实现一个精准测试平台,从需求分析到技术选型,再到具体的实现步骤。
45 1
|
28天前
|
人工智能 监控 测试技术
云应用开发平台测试
云应用开发平台测试
44 2
|
10天前
|
监控 安全 测试技术
构建高效精准测试平台:设计与实现全攻略
在软件开发过程中,精准测试是确保产品质量的关键环节。一个高效、精准的测试平台能够自动化测试流程,提高测试覆盖率,缩短测试周期。本文将分享如何设计和实现一个精准测试平台,从需求分析到技术选型,再到具体的实现步骤。
31 0
|
1月前
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
57 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
|
2月前
|
移动开发 JSON Java
Jmeter实现WebSocket协议的接口测试方法
WebSocket协议是HTML5的一种新协议,实现了浏览器与服务器之间的全双工通信。通过简单的握手动作,双方可直接传输数据。其优势包括极小的头部开销和服务器推送功能。使用JMeter进行WebSocket接口和性能测试时,需安装特定插件并配置相关参数,如服务器地址、端口号等,还可通过CSV文件实现参数化,以满足不同测试需求。
237 7
Jmeter实现WebSocket协议的接口测试方法
|
2月前
|
JSON 移动开发 监控
快速上手|HTTP 接口功能自动化测试
HTTP接口功能测试对于确保Web应用和H5应用的数据正确性至关重要。这类测试主要针对后台HTTP接口,通过构造不同参数输入值并获取JSON格式的输出结果来进行验证。HTTP协议基于TCP连接,包括请求与响应模式。请求由请求行、消息报头和请求正文组成,响应则包含状态行、消息报头及响应正文。常用的请求方法有GET、POST等,而响应状态码如2xx代表成功。测试过程使用Python语言和pycurl模块调用接口,并通过断言机制比对实际与预期结果,确保功能正确性。
247 3
快速上手|HTTP 接口功能自动化测试
|
1月前
|
JavaScript 前端开发 API
vue尚品汇商城项目-day02【9.Home组件拆分+10.postman测试接口】
vue尚品汇商城项目-day02【9.Home组件拆分+10.postman测试接口】
40 0
|
2月前
|
JavaScript 前端开发 测试技术
ChatGPT与接口测试
ChatGPT与接口测试,测试通过
48 5
|
3月前
|
网络协议 测试技术 网络安全
Python进行Socket接口测试的实现
在现代软件开发中,网络通信是不可或缺的一部分。无论是传输数据、获取信息还是实现实时通讯,都离不开可靠的网络连接和有效的数据交换机制。而在网络编程的基础中,Socket(套接字)技术扮演了重要角色。 Socket 允许计算机上的程序通过网络进行通信,它是网络通信的基础。Python 提供了强大且易于使用的 socket 模块,使开发者能够轻松地创建客户端和服务器应用,实现数据传输和交互。 本文将深入探讨如何利用 Python 编程语言来进行 Socket 接口测试。我们将从基础概念开始介绍,逐步引导大家掌握创建、测试和优化 socket 接口的关键技能。希望本文可以给大家的工作带来一些帮助~

热门文章

最新文章