NetMock 简介:简化 Java、Android 和 Kotlin 多平台中的 HTTP 请求测试

news2024/11/14 18:07:24

NetMock 简介:简化 Java、Android 和 Kotlin 多平台中的 HTTP 请求测试

NetMock可让我们摆脱在测试环境中模拟请求和响应的复杂性。

NetMock是一个功能强大、用户友好的库,旨在简化模拟HTTP请求和响应的过程。

对开发者来说,测试HTTP请求经常会带来一些挑战,因为要在测试环境中模拟请求和响应的复杂性很高。这样就会增加手动测试的时间和精力投入。我自己曾经也遇到过使用其他HTTP库和繁琐的模拟工具时的困扰,于是决定引入一个极好的解决方案:NetMock

NetMock与Java、Android和Kotlin Multiplatform集成非常方便。只需要进行简单的设置,就可以轻松创建模拟,准确模仿客户端请求和真实终端点的响应。NetMock的一个关键优势是对模拟HTTP请求和响应采用了统一的方法。这在使用不同库的项目上或者考虑从一种库转换到另一种库时特别有用。

NetMock还有一个值得注意的特点,就是用户友好的设计。与其他许多HTTP模拟工具不同,NetMock更注重易用性。这个库提供了直观的界面和简单的设置过程,方便开发者更好地掌握HTTP库的知识。

不管您是资深开发者还是刚刚起步,NetMock都是简化工作流程、减少创建可靠软件所需的时间和精力的完美解决方案。

如果您想进一步了解NetMock,可以在GitHub上找到NetMock的代码库,网址是https://github.com/DenisBronx/NetMock

提升HTTP相关代码的测试策略

作为一名专业软件工程师,我坚信对于所有代码的全面单元测试非常重要。然而,我发现许多开发人员在网络层的单元测试方面存在一个常见问题,就是因为模拟和测试这个领域比较困难,所以他们往往忽视了该部分的单元测试。相反,他们更倾向于依赖端到端自动化测试或手动测试。

在多个项目中,我发现一种解决方法是将与HTTP相关的代码分离出来,以便能够独立测试系统的其他部分。虽然这种方法可以使代码库和测试类更加简洁,但也往往导致忽视对HTTP代码本身的测试,因为大家觉得这部分很难测试。然而,这样会导致与HTTP请求和JSON解析有关的关键逻辑没有得到充分验证。

这个问题在使用Retrofit库的项目中特别突出,该库通过接口抽象了与HTTP相关的逻辑。以下是一个代码片段的例子:

interface GitHubService {
    @GET("users/{user}/repos")
    suspend fun listRepos(@Path("user") user: String): List<RepoDto>
}

class GitHubRepositoryImpl(
    private val githubService: GitHubService,
    private val repoMapper: RepoMapper
): GitHubRepository {
    override suspend fun listRepos(user: String): List<Repo> {
        val repoDtos = githubService.listRepos(user)
        return repoMapper.map(repoDtos)
    }
}

虽然这种方法可以简化存储库和测试类,但它通常会忽略与HTTP相关的重要测试。此外,开发人员可能会为了简化存储库的单元测试而创造一些不必要的组件。

单元测试的目的是为了防止和发现开发人员犯的错误,并确保代码按照预期的功能运行。如果没有充分的测试,即使是一些简单的错误,比如将路径从users/{user}/repos改为user/{user}/repos,或者在RepoDto中修改一个字段的名称,都可能会被忽视掉。这在专业的项目中是不能接受的。

我并没有针对Retrofit库本身提出批评。

相反,我认为它是一款非常出色且易于理解的库。

此外,我也认识到将与HTTP相关的代码分离到独立的组件中对于组织和可维护性是很有价值的。

然而,我想着重指出我在很多项目中观察到的一个有缺陷的测试策略。这个策略往往没有充分关注对HTTP代码进行全面的测试,导致一些潜在问题被忽视掉。通过强调这个问题,我希望鼓励开发人员优先考虑对与HTTP相关的逻辑进行全面的测试,从而确保项目的整体质量和可靠性。

