技术干货!如何玩转Salesforce测试类 (Test Class)?

news/2024/4/25 11:30:58/文章来源:https://blog.csdn.net/ziyouxia666/article/details/129138576

测试类主要用于评估其他代码片段,确保一切正常且可靠地运行。这可以作为一种早期预警系统,提醒开发人员出现了错误或问题。

不同类型的程序化测试

测试类可以分为多种不同的类型,这改变了我们编写测试的方式及其预期结果。对于Apex测试类,通常分为以下三种:

单元测试

单元测试是最基本的测试。采用独立的方法,测试给定输出时是否返回特定的输出。如果没有,即测试失败。

集成测试

这种类型的测试验证了较小的代码单元可以很好地协同工作,没有任何异常行为。

功能测试

功能测试是一个更“真实”的测试,通常用于测试代码的业务逻辑,确保在真实场景中,代码按照预期工作。功能测试通常也被称为端到端测试

Salesforce代码覆盖率

Salesforce要求部署到生产环境的代码覆盖率至少达到75%。也就是说,如果一个method有4行代码,并且在测试中执行,它将为该method生成4行代码覆盖率或100%覆盖率。

在将Apex代码部署到生产环境时,Salesforce会考虑所有非测试代码和已执行测试覆盖的代码行的总和,如果低于75%,将阻止部署

可以完全依赖代码覆盖率吗?

代码覆盖率是衡量测试完整性的有效方法,但不是测试质量的唯一衡量标准。虽然达到最低75%的代码覆盖率要求是必须的,但并不能确保代码没有任何错误和问题,完全按预期运行。

不能完全依赖代码覆盖率的主要原因在于它的本质,它只衡量测试期间执行的代码行数,而不是测试的质量。例如,如果有一个包含10行代码的method,编写的测试只执行了其中的5行,那么将实现50%的代码覆盖率。这并没有考虑一段代码可能执行的不同场景。

另一个问题是代码覆盖率没有考虑到被测试代码的复杂性。一个只有几行简单代码的method可能很容易测试,并达到100%的代码覆盖率。但一个多行代码、更复杂的method更难进行充分测试,即使达到了相同的代码覆盖率,也可能会导致重要的逻辑部分测试不佳。

资深讲师带你玩转测试类

试听>> 

什么是优秀的测试?

要想做好测试,首先要充分理解代码的需求和功能,这样才能规划设计出全面、有针对性、可靠的测试。

全面

涵盖代码可能遇到的所有场景。这包括覆盖边缘情况,可能发生的意外和罕见情况。例如,如果有一个接受1到10之间数字的method,边缘情况测试将给出这个范围之外的数字。

有针对性

涵盖代码的特定功能或方面。这通常是将复杂的代码片段分解成更小的method,这些method将执行非常具体的功能,并测试这些单独的功能是否按预期工作。

可靠

首先,不管测试是在何时何地,由何人运行,都应该始终产生相同的结果。其次,外部因素的变化不应影响测试。这包括对组织中其他代码片段或其他自定义项的依赖。此外,随着系统的发展,更新和更改测试应该很容易。

模拟(Mocking)和存根(Stubs)

开发人员可以通过设计利用依赖注入的代码来进一步增强测试。这样代码的外部依赖,也就是其他类中的代码项,在测试执行期间可以用它的模拟实例替换,我们称之为存根。当在依赖项上调用method时,将调用存根,从而允许我们跳过执行依赖项代码,并返回该测试的已知结果。让我们来看看整个过程。

初级开发动手实操

了解详情>> 

首先,我们需要创建将在其他类中使用的代码,这可以是简单的数据库访问对象、控制DML和查询,也可以更复杂的诸如服务类、作为与外部系统集成的入口点。

在此示例中,需要为依赖项编写所有功能方法作为实例方法。这将使我们能够在测试运行期间模拟这些方法。此外,还需要为其他类创建一种方法来访问实例,无论它是否已被模拟。为此可以使用类似于Singleton的东西,它有一个getInstance方法。但由于Stub API的限制,必须保留公共构造函数。

