Programmable Property-Based Testing
Preprint
Abstract
Property-based testing (PBT) is a popular technique for establishing confidence in software, where users write properties -- i.e., executable specifications -- that can be checked many times in a loop by a testing framework. In modern PBT frameworks, properties are usually written in shallowly embedded domain-specific languages, and their definition is tightly coupled to the way they are tested. Such frameworks often provide convenient configuration options to customize aspects of the testing process, but users are limited to precisely what library authors had the prescience to allow for when developing the framework; if they want more flexibility, they may need to write a new framework from scratch. We propose a new, deeper language for properties based on a mixed embedding that we call deferred binding abstract syntax, which reifies properties as a data structure and decouples them from the property runners that execute them. We implement this language in Rocq and Racket, leveraging the power of dependent and dynamic types, respectively. Finally, we showcase the flexibility of this new approach by rapidly prototyping a variety of property runners, highlighting domain-specific testing improvements that can be unlocked by more programmable testing.Keywords
All Related Versions
This publication has 33 references indexed in Scilit:
- Do Judge a Test by its Cover2021
- Validity Fuzzing and Parametric Generators for Effective Random Testing2019
- Coverage-Based Greybox Fuzzing as Markov ChainIEEE Transactions on Software Engineering, 2017
- Foundational Property-Based Testing2015
- Test-case reduction for C compiler bugs2012
- Finding and understanding bugs in C compilers2011
- Finally tagless, partially evaluated: Tagless staged interpreters for simpler typed languagesJournal of Functional Programming, 2009
- Parametric higher-order abstract syntax for mechanized semantics2008
- Simplifying and isolating failure-inducing inputIEEE Transactions on Software Engineering, 2002
- Building domain-specific embedded languagesACM Computing Surveys, 1996