使用NetMock来Mocking请求与响应

@Test
fun `your test`() = runTest {
    val user = "some_user"
    netMock.addMock(
        request = {
            method = Method.Get
            requestUrl = "https://api.github.com/users/$user/repos"
        },
        response = {
            code = 200
            body = readFromResources("responses/repo_list.json")
        }
    )

    val result = sut.listRepos(user)

    //...
}

为了模拟请求和响应,您可以使用NetMock提供的简单API。

通过将模拟项添加到预期请求和响应的队列中,在测试期间可以拦截和控制HTTP交互的行为。

创建一个NetMock实例

NetMock提供了两种版本:netmock-servernetmock-engine

netmock-server版本适用于Java、Kotlin和Android,它不依赖于任何库。通过将网络请求重定向到本地Web服务器(MockWebServer),可以模拟网络请求。该版本非常适合在非多平台项目上工作的开发人员,他们希望在不需要设置独立服务器的情况下测试网络请求。

另一方面,netmock-engine版本专门为使用Ktor或Kotlin Multiplatform的开发人员设计。它使用MockEngine代替本地服务器,在使用Ktor的开发人员中具有轻量级和多平台的优势。

使用NetMockServer

要将netmock-server添加到项目中,请将以下内容添加到build.gradle文件的依赖项中:

dependencies {
    testImplementation "io.github.denisbronx.netmock:netmock-server:0.4.0"
}

接下来,按照以下方式创建一个NetMockServer实例:

@get:Rule
val netMock = NetMockServerRule()

NetMockServer启动了一个本地服务器,使用MockWebServer来拦截您的请求。NetMockServerRule处理了服务器的生命周期,在每个测试中自动启动和关闭它。

一旦服务器开始运行,您可以使用netmock.baseUrl配置您的代码,将其指向localhost的基本URL。以下是Retrofit和Ktor的示例:

使用localhostRetrofit示例:

@get:Rule
val netMock = NetMockServerRule()

private val service = Retrofit.Builder()
    .baseUrl(netMock.baseUrl)
    .build()
    .create(GitHubService::class.java)

使用localhostKtor示例:

@get:Rule
val netMock = NetMockServerRule()
    
private val client = HttpClient(OkHttp) {
    defaultRequest {
        url(netMock.baseUrl)
    }
}

或者,您可以通过使用netmock.interceptor来添加一个拦截器,该拦截器会自动将请求重定向到本地主机:

下面是一个使用真实URL的Retrofit示例:

@get:Rule
val netMock = NetMockServerRule()

private val service = Retrofit.Builder()
    .baseUrl("https://api.github.com/")
    .client(OkHttpClient.Builder().addInterceptor(netMock.interceptor).build())
    .build()
    .create(GitHubService::class.java)

下面是一个使用真实URL的Ktor示例:

@get:Rule
val netMock = NetMockServerRule()
    
private val client = HttpClient(OkHttp) {
    engine {
        addInterceptor(netMock.interceptor)
    }
}

建议使用拦截器,因为它可以让您处理真实和动态的URL。

不过要注意,您需要使用与OkHttp拦截器兼容的库,比如OkHttp本身、Retrofit或Ktor。

结论

除了初始化过程外,NetMock的两个版本基本相同。这意味着在netmock-servernetmock-engine之间切换时,只需要做一些小的修改。这种灵活性使您能够无需改动测试代码,顺利地在不同的库之间切换,比如从Retrofit切换到Ktor,或者反过来。

将测试框架与底层库解耦会增强您重构代码时的自信心。进行修改时,您只需修改生产代码,而测试代码保持不变。这种方法大大降低了在重构过程中产生意外副作用的风险,并确保您的测试准确反映了代码的行为。

总的来说,NetMock的灵活性使您能够轻松适应不同的库,并且方便地进行代码重构,从而增强代码的可靠性和可维护性。

最后,我要衷心感谢那些抽出时间阅读本文的读者们。我希望所提供的见解能够增进大家对于在网络层进行全面测试的重要性的理解。

