test Property-based Testing-04-junit-quickcheck

拓展阅读

开源 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.mzph.cn/news/622656.shtml

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

相关文章

送水小程序开发:如何选择最适合的技术平台

选择最适合的技术平台对于开发送水小程序至关重要。在这篇文章中&#xff0c;我将为您介绍如何选择最适合的技术平台来开发送水小程序&#xff0c;以及各种技术平台的优缺点。无论您是刚刚起步的创业公司还是成熟的送水服务提供商&#xff0c;本文都将为您提供有关送水小程序开…

深信服超融合HCI版本升级,6.0.0R5升级至6.8.0R2

超融合升级&#xff0c;需要满足以下条件及前期准备&#xff1a; 确认HCI的升级序列号有效升级时长大概在一个半小时&#xff0c;安全起见&#xff0c;需预留至少三至四小时窗口期升级前&#xff0c;需要将所有虚拟机关机&#xff0c;涉及到业务无法访问&#xff0c;需提前通知…

网络-DHCP中继(思科)

思科 前提&#xff1a;将R1 R3配置16板卡 将R1更改标识符为三层交换机 将R3更改标识符为交换机 拓扑图&#xff1a; R2进行配置 配置IP地址 为12.0.0.2 配置默认路由到R1的f1/4接口 配置dhcp地址池 配置vlan10的地址池 配置vlan20的地址池 三层交换机R1进行配置 将f1/4接口…

高光谱分类论文解读分享之基于形态卷积神经网络的高光谱影像分类

IEEE TGRS 2021&#xff1a;基于形态卷积神经网络的高光谱影像分类 题目 Morphological Convolutional Neural Networks for Hyperspectral Image Classification 作者 Swalpa Kumar Roy; Ranjan Mondal; Mercedes E. Paoletti; Juan M. Haut; Antonio Plaza 关键词 Clas…

关于git与git-lfs对文件压缩存储方面的研究

先说结论&#xff0c;git使用了Delta增量压缩算法&#xff0c;git-lfs实测没有进行任何压缩&#xff0c;这个结论让我很震惊。 测试过程如下&#xff1a; 测试git仓库自身的压缩 准备一个包含许多杂项文件的文件夹&#xff0c;大概几百M&#xff0c;要保证有一个txt文本文件…

Qt框架学习 --- CTK编译(Qt5.15.2+vs2019+cmake)

系列文章目录 第二章 CTK的测试demo https://blog.csdn.net/yonug1107716573/article/details/135527289 文章目录 系列文章目录前言一、准备工作二、编译步骤1.修改文件2.编译CTK2.1 准备2.2 cmake界面配置2.3 配置编译器2.4 编译的配置设置2.5 选择需要编译的模块2.6 生成2.…

Uibot (RPA设计软件)股票板块行情抓取————课前材料四

