代码级接口测试与单元测试的区别

news2024/12/23 8:13:59

关于接口测试

接口测试是一个比较宽泛的概念, 近几年在国内受到很多企业和测试从业者的追捧, 尤其是上层的UI在取悦用户的过程中迭代更新加快, UI自动化维护成本急剧上升的时代, 大家便转向了绕过前端的接口层面进行测试. 但是很多人, 对接口测试的理解并不完整, 事实上, 我们无论通过何种方式运行一段程序, 都必须调用该程序的接口才能实现.

比如, 我们通过登录页面输入账号和密码, 点击 登陆按钮, 最终该操作会被封装成一个HTTP请求, 发送给后台服务器, 后台服务器会直播调用登录接口, 来运行登陆的实际代码.

 

在这个过程, 点击"登录"按钮是一个前端界面, 如果通过该方法来观察其运行状态, 那么我们就称之为界面级的黑盒测试, 俗称"点点点". 我们也可以利用各种工具, 比如Fiddler, Postman, SoupUI, 甚至使用代码发送数据给后台服务器, 进而观察其运行结果的, 这些, 我们称之为协议级的接口测试. 这部分是大家经常提级的接口测试, 我就不再继续赘述了.

​现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】

当然, 我们还可以从代码层面来直播调用该登录接口, 那么 此时就称之为代码级的接口测试.

比如, 以下是一个简易的在线的计算器的源代码:

class Cal:
    def add(self, a, b):
        return a+b

    def minus(self, a, b):
        return a-b
    
    def mul(self, a, b):
        return a*b
    
    def div(self, a, b):
        return a/b

我们大概率是拿不到源代码的, 但是可以拿设计文档, 这几个方法所需要的参数, 以及类型都是可以拿到, 比如:

由于我们只是调用接口, 只是接口的层次已经更接近底层代码了, 但是依然看不到代码, 所以, 我们依然需要使用用例的设计方法去设计我们的传入参数, 对div这个方法进行演示:

  • 整数相除
  • 小数相除
  • 除数为0
  • 输入字符串
  • 输入特殊字符
  • 超长的数字
  • 被除数为空
  • 除数为空
  • .........

以上, 有没有发现, 像极了使用等价类对页面的输入框进入用例设计. 是的, 没错.

因此, 我们就可以直接调用这些方法, 使用设计好的数据对它进行测试. 以下是使用unittest框架对它进行的测试, 写两条除法的测试用例供演示使用:

import unittest

class TestCal(unittest.TestCase):
    def test_div01(self):
        cal = Cal()
        result = cal.div(15,3)
        self.assertEqual(result, 5)

    def test_div02(self):
        cal = Cal()
        result = cal.div(15,0)
        self.assertIn('分母不能为0',result)

if __name__ == '__main__':
    unittest.main()

以下是测试结果:

 

最后, 我们还可以深入到代码实现层, 对代码的实现逻辑进行详细的测试, 常用的方法有

  1. 语句覆盖
  2. 判定覆盖
  3. 条件覆盖

我们又称之为白盒测试单元测试

看到了吧, 这三种测试方法:

  1. 黑盒测试(从UI去)
  2. 协议级的接口测试(发送HTTP请求)
  3. 代码级的接口测试

以上方法的测试, 整个过程唯一的区别公在于我们调用该计算器的方式不一样, 最终真正工作的, 都是同样的一段代码, 这个本质是绝对不会因为被调用的方式不同而发生一丁点儿的变化. 所以, 任何一种调用的方式, 都在驱动程序运行而已, 本质上来说, 他们所做的事情没有任何区别.

因此, 正是因为接口测试的所谓接口, 是一个不太容易下定义的概念, 所以我们千万不能盲目地认为, 只有协议级的测试才是接口测试, 或者代码级的测试才是接口测试, 这些理解都太过绝对. 事实上, 通过页面上的操作, UI-User Interface, 用户界面, 直译用户接口, 这些页面的操作入口, 也是一个一个的接口啊. 所以, 请大家不要纠结于概念本身, 本文不是要去教大家如何抬杠, 而是明白, 我们的测试确实可以多样化, 可以更多地专注于从不同角度来完成对一个功能的测试, 进而达到更全面的测试覆盖, 尽早地找出Bug才是王道.

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

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

相关文章

Django 用户验证与权限管理详解

概要 Django是一款强大且灵活的Python Web框架,不仅在构建功能复杂的网站应用中表现出色,还在诸如用户验证、权限管理等细微之处提供了优秀的解决方案。在多用户、权限复杂的Web应用中,认证和权限管理尤其重要。接下来,我们就来探…

五、Linux基础软件安装

目录 1、安装JDK 2、安装Mysql 接下来,我们来学习如何在linux上安装JDK和Mysql,安装之前需要在Linux上提前创建三个目录: mkdir -p /export/software #软件包存放目录 mkdir -p /export/server #安装目录 mkdir -p /export/data #数据存放目录…

【Windows】解决Windows11错误0x80190001

1. 安装Fiddler网络调试工具 下载链接:Fiddler Classic 注:获取安装包的过程中可能要获取邮箱信息,但不用验证邮箱,大概是给你的邮箱发广告信息,问题不大。 在“开始”界面找到Fiddler Classic,点击运行…

封装flutter webview页面