再次感谢大家的关注,请在使用NetMock进行愉快测试时保持关注!

GitHub

https://github.com/square/okhttp/tree/master/mockwebserver
https://github.com/DenisBronx/NetMock

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

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

相关文章

稳定?国企也裁员!

大家好&#xff0c;我是爱搞事情的了不起&#xff01; 我所在的公司是一家央企下面的子公司&#xff0c;号称“国企”。 提起国企&#xff0c;好多人的印象中是855不加班&#xff0c;不裁员&#xff0c;真实情况是这样吗&#xff1f; 当国企领导 去年过年聚会&#xff0c;一个部…

《微服务架构设计模式》第二章 服务的拆分策略

内容总结自《微服务架构设计模式》 服务的拆分策略 一、架构是什么软件架构的41视图模型为什么重要分层架构风格 二、定义微服务如何定义服务拆分难点定义服务API 一、架构是什么 软件架构的定义&#xff1a;计算机系统的软件架构是构建这个系统所需要的一组结构&#xff0c;包…

内参:美联储下半年加息时间表和路径

* * * 原创&#xff1a;刘教链 * * * 星球会员请直接转到知识星球查看全文&#xff1b; 普通读者可以微信付费查看本篇全文&#xff0c;也欢迎加入星球。 加入星球&#xff0c;解锁全年365天内参全文阅读权限 &#xff08;年费制 折合仅1.6元/天&#xff09; 6.15教链内参&…

redis锁

一、redis锁的实现 加锁命令&#xff1a; SETNX key value&#xff1a; 当键不存在时&#xff0c;对键进行设置操作并返回成功1&#xff0c;否则返回失败0。 Key是锁的唯一标识&#xff0c;一般按业务来决定命名&#xff1b; Value 往往用来比较加锁的是哪一个线程或者哪一个…

Linux [工具]

工具 补充yumyum的位置yum的使用yum的本质 vimvim的多模式vim多个模式的细节命令模式底行模式 vim的配置 补充 Linux系统中文件名后缀没有直接的意义 但是不代表Linux上的软件不需要后缀, 比如gcc yum yum的位置 我们在手机或者Windows上, 一般都有一个东西 应用商店. 这个东…

简要介绍 | 单目深度估计

注1&#xff1a;本文系“简要介绍”系列之一&#xff0c;仅从概念上对单目深度估计进行非常简要的介绍&#xff0c;不适合用于深入和详细的了解。 注2&#xff1a;"简要介绍"系列的所有创作均使用了AIGC工具辅助 探索视觉世界的无限可能&#xff1a;单目深度估计介绍…

CANopen SDO下载

文章目录 CANopen SDO 下载SDO下载协议SDO下载启动协议SDO分段下载协议参考 CANopen SDO 下载 CANopen SDO下载分为快速&#xff08;expedited&#xff09;和正常&#xff08;normal&#xff09;两种&#xff0c;平时我们写对象字典基本都在用SDO快速下载&#xff08;适用于写…

网络安全竞赛——Windows服务漏洞扫描与利用

1.通过渗透机Kali Linux对靶机场景Windows 7进行系统服务及版本扫描渗透测试&#xff0c;并将该操作显示结果中3389端口对应的服务状态信息作为Flag值提交&#xff1b; 进入kali命令控制台中使用如下命令 Flag&#xff1a;open 2.在msfconsole中用search命令搜索 MS12020 RDP拒…

ETCD简介

为什么使用ETCD ETCD简介ETCD发展史ETCD架构etcd数据通道具体交互 ETCD使用场景概念词汇 ETCD简介 现代键值&#xff08;Key - Value&#xff09;存储系统&#xff0c;ZooKeeper是历史最悠久的项目&#xff0c;起源于Hadoop。这里ETCD与Zk对比。 ETCD相比与ZK&#xff0c;更加…

【力扣】3、无重复字符的最长子串

