test Property-based Testing-04-junit-quickcheck

news2025/1/23 0:47:29

拓展阅读

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

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

junit-quickcheck:基于 JUnit 风格的属性驱动测试库

junit-quickcheck 是一个支持在 JUnit 中编写和运行属性驱动测试的库,受到了 Haskell 的 QuickCheck 的启发。

属性驱动测试捕获代码输出的特征或“属性”,这些特征在满足某些条件的任意输入下应为真。

例如,想象一个函数,它生成一个正整数 n 大于 1 的质因数列表。

无论 n 的具体值如何,该函数必须生成一个列表,其中的成员都是质数,当全部相乘时等于 n,并且不同于大于 1 且不等于 n 的正整数 m 的因数分解。

与测试所有可能的输入不同,junit-quickcheck 和其他 QuickCheck 衍生库生成一些随机输入,并验证这些属性至少对生成的输入成立。这使我们在重复的测试运行中合理确保这些属性对于任何有效输入都成立。

入门例子

    import com.pholser.junit.quickcheck.Property;
    import com.pholser.junit.quickcheck.runner.JUnitQuickcheck;
    import org.junit.runner.RunWith;

    import static org.junit.Assert.*;

    @RunWith(JUnitQuickcheck.class)
    public class StringProperties {
        @Property public void concatenationLength(String s1, String s2) {
            assertEquals(s1.length() + s2.length(), (s1 + s2).length());
        }
    }

支持的类型

“开箱即用”(核心 + 生成器),junit-quickcheck 可识别以下类型的属性参数:

所有 Java 基本类型和基本类型包装类
java.math.Big(Decimal|Integer)
java.util.Date
任何枚举类型
String
“函数接口”(具有单个抽象方法且不覆盖 java.lang.Object 方法的接口)
java.util.Optional,支持的类型
java.util.ArrayList 和 java.util.LinkedList,支持的类型
java.util.HashSet 和 java.util.LinkedHashSet,支持的类型
java.util.HashMap 和 java.util.LinkedHashMap,支持的类型
支持的类型的数组
“标记”接口(没有方法且不覆盖 java.lang.Object 方法或不是默认方法的接口)
其他类型…

当多个生成器可以满足给定属性参数的类型(例如,java.io.Serializable),在给定的生成中,junit-quickcheck 将以(大致)相等的概率随机选择其中之一的生成器。

生成其他类型的值

扩展 Generator 类以创建该类型的生成器。

为了让 junit-quickcheck 能够实例化您的生成器,请确保它具有一个公共的无参数构造函数:

    import java.awt.Dimension;

    public class Dimensions extends Generator<Dimension> {
        public Dimensions() {
            super(Dimension.class);
        }

        @Override public Dimension generate(
            SourceOfRandomness r,
            GenerationStatus status) {

            // ...
        }
    }

如果将生成器定义为内部类,请确保它是静态的,否则它将在运行时失败。

显式生成器

为了生成其他类型的属性参数的随机值,或者为了覆盖支持类型的默认生成方式,请使用 @From 标记属性参数,并提供要使用的 Generator 类。

如果您给出多个 @From 注解,junit-quickcheck 将在每次生成时按照其频率属性的比例选择其中一个(默认为1)。

    import java.util.UUID;

    public class Version5 extends Generator<UUID> {
        public Version5() {
            super(UUID.class);
        }

        @Override public UUID generate(
            SourceOfRandomness r,
            GenerationStatus status) {

            // ...
        }
    }

    @RunWith(JUnitQuickcheck.class)
    public class IdentificationProperties {
        @Property public void shouldHold(@From(Version5.class) UUID u) {
            // ...
        }
    }