接下来,需要修改consuming 类以使用getInstance方法。这是一个非常简单的更改,如果我们不需要使用多个函数,可以链接方法,如果想要多次访问它,可以将它赋给一个变量。

现在,我们可以开始构建存根。在最简单的形式中,只需要实现StubProvider接口及其handleMethodCall方法。

在下面的示例中,我们还向存根类添加了一个静态setStub方法,这可以初始化存根并将其分配给原始类的实例变量。这提供了一种简单易用的测试方法,可以为该变量分配一个存根实例,意味着当它们调用getInstance方法时,会得到这个存根。

最后,就是要实际编写测试。在下面的示例中,我们需要做的就是在DependencyStub类上调用setStub方法结果,我们的测试现在利用存根,在测试运行期间完全绕过了依赖项。下面的两种测试方法都可以通过,我们可以从存根中获得不同的值。

本篇文章是一个非常基础的示例,说明了如何使用存根类并将其轻松切换。存根的内容实际上取决于context上下文,但某些场景可以比其他场景从存根和模拟中获益更多。例如,集成是规划模拟可以带来巨大好处的主要示例,它可以轻松地将业务逻辑与集成层分离。

在一些更复杂的场景中,创建自定义存根比使用通用存根更有优势。上面的模式也只是一种允许类被模拟的简单方法,更好的方法是利用依赖注入,而不是将依赖类实例传递到consumer类构造函数中。

作者:自由侠部落

文章地址:技术干货!如何玩转Salesforce测试类 (Test Class)?

本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接

如果文章的内容对你有帮助,欢迎点赞~

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

R语言实现可理解的随机森林模型(Random Forest)——iml包

Random Forest 解释模型1. 介绍2. 理解随机森林运行机理2.1导入需要的包2.2 构建随机森林模型2.3 RF特征重要性:2.4 特征对预测结果的影响2.5 交互作用2.6 替代模型(Decision tree surrogate model)2.71. 介绍 机器学习模型通常可以很好地进…

儿童袖套上架美国亚马逊CPC认证

袖套,也称套袖。是戴在袖管外的套子,旨在保护衣服的袖管。通常戴时松垂于另外一只衣袖外面的袖子。美国CPC认证简介:CPC认证是Children’s Product Certificate的英文简称,CPC证书就类似于国内的质检报告,在通过相关检…

内网渗透(四十五)之横向移动篇-WinRM远程执行命令横向移动

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

PrivateLoader PPI服务发现RisePro恶意软件窃取分发信息

称为PrivateLoader的按安装付费(PPI)软件下载器服务正用于恶意软件RisePro的信息窃取。Flashpoint 于 2022 年 12月13日发现了新的窃取者,此前发现了在名为Russian Market的非法网络犯罪市场上使用该恶意软件泄露的“几组日志”。RisePro是一…

IDEA高效插件和设置

安装好Intellij idea之后,进行如下的初始化操作,工作效率提升十倍。 一. 安装插件 1. Codota 代码智能提示插件 只要打出首字母就能联想出一整条语句,这也太智能了,还显示了每条语句使用频率。 原因是它学习了我的项目代码&…

墨菲安全参与信息通信软件供应链安全社区成员大会并获自主研发创新成果奖

2023年2月16日,首届ICT软件供应链安全治理论坛暨信息通信软件供应链安全社区第二届成员大会在北京成功举办,多位业界顶级专家与工业和信息化部网络安全管理局相关领导出席,为现场观众分享了关于软件供应链可持续性与安全治理行业的前瞻与思考…

Apache Shiro与Spring Security对比

Apache Shiro VS Spring Security 1.Spring Security 官方文档:https://spring.io/projects/spring-security#overview介绍: Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spr…

CAS底层原理及ABA问题

一、案例CAS是Java中Unsafe类里面的一个方法,它的全称是叫CompareAndSwap比较并交换的一个意思,它的主要功能是能够去保证在多线程的环境下对于共享变量修改的一个原子性。例如,比如说像这样一个场景,有一个成员变量state&#xf…

【分享】订阅卖家云集简云连接器同步销售出库数据至卖家云系统

