test Property-based Testing-04-junit-quickcheck

这篇具有很好参考价值的文章主要介绍了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

test Property-based Testing-04-junit-quickcheck,test,junit,测试覆盖率,开发语言,unit testing,开源文章来源地址https://www.toymoban.com/news/detail-783634.html

到了这里,关于test Property-based Testing-04-junit-quickcheck的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • System Under Test (SUT) and Testing Environment

    1. System Under Test (SUT) The System Under Test (SUT) is the specific software application, component, or system that is being subjected to testing. It is the main focus of the testing process and represents the software or system that developers and testers are working on. The SUT could be a single software application, a module within a larger system, or

    2024年02月12日
    浏览(27)
  • 可靠性测试(reliability testing)

    我们认为软件可靠性始终是重要的,但它对于任务关键型、安全关键型和高使用率系统是必不可少的。如您所料,可靠性测试可用于降低可靠性问题的风险。可靠性故障背后的常见问题包括内存泄漏、磁盘碎片和耗尽、间歇性基础设施问题以及超时值低于可行值。 可靠性定义

    2024年02月16日
    浏览(31)
  • SpringBoot单元测试(unit testing)

    目录 1.什么是单元测试? 2.单元测试的优点 3.关于单元测试框架 4.单元测试的实现

    2024年02月16日
    浏览(34)
  • 单元测试(unit testing)到底是什么?

    做开发的同学应该都听说过单元测试(unit testing),因为对单元测试的理解程度不同,所以对单元测试的看法也可能有所不同。本文就来深入讲解一下单元测试的概念、作用和是否需要做单元测试。 单元测试(unit testing)是软件开发中的一种最低级别的测试方式,对软件中的

    2024年02月08日
    浏览(42)
  • 深入浅出 testing-library

    我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品。我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值。 本文作者:佳岚 The more your tests resemble the way your software is used, the more confidence they can give you. 您的测试越接近软件的使用方式,它们就越

    2024年02月19日
    浏览(23)
  • 一文掌握 Golang 模糊测试(Fuzz Testing)

    模糊测试(Fuzz Testing)是通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。可以用来发现应用程序、操作系统和网络协议等中的漏洞或错误,特别是容易被忽视的边界情况。模糊测试的基本思路是在测试过程中生成大量的随机数,然后将这些数据输入

    2024年02月07日
    浏览(25)
  • 十分钟理解回归测试(Regression Testing)

    回归测试是一个系统的质量控制过程,用于验证最近对软件的更改或更新是否无意中引入了新错误或对以前的功能方面产生了负面影响(比如你在家中安装了新的空调系统,发现虽然新的空调系统可以按预期工作,但是本来亮的等却不亮了)。其主要目标是确保旨在改进的修

    2024年02月05日
    浏览(52)
  • 【Testing】基于Mockito的FeignClient单元测试

           在微服务框架模式下,往往需要在外部服务没有准备好的情况下进行测试。本文主要是讨论在SpringCloud体系下,以FeignClient进行通信时,对其进行mock的方式。 微服务B通过FeignClient依赖其他服务调用。 3.1)构建基础测试类 3.2)Mock FeignClient 主要就是初始化feignClient的方式(

    2024年02月12日
    浏览(26)
  • 探索Angular测试艺术:Angular Testing Recipes

    项目地址:https://gitcode.com/juristr/angular-testing-recipes Angular Testing Recipes是一个开源项目,由开发者Juri Strumpfloeger精心打造,旨在为Angular开发者提供一系列实用的测试策略和示例代码。该项目以GitCode为平台,以Markdown格式分享了关于单元测试、组件测试、服务测试等方面的实战技

    2024年04月22日
    浏览(23)
  • Introduction to Unit Testing in Java

    作者:禅与计算机程序设计艺术 UNIT TESTING (UNIT测试),是在软件开发生命周期中不可或缺的一环。单元测试是一个模块化的测试工作,它的目标是验证某个函数、模块或者类的某个功能是否符合设计要求。它通过对代码中独立的测试用例进行运行和验证,发现错误并报告给相

    2024年02月08日
    浏览(36)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包