职场经验、为什么程序员一定要写单元测试?

这篇具有很好参考价值的文章主要介绍了职场经验、为什么程序员一定要写单元测试?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

职场经验、为什么程序员一定要写单元测试?,自动化测试,软件测试,职场日常,单元测试,log4j,测试工具,程序员,自动化测试,软件测试,python

2024软件测试面试刷题,这个小程序(永久刷题),靠它快速找到工作了!(刷题APP的天花板)_软件测试刷题小程序-CSDN博客文章浏览阅读2.5k次,点赞85次,收藏11次。你知不知道有这么一个软件测试面试的刷题小程序。里面包含了面试常问的软件测试基础题,web自动化测试、app自动化测试、接口测试、性能测试、自动化测试、安全测试及一些常问到的人力资源题目。最主要的是他还收集了像阿里、华为这样的大厂面试真题,还有互动交流板块……_软件测试刷题小程序https://blog.csdn.net/AI_Green/article/details/134931243?spm=1001.2014.3001.5502很多初学编程的同学都会认为 “程序员的工作只有开发新功能,功能做完了就完事儿”。但其实不然,保证程序的正常运行、提高程序的稳定性和质量也是程序员的核心工作。

之前给大家分享过企业项目的完整开发流程,其中有一个关键步骤叫 “单元测试”,这篇文章就来聊聊程序员如何编写单元测试吧。

什么是单元测试?

单元测试(Unit Testing,简称 UT)是软件测试的一种,通常由开发者编写测试代码并运行。相比于其他的测试类型(比如系统测试、验收测试),它关注的是软件的 最小 可测试单元。

什么意思呢?

假如我们要实现用户注册功能,可能包含很多个子步骤,比如:

  1. 校验用户输入是否合法
  2. 校验用户是否已注册
  3. 向数据库中添加新用户

其中,每个子步骤可能都是一个小方法。如果我们要保证用户注册功能的正确可用,那么就不能只测试注册成功的情况,而是要尽量将每个子步骤都覆盖到,分别针对每个小方法做测试。比如输入各种不同的账号密码组合来验证 “校验用户输入是否合法” 这一步骤在成功和失败时的表现是否符合预期。

同理,如果我们要开发一个很复杂的系统,可能包含很多小功能,每个小功能都是一个单独的类,我们也需要针对每个类编写单元测试。因为只有保证每个小功能都是正确的,整个复杂的系统才能正确运行。

单元测试的几个核心要点是:

  1. 最小化测试范围:单元测试通常只测试代码的一个非常小的部分,以确保测试的简单和准确。
  2. 自动化:单元测试应该是自动化的,开发人员可以随时运行它们来验证代码的正确性,特别是在修改代码后。而不是每次都需要人工去检查。
  3. 快速执行:每个单元测试的执行时间不能过长,应该尽量做到轻量、有利于频繁执行。
  4. 独立性:每个单元测试应该独立于其他测试,不依赖于外部系统或状态,以确保测试的可靠性和可重复性。

为什么需要单元测试?

通过编写和运行单元测试,开发者能够快速验证代码的各个部分是否按照预期工作,有利于保证系统功能的正确可用,这是单元测试的核心作用。

此外,单元测试还有很多好处,比如:

1)改进代码:编写单元测试的过程中,开发者能够再次审视业务流程和功能的实现,更容易发现一些代码上的问题。比如将复杂的模块进一步拆解为可测试的单元。

2)利于重构:如果已经编写了一套可自动执行的单元测试代码,那么每次修改代码或重构后,只需要再自动执行一遍单元测试,就知道修改是否正确了,能够大幅提高效率和项目稳定性。

3)文档沉淀:编写详细的单元测试本身也可以作为一种文档,说明代码的预期行为。

鱼皮以自己的一个实际开发工作来举例单元测试的重要性。我曾经编写过一个 SQL 语法解析模块,需要将 10000 多条链式调用的语法转换成标准的 SQL 语句。但由于细节很多,每次改进算法后,我都不能保证转换 100% 正确,总会人工发现那么几个错误。所以我编写了一个单元测试来自动验证解析是否正确,每次改完代码后执行一次,就知道解析是否完全成功了。大幅提高效率。

