test mutation-02-变异测试 mutate-test-kata入门介绍

拓展阅读

开源 Auto generate mock data for java test.(便于 Java 测试自动生成对象信息)

开源 Junit performance rely on junit5 and jdk8+.(java 性能测试框架。性能测试。压测。测试报告生成。)

test 系统学习-04-test converate 测试覆盖率 jacoco 原理介绍

mutate-test-kata

使用变异测试来淘汰虚假单元测试

代码卡塔:使用变异测试提高单元测试质量的练习。

摘要

这是一组练习,将演示:

  1. 由于测试质量低,仅仅通过单元测试和高单元测试覆盖率数字可能会给人一种虚假的安全感。
  2. 如何使用变异测试和常见的测试异味(test smells)来识别问题点。
  3. 如何解决这些问题。

什么是代码卡塔?

代码卡塔是一种编程练习,通过实践帮助程序员磨练他们的技能。代码卡塔通常被设置为一系列单元测试,这些测试会失败。

你的任务是编写代码使它们通过。这个想法灵感来自于日本武术中的卡塔概念。

就像在武术中一样,你可以多次重复卡塔来改进解决方案。

请注意,这个卡塔有点不同 - 所有测试最初都会通过。

不用担心,上面提到的所有想法在这里仍然适用。

我们将改进测试,使它们失败,然后我们将修复代码使测试通过,但到那时它们将成为好的测试。

运行这个卡塔

要构建这个卡塔,你将需要:

  • Java 17 或更新版本
  • Maven 3.6.1 或更新版本
  • 你选择的集成开发环境(IDE)

这个项目中有两个模块:

  1. kata - 包含练习,包括下面描述的领域和测试类。你应该使用这个模块进行工作。

  2. solutions - 包含卡塔练习的解决方案以及对测试异味的解释(参见下面的"单元测试异味"部分)。解决这个卡塔有多种方法,所以你的解决方案可能不会完全与这个模块中的相同,事实上,你可能会找到改进这里解决方案的方法。

这个卡塔的领域由两个类组成:Company(公司)和Employee(雇员):

运行mtk.domain.CompanyTest类中的所有单元测试。它们应该都通过。使用Maven的输出或IDE测试运行器中的覆盖率报告功能检查测试覆盖率指标。覆盖率应该接近100%。好消息是:有测试,它们都通过,而且覆盖了所有业务逻辑。看起来软件准备好发布了!

不幸的是,这将是一个糟糕的主意,因为代码中充满了错误。为了证明这一点,只需查看mtk.CompanyRunner类,其中的main()方法包含一些简单的业务逻辑。运行mtk.CompanyRunner.main()并查看控制台输出。看起来正常吗?尽管有这么多的测试,为什么会有这么多的错误呢?

运行带有突变的单元测试。突变将通过PIT(一个变异测试工具)引入到你的代码中。

  1. 启用项目的pitest Maven配置文件。此配置文件绑定到Maven生命周期的测试阶段。

  2. 在kata模块中运行test任务(要在命令行中运行带有激活配置文件的命令,请执行mvn test -P pitest命令)。启用配置文件后,此任务将调用PIT框架首先在应用代码中引入更改,然后执行测试。

  3. 检查结果。结果以HTML格式写入到target/pit-reports/YYYYMMDDHHMI目录中的文件中。在浏览器中打开此文件 - 你应该会看到相当多的红色。这意味着一些代码突变设法幸存下来 - 没有被单元测试捕捉到。这意味着实际上我们的单元测试没有测试它们应该测试的内容。

  4. 修复测试异味。测试类中的每个测试都表现出一个或多个测试异味。逐个检查测试,修复异味并确保测试实际上执行了它应该执行的操作。为了帮助你,一些测试方法的注释明确说明了哪些异味存在。一旦去除异味,测试应该开始失败。这是一件好事,因为现在我们有了实际验证软件行为的测试。

  5. 修复业务逻辑,使测试通过。查看代码中的注释,它们可能会解释其预期行为(这并不意味着按照编写的方式行为符合预期)。

  6. 杀死所有突变体!以这种方式修复的测试应该能够捕捉到PIT引入的突变。当所有测试(和受测试的逻辑)都被修复时,不应该有突变能够幸存。因此,最终状态应该是通过测试和死亡突变。没有异味。