例如在flutter里面跳转百度页面 需要安装webview_flutter webview_page.dart import package:flutter/material.dart; import package:webview_flutter/webview_flutter.dart;class MyWebView extends StatefulWidget {const MyWebView({super.key, required this.webViewUrl,…

入门Python+Vue 全栈开发可视化BI数据项目几个要点总结

随着数据的快速增长和业务的复杂性,越来越多的企业开始关注数据分析和可视化。在本文中,我们将介绍如何使用Python和Vue进行全栈开发,构建一个可视化BI数据项目,并总结几个关键要点。 首先,Python是一种强大而灵活的编…

【JAVA面向对象编程】--- 探索子类如何继承父类

🌈个人主页: Aileen_0v0🔥学习专栏: Java学习系列专栏 💫个人格言:"没有罗马,那就自己创造罗马~" 目录 继承 继承的普通成员方法调用 及 普通成员变量修改 构造方法的调用 子类构造方法 继承 package Inherit;class Animal …

企业软件的分类|app小程序网站定制开发

企业软件的分类|app小程序网站定制开发 企业软件是指为满足企业管理和运营需求而设计和开发的一类软件,它通常用于支持企业的各项业务活动和流程。根据其功能和应用领域的不同,可以将企业软件分为以下几类。 1. 企业资源计划(ERP&#xff09…

rest_framework_django 学习笔记二(视图路由)

rest_framework_django 学习笔记二(视图路由) rest_framwork_django学习笔记一(序列化器) 一、rest framework 中Request 与 Response 1、Request REST framework 传入视图的request对象不再是Django默认的HttpRequest对象,二是REST Fame…

git解决冲突

记录一次 git 解决冲突的过程。 情况是前一段时间我基于本地的 master 分支上新建了一个分支比如叫做 weight_linear: git checkout -b weight_linear 然后我已经在这个分支上进行了修改并上传到 github 上了,比如: git add . git commit -m "u…

uc_09_创建新进程 exec() system()

1 什么是创建新进程(夺舍) 在前面文章中,我们学习了fork()函数用来创建子进程。 子进程是父进程的副本,复制父进程除代码段以外的其他数据,代码段数据和父进程共享。 子进程的PID与父进程不同: 而创建新进程则不同。 与fork()不同…

传统算法: Pygame 实现深度优先搜索(DFS)

使用 Pygame 模块实现了深度优先搜索(DFS)的动画演示。首先,它通过邻接矩阵表示了一个图的结构,其中每个节点表示一个字符,每个字符的邻居表示与之相邻的节点。然后,通过深度优先搜索算法递归地访问所有节点,过程中通过动画效果可视化每一步的变化。每次访问一个节点,该…

数据爬虫(JSON格式)数据地图可视化(pyecharts)【步骤清晰,一看就懂】

一、前言 数据存储在网页上,需要爬取数据下来,数据存储格式是JSON,数据可视化在工作中也变得日益重要,接下来将数据爬虫与数据可视化结合起来,做个案例 注:当时数据是22年1月29日爬取数据 二、使用步骤 …

嵌入式数据传输及存储的C语言实现

各种类型的数据传输和存储就涉及到大小端的问题,首先要简单说下芯片的大小端问题,这里主要讨论Cortex-M内核。 M内核支持大端或者小端,实际应用中大部分内核都是小端。以STM32为例,全部都是小端,而且是芯片设计之初就固…

TR转发路由器测评—云企业网实现跨地域跨VPC的网络互通测评实战【阿里云产品测评】

文章目录 一.转发路由器 Transit Router 测评1.1 准备阶段1.2 本文测评收获1.3 什么是云企业网实例、转发路由器实例和云数据传输服务 二.使用云企业网实现跨地域跨VPC的网络互通2.2 **测试连通性**2.3 网络拓扑如下: 心得:总结: 声明&#x…

Vue+SpringBoot解决session跨域问题

做了一个前后端分离,因为前后端的 session id不一致,导致前端请求时,后端的session读取不到对应的值,造成登录问题。 解决方法: SpringBoot项目: 添加一个跨域配置 代码如下: 或者controller使用CrossOrigin Conf…

解决noauth authentication required异常

今天在使用redis数据库的时候,突然给报了个这个错误,上网一查才知道是因为 Redis 服务器需要密码进行身份验证,因此,我们需要通过auth password 进行身份验证。不过我这个密码还是试了很多次才想起来的,哦好像是听网课…

WSL2 docker GUI 界面

在 WSL2 docker 中运行GUI界面。 具体流程和远程显示Ubuntu界面类似,链接, 更简单一点, 少了 ssh 的部分。 安装好wsl2 和 docker wsl2 运行GUI程序,windows 会默认弹出窗口。 可以安装 gedit 测试一下 windows 下载并运行 Xlaunch. 运行 d…

【驱动】SPI驱动分析(二)-SPI驱动框架

SPI驱动框架 SPI驱动属于总线-设备-驱动模型的,与I2C总线设备驱动模型相比,大体框架是一样,他们都是实际的总线。总体框架如下图所示: 从上到下,分为三层,用户空间,内核空间,和硬件…

微信小程序真机调试的时候出现白屏解决办法

我使用uniapp开发微信小程序开发,使用真机调试的时候,出现白屏,页面里面啥都没有,也没有报错,这就让人很纳闷了: 解决办法: 打开真机调试,下面有:切换真机调试1.0&#…

RocketMQ-RocketMQ快速实战及集群原理

一、MQ简介 ​ MQ:MessageQueue,消息队列。是在互联网中使用非常广泛的一系列服务中间件。 这个词可以分两个部分来看,一是Message:消息。消息是在不同进程之间传递的数据。这些进程可以部署在同一台机器上,也可以分布…