所以无论是后端还是前端程序员,都建议把编写单元测试当做一种习惯,真的能够有效提升自己的编码质量。

如何编写单元测试?

以 Java 开发为例,我们来学习如何编写单元测试。

Java 开发中,最流行的单元测试框架当属 JUnit 了,它提供了一系列的类和方法,可以帮助我们快速检验代码的行为。

1、引入 JUnit

首先我们要在项目中引入 JUnit,演示 2 种方式:

Maven 项目引入

在 pom.xml 文件中引入 JUnit 4 的依赖:

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.2</version>
    <scope>test</scope>
</dependency>
Spring Boot 项目引入

如果在 Spring Boot 中使用 JUnit 单元测试,直接引入 spring-boot-starter-test 包即可:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

然后会自动引入 JUnit Jupiter,它是 JUnit 5(新版本)的一部分,提供了全新的编写和执行单元测试的方式,更灵活易用。不过学习成本极低,会用 JUnit 4,基本就会用 JUnit Jupiter。

2、编写单元测试

编写一个单元测试通常包括三个步骤:准备测试数据、执行要测试的代码、验证结果。

一般来说,每个类对应一个单元测试类,每个方法对应一个单元测试方法。

编写 JUnit 单元测试

比如我们要测试一个计算器的求和功能,示例代码如下:

import org.junit.Test;
import org.junit.Assert;

public class CalculatorTest {

    // 通过 Test 注解标识测试方法
    @Test
    public void testAdd() {
        // 准备测试数据
        long a = 2;
        long b = 3;
        
        // 执行要测试的代码
        Calculator calculator = new Calculator();
        int result = calculator.add(2, 3);
        
        // 验证结果
        Assert.assertEquals(5, result);
    }
}

上述代码中的 Assert 类是关键,提供了很多断言方法,比如 assertEquals(是否相等)、assertNull(是否为空)等,用来对比程序实际输出的值和我们预期的值是否一致。

如果结果正确,会看到如下输出:

职场经验、为什么程序员一定要写单元测试?,自动化测试,软件测试,职场日常,单元测试,log4j,测试工具,程序员,自动化测试,软件测试,python

如果结果错误,输出如下,能够清晰地看到执行结果的差异:

职场经验、为什么程序员一定要写单元测试?,自动化测试,软件测试,职场日常,单元测试,log4j,测试工具,程序员,自动化测试,软件测试,python

Spring Boot 项目单测

如果是 Spring Boot 项目,我们经常需要对 Mapper 和 Service Bean 进行测试,则需要使用 @SpringBootTest 注解来标识单元测试类,以开启对依赖注入的支持。

以测试用户注册功能为例,示例代码如下:

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;

@SpringBootTest
public class UserServiceTest {

    @Resource
    private UserService userService;

    @Test
    void userRegister() {
        // 准备数据
        String userAccount = "yupi";
        String userPassword = "";
        String checkPassword = "123456";
        // 执行测试
        long result = userService.userRegister(userAccount, userPassword, checkPassword);
        // 验证结果
        Assertions.assertEquals(-1, result);
        // 再准备一组数据,重复测试流程
        userAccount = "yu";
        result = userService.userRegister(userAccount, userPassword, checkPassword);
        Assertions.assertEquals(-1, result);
    }
}

3、生成测试报告

如果系统的单元测试数量非常多(比如 1000 个),那么只验证某个单元测试用例是否正确、查看单个结果是不够的,我们需要一份全面完整的单元测试报告,便于查看单元测试覆盖度、评估测试效果和定位问题。

测试覆盖度 是衡量测试过程中被测试到的代码量的一个指标,一般情况下越高越好。测试覆盖度 100% 表示整个系统中所有的方法和关键语句都被测试到了。

下面推荐 2 种生成单元测试报告的方法。

使用 IDEA 生成单测报告

直接在 IDEA 开发工具中选择 Run xxx with Coverage 执行单元测试类:

职场经验、为什么程序员一定要写单元测试?,自动化测试,软件测试,职场日常,单元测试,log4j,测试工具,程序员,自动化测试,软件测试,python

然后就能看到测试覆盖度报告了,如下图:

职场经验、为什么程序员一定要写单元测试?,自动化测试,软件测试,职场日常,单元测试,log4j,测试工具,程序员,自动化测试,软件测试,python