这个文档的其余部分提供了一些建议,如果你是单元测试的新手,这可能会很有用。

单元测试 - 必要但不足够…

…来在被测试的软件系统中建立信心。虽然我们的重点在单元测试上,但将它们放在更广泛的背景中会有所帮助。下表列出了常见类型的测试。

列的含义:

Category - 测试的类别
Purpose - 为什么需要这种类型的测试
Who - 在测试创建和验证测试结果中涉及的角色
Tools - 支持这种类型测试的示例工具

当转换为Markdown格式时,表格的样式如下:

| 类别                  | 目的                                           | 参与者               | 工具          |
|-----------------------|-----------------------------------------------|----------------------|---------------|
| 单元                  | 在低层次(代码)验证行为单元,侧重于系统的小部分(例如,一个方法) | 开发者               | JUnit         |
| 验收                  | 验证特定场景下业务逻辑是否按规定实现              | 开发者,用户          | FitNesse      |
| 突变                  | 确保单元测试和验收测试的质量                    | 开发者               | PITest        |
| 集成                  | 检测系统模块之间的交互问题                      | 技术运维,开发者       |               |
| 用户验收              | 由用户认证整个系统是否按预期运行                  | 开发者,用户          |               |
| 生产镜像              | 在与生产环境相同的负载下测试系统                  | 技术运维             |               |
| 混沌工程              | 通过对基础设施(服务进程、网络、客户端等)进行故障注入来测试系统的弹性 | 技术运维             | Chaos Monkey  |
| 断点                  | 确定系统能够支持的最大负载                       | 技术运维             | The Grinder    |

单元测试最佳实践

以下是确保单元测试有效、易于维护和易于执行的一些建议实践:

  • 自动化:不需要人为干预来确定结果。
  • 专注:每个测试方法测试一个场景。
  • 完整:测试边缘情况,尽量覆盖所有有意义的不同场景。
  • 良好命名:测试方法的名称描述正在测试的场景。
  • 快速:相关的测试在几秒钟内或更短时间内执行。
  • 独立:没有外部依赖项,不依赖于其他测试。
  • 测试行为,而不是实现

单元测试异味

以下是测试可能存在问题的迹象 - 这可能是因为测试本身编写得不好,或者受测代码不友好于测试(这可能意味着这段代码结构不良):

  • 没有断言
  • 不相关的断言
  • 使用模拟(Mocks)
  • 期望结果是通过计算而不是明确指定的
  • 测试代码重用(即测试逻辑重用,测试工具类是好的)
  • 测试数据重用
  • "闪烁"测试(具有非确定性行为的测试)
  • 测试之间的相互依赖(例如,执行顺序)
  • 运行时间长的测试
  • @Ignore或注释掉的测试

这些异味经常一起出现。例如,共享测试数据可能导致测试的成功取决于执行顺序。

单元测试质量

我们如何衡量系统中单元测试的质量?一个广泛使用的度量是测试覆盖率。一些需要记住的事情:

  • 测试覆盖率
    • 由测试覆盖的代码行、方法、类的百分比
    • 不保证覆盖的代码实际上被测试
    • 确定绝对没有被测试的代码
  • 因此,设置覆盖率目标并非完全没有意义,但是…
  • 不要仅仅为了覆盖率而进行优化

我们如何确保测试实际上进行了测试?变异测试是确保单元测试的相关性的一种方式。

变异测试

变异测试是验证单元测试质量的一种方式。

它意味着在代码中引入变化并观察单元测试的行为。

假设在变异之前所有的测试都通过,那么一些单元测试将会开始失败(好的),或者所有测试都将继续通过(不好)。

后一种情况意味着单元测试实际上并未验证受测代码的结果:从所有意图上看,结果变得随机,但所有测试都通过。

测试驱动开发

采用测试驱动开发(TDD)将带来更好的测试、更好的接口、更少的不必要代码以及更自信和稳定的开发过程。