3、无重复字符的最长子串 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 //维护左指针&#xff0c;循环右指针 //new map是新建一个哈希表 var lengthOfLongeSubstring function (s){const map new Map();let l 0;let num 0;for(let i …

【微服务架构设计和实现】4.4 数据库和数据存储的分离和服务化

往期回顾&#xff1a; 第一章&#xff1a;【云原生概念和技术】 第二章&#xff1a;【容器化应用程序设计和开发】 第三章&#xff1a;【基于容器的部署、管理和扩展】 第四章&#xff1a;【4.1 微服务架构概述和设计原则】 第四章&#xff1a;【4.2 服务边界的定义和划分…

下载较老版本或最新版本的ARM Linux gcc 交叉编译工具链

前言 如果开发的 ARM 平台比较的多&#xff0c;需要多个版本的 arm gcc 交叉编译工具链&#xff0c;那么如何获取较新版本的 arm gcc 交叉编译工具链呢&#xff1f; 下载现成的 arm gcc 交叉编译工具链 速度较快的&#xff0c;也比较新的&#xff0c;就到 ARM 官方网站下载 …

突破 Python 爬虫的瓶颈:WebKit 在线模拟技术与环境搭建

部分数据来源:ChatGPT 引言 在使用 Python 进行爬虫开发的时候,很多情况下我们需要利用一些浏览器内核来模拟浏览器行为。而目前最为常用的两种浏览器内核是基于 WebKit 和基于 Chromium 的内核。那么在 Windows 10 操作系统中,我们可以使用 Anaconda 作为 Python 的发行版…

mysql的一些使用语句写法

记录一下&#xff0c;方便自己以后查看&#xff0c;以后会随时添加 1&#xff0c;查询重复数据 select project_id,house_location,count(*) from house_price group by house_location having count(house_location)>1; 2&#xff0c;删除重复的数据&#xff0c;并保留一条…

MySQL(六):基本的SELECT语句

基本的SELECT语句 前言一、SELECT...二、SELECT ... FROM三、列的别名四、去除重复行五、空值参与运算六、着重号七、查询常数八、显示表结构九、过滤数据 前言 本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识&#xff0c;有兴趣的小伙伴可以关注博主&#…

串口协议说明

文章目录 关系波特率概念波特率相对误差UART误差保证 协议常见的串行接口协议之间的比较USB 转串口PL2303USB 转串口CP2102USB转232终端电阻 串口电平TTL电平485电平 帧奇偶校验 关系 两个半双工&#xff0c;一发一收&#xff0c;就是Uart 在一根线的基础上&#xff0c;多加一…

【Git原理与使用】

&#x1f389;实战项目&#xff1a;Git原理与使用 博主主页&#xff1a;桑榆非晚ᴷ 博主能力有限&#xff0c;如果有出错的地方希望大家不吝赐教 给自己打气&#xff1a;成功没有快车道&#xff0c;幸福没有高速路。所有的成功&#xff0c;都来自不倦地努力和奔跑&#xff0c…

人机交互学习-10 评估的基础知识

评估的基础知识 背景评估目标和原则评估目标评估的优点评估的目标 评估原则 评估范型和技术“范型”与“技术”评估范型快速评估可用性测试实地研究预测性评估评估范型比较 评估技术评估范型和技术的关系 评估方法的选择区分评估技术的因素评估技术的分类评估方法组合 评估步骤…

CTFshow-pwn入门-Test_your_nc

pwn0 靶场环境启动开&#xff0c;显示ssh连接。 直接打开ctfshow的pwn专用虚拟机来使用ssh连接。密码是123456。 连接之后&#xff0c;他会出现这样的一大堆的介绍性文字&#xff0c;不用管他&#xff0c;然他输出完就行。 中间还用各种语言说了一下“消灭人类暴政&#xff…

Python+Qt桌面端与网页端人工客服沟通工具

程序示例精选 PythonQt桌面端与网页端人工客服沟通工具 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<PythonQt桌面端与网页端人工客服沟通工具>>编写代码&#xff0c;代码整洁…