显然 Main 方法没有被测试到,所以显示 0%。

除了在开发工具中查看测试报告外,还可以导出报告为 HTML 文档:

职场经验、为什么程序员一定要写单元测试?,自动化测试,软件测试,职场日常,单元测试,log4j,测试工具,程序员,自动化测试,软件测试,python

导出后,会得到一个 HTML 静态文件目录,打开 index.html 就能在浏览器中查看更详细的单元测试报告了:

职场经验、为什么程序员一定要写单元测试?,自动化测试,软件测试,职场日常,单元测试,log4j,测试工具,程序员,自动化测试,软件测试,python

这种方式简单灵活,不用安装任何插件,比较推荐大家日常学习使用。

使用 jacoco 生成单测报告

JaCoCo 是一个常用的 Java 代码覆盖度工具,能够自动根据单元测试执行结果生成详细的单测报告。

它的用法也很简单,推荐按照官方文档中的步骤使用。

官方文档指路:www.eclemma.org/jacoco/trun…

首先在 Maven 的 pom.xml 文件中引入:

<plugin>
  <groupId>org.jacoco</groupId>
  <artifactId>jacoco-maven-plugin</artifactId>
  <version>0.8.11</version>
</plugin>

当然,只引入 JaCoCo 插件还是不够的,我们通常希望在执行单元测试后生成报告,所以还要增加 executions 执行配置,示例代码如下:

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.11</version>
    <configuration>
        <includes>
            <include>com/**/*</include>
        </includes>
    </configuration>
    <executions>
        <execution>
            <id>pre-test</id>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
        </execution>
        <execution>
            <id>post-test</id>
            <phase>test</phase>
            <goals>
                <goal>report</goal>
            </goals>
        </execution>
    </executions>
</plugin>

然后执行 Maven 的 test 命令进行单元测试:

职场经验、为什么程序员一定要写单元测试?,自动化测试,软件测试,职场日常,单元测试,log4j,测试工具,程序员,自动化测试,软件测试,python

测试结束后,就能够在 target 目录中,看到生成的 JaCoCo 单元测试报告网站了:

职场经验、为什么程序员一定要写单元测试?,自动化测试,软件测试,职场日常,单元测试,log4j,测试工具,程序员,自动化测试,软件测试,python

打开网站的 index.html 文件,就能看到具体的测试报告结果,非常清晰:

职场经验、为什么程序员一定要写单元测试?,自动化测试,软件测试,职场日常,单元测试,log4j,测试工具,程序员,自动化测试,软件测试,python

通常这种方式会更适用于企业中配置流水线来自动化生成测试报告的场景。

行动吧,在路上总比一直观望的要好,未来的你肯定会感谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入群: 786229024,里面有各种测试开发资料和技术可以一起交流哦。

最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

职场经验、为什么程序员一定要写单元测试?,自动化测试,软件测试,职场日常,单元测试,log4j,测试工具,程序员,自动化测试,软件测试,python

软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。职场经验、为什么程序员一定要写单元测试?,自动化测试,软件测试,职场日常,单元测试,log4j,测试工具,程序员,自动化测试,软件测试,python
职场经验、为什么程序员一定要写单元测试?,自动化测试,软件测试,职场日常,单元测试,log4j,测试工具,程序员,自动化测试,软件测试,python

职场经验、为什么程序员一定要写单元测试?,自动化测试,软件测试,职场日常,单元测试,log4j,测试工具,程序员,自动化测试,软件测试,python

职场经验、为什么程序员一定要写单元测试?,自动化测试,软件测试,职场日常,单元测试,log4j,测试工具,程序员,自动化测试,软件测试,python文章来源地址https://www.toymoban.com/news/detail-833216.html

