PitchHut
Log in / Sign up
pbt
10 views
Unleash the power of parallel testing in Ruby with PBT.
Pitch

Transform your Ruby testing experience with Property-Based Testing (PBT). This innovative tool automatically generates diverse input scenarios to ensure your code meets its intended properties. With support for Ractor, multiprocesses and multithreads, discover edge cases and unforeseen bugs like never before, enhancing your code’s reliability and robustness.

Description

Property-Based Testing in Ruby

Pbt is a groundbreaking Property-Based Testing (PBT) tool tailored specifically for Ruby developers. This innovative tool empowers you to rigorously test your code by focusing on the properties it should consistently fulfill, rather than simply verifying predefined input and output scenarios.

What is Property-Based Testing?

Property-Based Testing is a methodology that allows developers to define the general characteristics their code should exhibit. Pbt automatically generates a diverse range of inputs to ensure those properties are satisfied, thus uncovering edge cases and potential bugs that traditional testing methods might overlook. This leads to more robust and reliable software.

Key Features of Pbt:

  • Parallel Testing: Experience the power of running test cases concurrently using various methods such as Ractor, processes, or threads, enhancing performance and efficiency.
  • Extensive Coverage: Cover a broader spectrum of test cases, enabling the discovery of unexpected behaviors within your code through a vast array of generated inputs.
  • Detailed Feedback: When tests fail, Pbt provides insightful failure reports that include minimal counterexamples, aiding in quick debugging.

Basic Usage Example

Pbt makes it simple to define and execute properties. Here's a basic example demonstrating its capabilities:

def sort(array)
  return array if array.size <= 2  # Potential bug
  pivot, *rest = array
  left, right = rest.partition { |n| n <= pivot }
  sort(left) + [pivot] + sort(right)
end

Pbt.assert do
  Pbt.property(Pbt.array(Pbt.integer)) do |numbers|
    result = sort(numbers)
    result.each_cons(2) do |x, y|
      raise "Sort algorithm is wrong." unless x <= y
    end
  end
end

Enhanced Debugging Features

When a test fails, Pbt provides not only a clear error message but also the ability to reproduce the failure with detailed seed information. You can enable verbose mode for comprehensive insights into each tested value:

Pbt.assert(verbose: true) do
  Pbt.property(Pbt.array(Pbt.integer)) do |numbers|
    # your failed test
  end
end

Configurable Concurrency

Pbt is designed to maximize performance through configurable concurrency options:

  • :ractor for CPU-bound tests
  • :process for multi-process execution
  • :thread for multi-thread testing
  • :none for standard sequential execution

Setting the worker option allows you to choose the best method for your specific testing needs.

Conclusion

Pbt not only enhances your testing capabilities but also aligns them with modern Ruby parallelization methods, providing a pathway to discover bugs early and ensure high-quality code. For an in-depth exploration of Property-Based Testing and additional use cases, please visit RubyKaigi 2024 presentation and consult external resources on the methodology.

Explore the pbt repository on GitHub to start improving your tests with powerful property-based techniques today!