方案场景 在企业进行数字化转型过程中,数据割裂是企业面临的最大困难,钉钉作为现企业流行的常用办公系统,与第三方ERP系统之间存在着数据割裂的现象,例如,钉钉与卖家云系统,企业员工原来的办公方式是在钉钉…

Vue基础14之TodoList组件自定义事件、全局事件总线、TodoList全局事件总线

Vue基础14TodoList-组件自定义事件先改Header和Footer子组件,List先不考虑App.vueMyHeader.vueMyFooter.vue全局事件总线实现思路正规写法main.jsApp.vueStudent.vueSchool.vue总结:全局事件总线(GlobalEventBus)TodoList案例&…

修复 K8s SSL/TLS 漏洞(CVE-2016-2183)指南

作者:老 Z,中电信数智科技有限公司山东分公司运维架构师,云原生爱好者,目前专注于云原生运维,云原生领域技术栈涉及 Kubernetes、KubeSphere、DevOps、OpenStack、Ansible 等。 前言 测试服务器配置 主机名IPCPU内存系…

5.10 BGP属性-MED

5.4.4配置BGP MED属性控制选路 1. 实验目的 熟悉BGP MED属性控制选路的应用场景掌握BGP MED属性控制选路的配置方法2. 实验拓扑 实验拓扑如图5-10所示: 图5-10:配置BGP MED属性控制选路 3. 实验步骤 (1) 网络连通性 R1…

QMap 判断是否value是否已经存在,结合Sleep函数测试

网上查了资料,基本说的都是通过.value判断是否已经之前的key值,但是尝试.了一下发现有.key的函数,对比着来就感觉这个函数是用来判断是否已经存在value值,于是开始百度也几乎没有找到相关资料,只好自己看官方文档&…

【高速电路01】高速电路入门知识

1.什么是高速电路? 一般情况下,我们在讨论电路的特性时,一个基本的常识,是认为一条导线上各处的电压(或者说信号)在同一时刻是相等的。 以上结论在低速电路时是没问题的,但是,实际…

R语言、MaxEnt模型融合技术的物种分布模拟、参数优化方法、结果分析制图与论文写作

基于R语言、MaxEnt模型融合技术的物种分布模拟、参数优化方法、结果分析制图与论文写作技术应用第一章、理论篇以问题导入的方式,深入掌握原理基础什么是MaxEnt模型?MaxEnt模型的原理是什么?有哪些用途?MaxEnt运行需要哪些输入文件…

【异常】记一次因注解@RestController没加(@RestController不会用),导致无法调用Controller层的方法

一、背景 我想要调用一个Controller,定义的内容如下 RequestMapping("/demo") public class demoController {GetMapping("/doSomething")public JSONObject doSomething() {JSONObject json new JSONObject();json.set("title", …

界面控件DevExpress WPF Pivot Grid——拥有强大多维数据分析能力!

界面控件DevExpress WPF的Pivot Grid组件是一个类似excel的数据透视表,用于多维数据分析和跨选项卡报表生成。它拥有众多的布局自定义选项,允许开发者完全控制其UI且以用户为中心的功能使其易于部署。PS:DevExpress WPF拥有120个控件和库&…

双因素方差分析全流程

上篇文章讲述了“单因素方差分析全流程总结”,单因素方差分析只是考虑了一个自变量(定类)与一个因变量(定量)之间的关系,但是在实际问题研究中可能研究两个或者几个因素与因变量之间的关系,例如…

核心技术: springboot 启动类加载时方法执行的几种实现方式, bean声明周期, 启动执行顺序

目录 1. 业务场景 -> 1.1 初始化操作 -> 1.2 业务操作 -> 1.3优势 2. 实现方式(多种方式,不同思想) -> 2.1 定时调度任务(常用四种方式 task ) --> 2.1.1 Timer(单线程) --> 2.1.2 scheduledExecutorService(多线程并发执行,线程池) --> 2.1…

linux部署zookeeper

linux部署zookeeper 1、单机部署zk ZooKeeper服务器是用Java创建的,它需要在JVM上运行,所以需要使用JDK1.6及以上版本,一般都是jdk1.8。 选择自己安装本地的jdk,而不是centos自带的openjdk。 查看本地安装的jdk: j…