到了这里,关于职场经验、为什么程序员一定要写单元测试?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 为什么这么优秀的女生要找男程序员做老公?

    这篇文章呢我们谈一下 学计算机的男生这个问题 这个话题主要是来自于 有一个舞蹈老师 有一天跟我聊起来 说他的一个学生 长得非常漂亮是个女士 身材非常棒然后 在这边就是在温哥华这边呢 正在申请PR这个是没有问题的 有工作然后就想找一个程序员 老公那就是这样的一个

    2023年04月17日
    浏览(65)
  • 程序员员为什么总是要加班呢?不加班会被开除吗?

    最近和圈子外的一个好朋友去聊天 他问我一个很奇怪的问题 就是你们程序员为什么会经常加班 并且都是11点12点才回家 为什么会这样 是因为有很多事情做不完吗其实 我半开玩笑的告诉他 其实事情没那么多 那为什么还要加班呢 首先加班的原因有很多 但是概述起来 就有如下

    2023年04月25日
    浏览(103)
  • ChatGPT出来后,为什么老有人想让我们程序员失业?

    🐱 个人主页: 不叫猫先生 ,公众号: 前端舵手 🙋‍♂️ 作者简介:2022年度博客之星前端领域TOP 2,前端领域优质作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀! 💫优质专栏: vue3+vite+typeScript从入门到实践 📢 资料领取:前端进阶资料

    2024年02月07日
    浏览(57)
  • 程序员为什么不喜欢关电脑?揭秘背后的原因与“英雄”本色

    在许多人眼中,程序员似乎总是与电脑形影不离,甚至深夜时分,他们的电脑屏幕也依旧亮着。那么,为什么程序员们似乎从不喜欢关电脑呢?今天,就让我们一起走进程序员的世界,揭秘这背后的原因,看看他们真正的“英雄”本色! 在程序员的日常工作中,保持流畅且不

    2024年02月19日
    浏览(62)
  • 为什么有35岁「职业危机」的程序员不转做测试呢?

    针对这个问题,我想我还是有点发言权的,虽然我不是做开发,但是我老公是妥妥的程序员一枚,而我又是干测试的,所以我也会问他,为啥不转测试呀,测试相对不累,且工资也高于市面很多工作,即轻松又能赚钱,何乐而不为? 和老公交流过这个问题。交流后,我觉得要

    2024年02月10日
    浏览(55)
  • 人工智能这么厉害,比如GPT-4,为什么没有看到程序员失业?

    目录  一、一次理性的反思 看看网友基于GPT-4生成代码的测试案例: 二、人工智能与程序员相辅相成 三、无独有偶的低代码 1、提升开发价值 2、利于团队升级 四、最后 OpenAI发布了GPT-4,这个远超以往的任何人工智能的模型,在 逻辑、推理、数学、常识 等方面超越了90%的人

    2023年04月08日
    浏览(66)
  • 为什么越来越多的人转行学IT当程序员?

    疫情当下,大学毕业生的人数越来越多,就业越来越困难,导致毕业生的就业压力越来越大。但就在这种“毕业即失业”的就业形势下,IT行业的从业者却拿着高薪,在所有行业中成为“佼佼者”。 为什么学IT的人越来越多? 01 行业发展前景,一直向上 我们的工作、生活和学

    2023年04月11日
    浏览(75)
  • 为什么很多程序员不用switch,而是大量 的if......else if?

    不会吧还有人用if else和switch case?三目运算符? 不会吧? 不会吧?大佬都是全都不用的!以JAVA为例 条件判断语句的四种写法,茴字的四种写法大家不会不知道吧 1.正常人写法: //输出 :张三应该去男厕所 2.Lambda策略模式写法: 某些大公司P6级别以上(年薪30w-50w)标准写法

    2024年02月15日
    浏览(55)
  • 程序员日常|为什么我在开发工作中偏爱这款键盘?

    最近一直不断地有粉丝朋友们私信我,问我该如何给自己挑选一款适合程序员工作的键盘,于是今天来给大家介绍下我用的键盘。 程序员作为一个需要长时间敲代码的职业,没有一个趁手的键盘是不行的,往小了说是折损工作效率,往大了说就是在损伤自己的手,是对自己的

    2024年02月02日
    浏览(53)
  • 【为什么计算机老师不转行做薪资更高的程序员工作?】

    至于为什么一些计算机老师没有选择从事薪资更高的程序员工作,有很多原因。首先,人们的职业选择因素多样化,不仅仅取决于薪资。有些老师可能对教学工作有着浓厚的兴趣,并享受与学生交流和知识传授的过程。其次,不同的人对工作环境和工作内容有不同的偏好。有

    2024年02月09日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包