From Resource Flow to Executable Tests: Petri-Net-Guided LLM Test Generation for Concurrent Stateful Rust APIs

2026-07-23Software Engineering

Software EngineeringArtificial Intelligence
AI summary

The authors propose a new way to create tests for Rust programs that use complex, stateful APIs where many operations happen at the same time. They use a kind of diagram called a Petri net to describe how resources and states change and then guide large language models to write test code that respects these rules. Their method helps the generated tests better explore tricky concurrent situations and fixes errors to keep tests true to the model. This approach aims to bridge the gap between designing test scenarios and writing real test code without too much manual effort.

Concurrent programmingStateful APIRust programming languagePetri netsLarge language modelsTest generationConcurrency testingCode synthesisSemantic oraclePartial order
Authors
Kaiwen Zhang, Guanjun Liu
Abstract
Concurrent stateful library APIs expose behavior through evolving resource ownership, lifecycle states, and competing interleavings. Large language models can synthesize executable Rust tests, but their outputs often violate API preconditions, remain shallow, or reduce concurrency to accidental sequential traces. Conversely, model-based and systematic testing techniques provide semantic control but commonly require substantial handwritten code to turn abstract scenarios into executable tests. This paper addresses the gap between formal scenario design and low-cost test concretization. We present a Petri-net-guided methodology for test generation over concurrent stateful Rust APIs. The method represents API resources, lifecycle conditions, and causal dependencies as colored tokens and transitions; derives legal deep-state, near-legal, and partial-order concurrent scenarios; and uses these scenarios as a constrained intermediate representation for LLM-based code synthesis. A local-faithfulness contract and structural repair loop preserve the modeled intent during concretization, while Petri-guided schedule shaping prioritizes high-conflict concurrency skeletons for systematic exploration. A layered semantic oracle then distinguishes synthesis failures from violations of the target API's expected behavior.