只需按照以下步骤:

  1. 编写一个测试
  2. 采用用户的视角:“什么API会使我的工作最简单?”
  3. 思考小的增量
  4. 使测试通过
  5. 不惜一切代价:重复代码?可以!硬编码预期结果?可以!
  6. 重构
  7. 消除重复
  8. 为所有有意义的不同场景重复
  9. 收获好处
    • 几乎所有代码都经过测试
    • 你知道何时停止编码
    • 用户友好的接口
    • 结构良好的代码
    • 恰到好处的抽象
    • 恰到好处的代码
    • 自信地进行开发!

听起来好像难以置信?

秘诀在于,TDD确实需要从实践者那里获得很多纪律,以便以微小的增量工作,刻苦地按照上述步骤进行,不走捷径。

缺乏纪律很可能最终导致通常的“质量”测试(和受测代码)。

在这里插入图片描述

参考资料

https://github.com/vmzakharov/mutate-test-kata

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

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

相关文章

SkyWalking介绍和Docker环境下部署

一、Skywalking概述 1、Skywalking介绍 Skywalking是分布式系统的应用程序性能监视工具,专为微服务,云原生架构和基于容器(Docker,K8S,Mesos)架构而设计,它是一款优秀的APM(Application Perfo…

RocketMQ5-02快速部署RocketMQ5.x(手动和容器部署)

RocketMQ5快速入门指南(含部署实践) 部署环境本机单机可执行包部署、Docker部署 Mac部署:下载源文件可执行包部署 NameServer 问题1:资源不足补充: 关于日志的输出 可执行包部署 Broker 对于Local模式对于Cluster模式 对于 ProxyDocker部署 NameServerD…

蒙特卡洛算法

通过随机数获得结果的算法。 当一个问题无法通过数学推导,计算机无法在有限时间求解时候。 就需要考虑蒙特卡洛方法了。 当无法求得精确解时候,进行随机抽样,根据统计试验求近似解。 可行域过大,没有通用方法求出精确解。 主…

OpenHarmony基于HDF简单驱动开发实例

背景 OpenHarmony-3.0-LTSqemu_small_system_demoliteos_aqemu 添加配置 device/qemu/arm_virt/liteos_a/hdf_config/device_info/device_info.hcs device_info 新增: sample_host :: host {hostName "sample_host";sample_device :: device {devic…

腾讯云免费服务器申请1个月攻略,亲测可行教程

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM,轻量配置可选2核2G3M、2核8G7M和4核8G12M,CVM云服务器可选2核2G3M和2核4G3M配置,腾讯云服务器网txyfwq.com分享2024年最新腾讯云免费…

Python 常用数据类型

Python 常用数据类型有以下这些: 数据类型中文解析例子int整数,表示整数值1、2float浮点数,表示带有小数点的数值3.14、2.718complex复数,表示实部和虚部组成的复数12j、3-4jstr字符串,表示文本数据,用引号…

arm64架构编译electron长征路

1. gn工具生成 在arm64下需要构建对应架构的gn文件。 源代码下载,并且切换到对应的版本。 git clone https://gn.googlesource.com/gn cd gn git checkout 5a004f9427a0将gn源码放在src/tools/gn目录下,内容如下图 1.1 问题,找不到last_commit_position.h文件 问题描述如…

http 客户端 Feign【微服务】

文章目录 1. 基于 Feign 的远程调用2. Feign 自定义配置3. Feign 性能优化4. Feign 的最佳实践4.1 继承4.2 抽取 1. 基于 Feign 的远程调用 Feign 是一个声明式的 http 客户端,它可以帮助我们优雅地发送 http 请求。 在学习 Feign 之前先来看一下我们以前利用 Res…

SpringBoot3多数据源动态切换

demo使用的时SpringBoot3.x、JDK17、MybatisPlus3.5.x、MySQL8 从数据中加载数据源 定义接口,指定数据源,从不同数据库获取数据 创建数据源表,用于指定不同数据源,程序自动动态获取 项目版本依赖关系 demo中所用到的工具以及…

学习笔记16——操作系统

学习笔记系列开头惯例发布一些寻亲消息,感谢关注! 链接:https://www.mca.gov.cn/lljz/indexdetail.html?idd0afa7f6f36946319a206d61937f9b63&type0&t10.11199120579373845 八股——操作系统一些基础知识整理 一个java程序对应一个…

算法32:针对算法31货币问题进行扩展,并对从左往右模型进行总结

本算法是在算法31的基础之上进行推理总结的,因此,在看本章之前,必须先去了解算法31,否则会觉得莫名其妙。 算法31的推理过程: 如果 x y1 y2 y3 y4 y5 y6. x1 y2 y3 y4 y5 y6 那么 x y1 x1. 根据以…

计算机缺失vcomp120.dll文件怎么办?总结多种解决方法分享

在使用电脑过程中,难免会遇到各种问题,其中vcomp120.dll丢失问题就是其中之一。这个问题可能会给用户带来诸多不便,导致某些应用程序无法正常运行。在这篇文章中,我们将详细介绍vcomp120.dll文件的重要性,以及遇到丢失…

使用 vue-json-viewer 工具在界面显示json格式数据

安装vue-json-viewer npm install vue-json-viewer --save 引入&#xff1a; import JsonViewer from vue-json-viewer Vue.use(JsonViewer) 使用&#xff1a; <json-viewer :value"jsonData" show-double-quotes :preview-mode"true" :show-array…

存储器进化全解析:从NAND到UFS,深入剖析常见存储技术与应用

存储领域发展至今&#xff0c;已有很多不同种类的存储器产品。下面给大家介绍几款常见的存储器及其应用&#xff1a;#存储器#​ 一、NAND NAND Flash存储器是Flash存储器的一种&#xff0c;属于非易失性存储器&#xff0c;其内部采用非线性宏单元模式&#xff0c;为固态大容量…

mmdetection训练自己的数据集

mmdetection训练自己的数据集 这里写目录标题 mmdetection训练自己的数据集一&#xff1a; 环境搭建二&#xff1a;数据集格式转换(yolo转coco格式)yolo数据集格式coco数据集格式yolo转coco数据集格式yolo转coco数据集格式的代码 三&#xff1a; 训练dataset数据文件配置config…

C#,迭代深化搜索(IDS)或迭代深化深度优先搜索(IDDFS)算法的源代码

摘要&#xff1a;本文介绍适合于大数据规模情况下的&#xff0c;新型的迭代深化深度优先搜索(IDDFS)算法的原理、实例及实现的C#源代码。 引言 常用的树&#xff08;或图&#xff09;遍历算法是两种&#xff1a; 广度优先搜索算法&#xff08;BFS&#xff09; 和 深度优先搜索…

C#编程-实现文件输入和输出操作

实现文件输入和输出操作 所有程序接受用户的输入、处理输入并且产生输出。所以,所有的编程语言都支持输入和输出操作。例如,您需要为教师开发程序以接受学生的结果信息。您的程序应该将信息保存在硬盘的Result.xls文件中。您可以在程序中使用文件输入和输出操作以接受来自教…

外汇网站主要业务逻辑梳理

上图为工行ICBC的外汇保证金交易界面。 当需要买入帐户欧元&#xff08;欧元人民币&#xff09;时&#xff0c;买入100欧元&#xff0c;因为没有杠杆&#xff0c;虽然欧元中间价是782.34&#xff0c;但实际需要支付783.14元人民币的保证金&#xff0c;这个兑换不是真实的外汇兑…

全网独家:基于openeuler-20.03-lts底包构建opengauss数据库V5.0.1LTS的单机容器

近期想测试一下opengauss数据库,官网上单机容器部署只有x86-64平台CentOS 7.6和ARM64平台 openEuler20.03 LTS两种底包方案。本文系全网独家在x86平台上基于openeuler-20.03-lts底包构建opengauss数据库V5.0.1LTS的单机容器。 opengauss官网上单机容器部署只有x86-64平台Cent…

计算机毕业设计 基于javaweb的学生交流培养管理平台/系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…