微信群发助手机器人的小项目友友们可以参考小北的课前材料二博客~ (本博客中会有部分课程ppt截屏,如有侵权请及请及时与小北我取得联系~&#xff09; 紧接着小北的前两篇博客&#xff0c;友友们我们即将开展新课的学习~RPA 培训前期准备指南——安装Uibot(RPA设计软件&#x…

Java 并发性和多线程3

七、线程安全及不可变性 当多个线程同时访问同一个资源&#xff0c;并且其中的一个或者多个线程对这个资源进行了写操作&#xff0c;才会产生竞态条件。多个线程同时读同一个资源不会产生竞态条件。 我们可以通过创建不可变的共享对象来保证对象在线程间共享时不会被修改&…

AI绘画风格化实战

在社交软件和短视频平台上&#xff0c;我们时常能看到各种特色鲜明的视觉效果&#xff0c;比如卡通化的图片和中国风的视频剪辑。这些有趣的风格化效果其实都是图像风格化技术的应用成果。 风格化效果举例 MidLibrary 这个网站提供了不同的图像风格&#xff0c;每一种都带有鲜…

Neo4j知识图谱(2)创建与删除

Neo4j - CQL简介_w3cschoolhttps://www.w3cschool.cn/neo4j/neo4j_cql_introduction.html一、创建节点 create(n:Person{name:何仙鸟,age:21}) create就是创建&#xff0c;无论是点还是边都是用create来创建 n相当于一个别名&#xff0c;比如创建一个Person&#xff0c;而Pe…

嵌入式软件面试之程序在存储器中的分布

Hi, 大家好&#xff0c;今天阿目分享的是一个嵌入式软件面试的常见问题&#xff0c;内存分布或者说程序在内存中的布局&#xff0c;我们写的程序是按照怎么的准则放在内存中的&#xff1f; 一般有操作系统的嵌入式设备&#xff0c;都会有一个Bootloader, 它负责在上电后初始化…

漏洞修复整理

一、Geoserver Apache HTTP/2拒绝服务漏洞&#xff08;CVE-2023-44487&#xff09;、Eclipse Jetty 资源管理错误漏洞(CVE-2023-26048)、Eclipse Jetty 信息泄露漏洞(CVE-2023-26049) 受影响版本&#xff1a;9.4.53以下版本 处理方式&#xff1a;原地升级 &#xff08; jdk版本…

学习redis有效期和数据类型

1、安装redis和连接redis 参考&#xff1a;ubuntu安装单个redis服务_ubuntu redis单机版安装-CSDN博客 连接redis&#xff1a;redis-cli.exe -h localhost -p 6379 -a 123456 2、Redis数据类型 以下操作我们在图形化界面演示。 2.1、五种常用数据类型介绍 Redis存储的是key…

jenkins-cl参数化构建

pipeline片段&#xff08;对应jenkins-cli -p参数的BRANCHdevelop&#xff09; parameters {string(name: BRANCH, defaultValue: master, description: Enter the branch name)}stages {stage(Get Code) {steps {script {def branch params.BRANCHcheckout scmGit(branches: …

算法通关村第十五关—继续研究超大规模数据场景的问题(黄金)

继续研究超大规模数据场景的问题 一、对20GB文件进行排序 题目要求&#xff1a;假设你有一个20GB的文件&#xff0c;每行一个字符串&#xff0c;请说明如何对这个文件进行排序&#xff1f;  分析&#xff1a;这里给出大小是20GB,其实面试官就在暗示你不要将所有的文件都装入到…

世邦通信 SPON IP网络对讲广播系统addscenedata.php任意文件上传漏洞

产品介绍 世邦通信SPON IP网络对讲广播系统采用领先的IPAudio™技术,将音频信号以数据包形式在局域网和广域网上进行传送,是一套纯数字传输系统。 漏洞描述 spon IP网络对讲广播系统存在任意文件上传漏洞&#xff0c;攻击者可以通过构造特殊请求包上传恶意后门文件&#xff…

Sentinel微服务保护

文章目录 Sentinel微服务保护1.初识Sentinel1.1.雪崩问题及解决方案1.1.1.雪崩问题1.1.2.解决方案1.1.3.总结 1.2.服务保护技术对比1.3.Sentinel介绍和安装1.3.1.初识Sentinel1.3.2.安装Sentinel 1.4.微服务整合Sentinel 2.流量控制2.1.簇点链路2.1.快速入门2.2.流控模式2.2.1.…

Zung氏焦虑症测试SAS

SAS被称为焦虑自评量表&#xff0c;是一种用来测量焦虑症状程度以及观察治疗过程中变化情况的心理量表。主要用于评估心理状态&#xff0c;辅助参考数据&#xff0c;也是焦虑评定的标准。焦虑自评量表系是由William W.K. Zung编制的&#xff0c;该量表已成为心理咨询师、心理医…

【GitHub项目推荐--克隆你的声音】【转载】

今天推荐一个黑科技开源项目&#xff0c;只需要你 5 秒钟的声音对话&#xff0c;就能克隆出你的声音&#xff0c;而且能够实时的生成你任意语音。 是不是很顶&#xff1f; 我举个例子&#xff0c;如果我这里有 300 条你说话的语音&#xff0c;我把你的语音数据用这个开源项目…

Android jar包编译及集成

Jar包编译和集成有两种编译方式&#xff0c;mk和bp&#xff0c;Android 7版本之后逐渐采用bp格式编译&#xff0c;目前14版本还是兼容mk方式编译&#xff0c;具体写法入下&#xff1a; Android jar包编译 mk&#xff1a; 如果需要打包到systemimg&#xff0c;则需要将此jar包添…