junit-quickcheck内置了用于生成函数接口类型值的设施(无论它们是否标有[FunctionalInterface](http://docs.oracle.com/javase/8/docs/api/java/lang/FunctionalInterface.html)),还有用于数组或枚举类型的设施。显式命名这些类型参数的生成器会覆盖内置的生成方式。这通常对涉及泛型的函数接口是必要的。

通过放置和命名隐含的生成器

如果生成器与您要生成的类在同一个包中,并且它有相同的名称并带有额外的“Gen”后缀,那么它应该会被自动找到。

通过ServiceLoader隐含的生成器

要在不使用@From的情况下使用自定义类型的生成器,您可以通过安排[ServiceLoader](http://docs.oracle.com/javase/8/docs/api/java/util/ServiceLoader.html)来发现它。

在资源目录META-INF/services中创建一个名为com.pholser.junit.quickcheck.generator.Generator的提供者配置文件。
此文件的每一行应包含具体生成器类的完全限定名称。
确保您的生成器类和提供者配置文件都在类路径上。junit-quickcheck将以这种方式打包的生成器可用于使用。

模块junit-quickcheck-generators中的生成器也通过此机制加载。您提供和使ServiceLoader可用的任何生成器都会补充而不是覆盖这些生成器。

Ctor

通过在@From中使用Ctor生成器,可以为具有单个可访问构造函数的类型生成值。

    public class DollarsAndCents {
        private final BigDecimal amount;

        public DollarsAndCents(BigDecimal amount) {
           this.amount = amount.setScale(2, BigDecimal.ROUND_HALF_EVEN);
        }

        // ...
    }

    @RunWith(JUnitQuickcheck.class)
    public class DollarsAndCentsProperties {
        @Property public void rounding(@From(Ctor.class) DollarsAndCents d) {
            // ...
        }
    }

junit-quickcheck会找到适用于构造函数参数类型的生成器,并调用它们来为构造函数调用提供值。将尊重构造函数参数上的任何配置注解。

Fields 字段

通过在@From中使用 Fields 生成器,可以为具有可访问的无参数构造函数的类型生成值。

    public class Counter {
        private int count;

        public Counter increment() {
            ++count;
            return this;
        }

        public Counter decrement() {
            --count;
            return this;
        }

        public int count() {
            return count;
        }
    }

    @RunWith(JUnitQuickcheck.class)
    public class CounterProperties {
        @Property public void incrementing(@From(Fields.class) Counter c) {
            int count = c.count();
            assertEquals(count + 1, c.increment().count());
        }

        @Property public void decrementing(@From(Fields.class) Counter c) {
            int count = c.count();
            assertEquals(count - 1, c.decrement().count());
        }
    }

junit-quickcheck会找到适用于类字段类型的生成器,并调用它们来为类的新实例的字段提供值(绕过访问保护)。

将尊重字段上的任何配置注解。

参考资料

https://github.com/pholser/junit-quickcheck

在这里插入图片描述

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

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

相关文章

瑞_Java开发手册_(一)编程规约

文章目录 编程规约的意义&#xff08;一&#xff09;命名风格&#xff08;二&#xff09;常量定义&#xff08;三&#xff09;代码格式&#xff08;四&#xff09;OOP 规约&#xff08;五&#xff09;日期时间&#xff08;六&#xff09;集合处理&#xff08;七&#xff09;并发…

「Vue3面试系列」Vue 3.0中Treeshaking特性有哪些?举例说明一下?

文章目录 一、是什么二、如何做Vue2 项目Vue3 项目 三、作用参考文献 一、是什么 Tree shaking 是一种通过清除多余代码方式来优化项目打包体积的技术&#xff0c;专业术语叫 Dead code elimination 简单来讲&#xff0c;就是在保持代码运行结果不变的前提下&#xff0c;去除…

基于JavaWeb的酒店管理系统

基于JavaWeb的酒店管理系统 文章目录 基于JavaWeb的酒店管理系统系统介绍技术选型成果展示源码获取账号地址及其他说明 系统介绍 基于JavaWeb的酒店管理系统是为酒店打造的管理平台&#xff0c;其主要功能有管理员登陆、客房预订、客房入住、房间管理、数据查询(预订单查询、入…

差分算法模板

差分算法模板 一维差分一维insert函数(构造差分数组和实现区域加数操作)一维差分模板题 二维差分二维insert函数(构造差分数组和实现区域加数操作)二维差分模板题 一维差分 差分主要是计算出某个区域段的数分别加上一个数 先给定一个原数组a&#xff1a;a[1], a[2], a[3], a[n]…

datavrap-各种各样的条形图(含详细操作步骤)

静态条形图&#xff1a;正确设置数据即可&#xff0c;导出的图形不会随着时间变化 最普通的静态条形图 黑色系风格的静态条形图 动态条形图&#xff1a;导出的图形会随着时间变化 普通的动态条形图 带数字滚动效果的动态条形图 简单的Top排行榜动态条形图 格式更丰富的Top排行榜…

细说JavaScript表达式和运算符号详解

除了简单的表达式还有复杂的表达式&#xff0c;它是由简单表达式构成的&#xff0c;将简单表达式组合成复杂表达式最常见的方法就是使用运算符 一、表达式 表达式分为简单表达式和复杂表达式&#xff0c;但最后的结果均是返回一个值 1、简单表达式 简单表达式又称为原始表达式…

从零开始做题:逆向wdb_2018_2nd_easyfmt

1.题目信息 2.解题分析 格式化字符串漏洞 如何确定偏移 Do you know repeater? 输入AAAA.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p.%p. 输出AAAA.0xffffd658.0x64.0xf7ffdc08.0xf7ffcd00.0xffffd77c.0x41414141.0x2e70252e.0x252e7025.0x70252e70.0x2e70252e.0x252e7025.0x70252…

JAVA开发入门

文章目录 计算机基本概念DOS常用命令JAVA语言发展史JDK下载JAVA体系与特点JDK安装JAVA环境变量配置 计算机基本概念 计算机组成原理 计算机组装 计算机&#xff1a;电子计算机&#xff0c;俗称电脑。是一种能够按照程序运行&#xff0c;自动、高速处理海量数据的现代化智能电子…

git常用命令集合及其演示

文章目录 一.git常用命令集合及其演示1.git config --list 查看配置信息2.git status 查看当前仓库的状态3.git add . 加到暂存区4.git commit -m "描述信息" 添加到版本库5.git diff xxxx 查看xxxx文件修改了哪些内容&#xff0c;相比于暂存区的区别6.git rm --cach…

阿里云和AWS之间的应用程序防火墙比较及选择建议!

对于大多数开发人员来说&#xff0c;托管在云中的 Web 应用程序或 REST API 是一种常见方案。但是&#xff0c;并非每个应用程序都具有相同的安全级别。将 Web 应用程序防火墙 &#xff08;WAF&#xff09; 添加到 Web 应用程序是提高安全性的有用方法。 在本文中&#xff0c;…

GitHub API使用--获取GitHub topic

目录标题 技术简介申请token简单使用使用Java调用获取GitHub topic总结 技术简介 GitHub API是一个功能强大的工具&#xff0c;为开发者提供了访问和操作GitHub平台上资源的途径。无论是构建个人工具&#xff0c;集成自动化流程&#xff0c;还是开发应用程序&#xff0c;GitHu…

启英泰伦推出「离线自然说」,离线语音交互随意说,不需记忆词条

离线语音识别是指不需要依赖网络&#xff0c;在本地设备实现语音识别的过程&#xff0c;通常以端侧AI语音芯片作为载体来进行数据的采集、计算和决策。但是语音芯片的存储空间有限&#xff0c;通过传统的语音算法技术&#xff0c;最多也只能存储数百条词条&#xff0c;导致用户…

MySQL:ERROR 1067 - Invalid default value for ‘end_time‘【解决办法】

问题描述&#xff08;mysql版本&#xff1a;5.7.36&#xff09;&#xff1a; 今天在使用Navicat可视化工具运行sql文件&#xff0c;发生如下错误&#xff1a; 在图中&#xff0c;sql是没有错误的&#xff0c;但是运行报错Invalid default value for end_time。 解决办法&#…

ACM论文LaTeX模板解析(一)| 模板下载与安装

本文收录于专栏&#xff1a;ACM 论文 LaTeX模板解析&#xff0c;本专栏将会围绕ACM 论文 LaTeX模板解析持续更新。欢迎点赞收藏关注&#xff01; 文章目录 1. 引言2. 下载方式 1. 引言 计算机械协会&#xff08;ACM&#xff0c;Association for Computing Machinery&#xff0…

Linux环境基础开发工具的使用(上)

文章目录 Linux 软件包管理器 yum什么是软件包关于rzsz查看软件包安装软件卸载软件 Linux编辑器 - vimvim的基本概念vim下各模式的切换vim命令模式各命令汇总vim底行模式各命令汇总 配置vim Linux 软件包管理器 yum 什么是软件包 在Linux下安装软件, 一个通常的办法是下载到程…

[NAND Flash 6.2] NAND 初始化常用命令:复位 (Reset) 和 Read ID 和 Read UID 操作和代码实现

依公知及经验整理,原创保护,禁止转载。 专栏 《深入理解NAND Flash》 <<<< 返回总目录 <<<< 把下文中的字母和数字用`包起来, 中文不变。 全文 4400 字,主要内容 复位的目的和作用? NAND Reset 种类:FFh, FCh, FAh, FDh 区别 Reset 操作步骤 和…

叉车车载终端定制_基于MT6762安卓核心板的车载终端设备方案

叉车车载终端是一款专为叉车车载场景设计的4英寸Android车载平板电脑。它采用了高能低耗的8核ARM架构处理器和交互开放的Android 12操作系统&#xff0c;算力表现强大。此外&#xff0c;该产品还具备丰富的Wi-Fi-5、4G LTE和蓝牙等通讯功能&#xff0c;可选配外部车载蘑菇天线&…

Python实现分位数回归模型(quantreg算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 分位数回归是简单的回归&#xff0c;就像普通的最小二乘法一样&#xff0c;但不是最小化平方误差的总和…

vue3移动端适配

将vue3项目中的 px 单位&#xff0c;自动转换为rem 单位 可以看到这里会根据页面缩小放大变化 需要安装两个插件&#xff0c;看步骤 amfe-flexible --- 默认指向2.2.1版本 npm i -S amfe-flexiblepostcss-pxtorem --- 默认指向6.0.0版本 --save-dev 参数会把依赖包的版本信…

【RabbitMQ】2 RabbitMQ介绍与架构

目录 简介架构Connection 和Channel关系工作流程生产者发送消息的流程消费者接收消息的过程 RabbitMQ数据存储存储机制 安装和配置RabbitMQRabbitMQ常用操作命令 简介 RabbitMQ&#xff0c;俗称“兔子MQ”&#xff08;可见其轻巧&#xff0c;敏捷&#xff09;&#xff0c;是目…