Fandango is a powerful generator of inputs and interactions designed for software testing. Given the specification of a program's input or interaction language, Fandango quickly generates a myriad of valid inputs to test your systems.
Fandango's specification language combines a grammar with constraints written in Python, making it incredibly expressive.
- Custom Testing Goals: Define exactly what you need. If you require your inputs to have particular values or follow specific distributions, you can express these testing goals directly in Fandango right out of the box.
Fandango adapts to your workflow by supporting multiple operating modes:
- Black-Box Fuzzing (Default): Generate inputs directly from a
.fanFandango specification file. - Input Mutation: Feed Fandango your sample inputs, and it will mutate them to obtain more complex and realistic test cases.
- Protocol Fuzzing: Generate dynamic interactions. Fandango can act as a client or server, producing and reacting to interactions according to your protocol specifications.
Fandango comes as a portable Python program, meaning it runs easily on a large variety of platforms. To produce its inputs, it leverages sophisticated evolutionary algorithms. It starts with a population of random inputs and systematically evolves them through mutations and cross-overs until they perfectly fulfill your given constraints.
Fandango is in active development! We are constantly expanding its capabilities. Features planned for 2026 include:
- Coverage-guided testing
- Code-directed testing
- High-diversity input generation
- ...and much more!
Fandango requires Python 3.11 or later:
$ pip install fandango-fuzzerThen write a specification and generate inputs from it:
$ fandango fuzz -f your_spec.fan -n 10See Installing for other options, including building from source.
📚 Ready to dive deeper? For complete documentation, including tutorials, references, and advanced usage guides, visit the Fandango Documentation.
New to Fandango? The hands-on tutorial takes one small protocol and works up from random bytes to a stateful conversation, one idea at a time.
Contributions are welcome, and reporting a bug or fixing a typo counts.
- Contributing guide covers setting up a development environment, what our CI checks, and how to get a pull request merged. Please note that we ask you to comment on an issue and be assigned before starting work on it.
- Code of Conduct applies to everyone taking part.
- Getting help if something is unclear or not working.
- Security policy for reporting vulnerabilities. Please report these privately via GitHub's security advisory form, not as a public issue.
If you use Fandango in academic work, please cite the ISSTA 2025 paper
FANDANGO: Evolving Language-Based Testing.
GitHub's "Cite this repository" button, backed by
CITATION.cff, generates this for you:
@article{zamudio2025fandango,
author = {Zamudio Amaya, Jos\'{e} Antonio and Smytzek, Marius and Zeller, Andreas},
title = {{FANDANGO}: {E}volving Language-Based Testing},
journal = {Proc. ACM Softw. Eng.},
volume = {2},
number = {ISSTA},
articleno = {ISSTA040},
numpages = {23},
year = {2025},
month = jun,
doi = {10.1145/3728915},
url = {https://doi.org/10.1145/3728915},
publisher = {Association for Computing Machinery}
}Note that the first author's family name is "Zamudio Amaya".
Fandango is licensed under the European Union Public Licence V. 1.2. See the LICENSE file for details.