Tests should always:

* Make sure that production code behaves as expected, including edge cases.
* Be easy to debug, i.e. understandable and reproducible.

Using random values in tests will not necessarily check edge cases, and it will make test logs a lot harder to read. It is better to use easily readable hardcoded values. If this makes your code bigger you can use helper functions.


There is one valid use case for random data in tests: when testing every value would make tests impractically slow. In this case the best you can do is use random to test every value on the long run. You should however make sure that random values are logged so that you can reproduce failures. Some libraries exist to make all this easier. You can for example use property-based testing libraries such as https://github.com/jlink/jqwik[jqwik].


This rule raises an issue when ``++new Random()++`` or ``++UUID.randomUUID()++`` are called in test code.


== Noncompliant Code Example

----
int userAge = new Random().nextInt(42);  // Noncompliant
UUID userID = UUID.randomUUID(); // Noncompliant
----


== Compliant Solution

----
int userAge = 31;
UUID userID = UUID.fromString("00000000-000-0000-0000-000000000001");
----


== See

* https://phauer.com/2019/modern-best-practices-testing-java/#use-fixed-data-instead-of-randomized-data[Modern Best Practices for Testing in Java - Philipp Hauer]
* https://jqwik.net/[Jqwik test engine]



ifdef::env-github,rspecator-view[]
'''
== Comments And Links
(visible only on this page)

include::comments-and-links.adoc[]
endif::env-github,rspecator-view[]
