Search code examples
pythonpytest

pytest-randomly gives the same "random" result for every test


I'm trying to figure out how to use pytest-randomly properly, but the problem is I always get the same set of random numbers for every test. All I did was install pytest-randomly (3.15.0) and run tests normally.

Here's an example code:

import random


def generate_random_numbers(size):
    return [random.randint(1, 100) for _ in range(size)]


def test_random_numbers_size_1():
    numbers = generate_random_numbers(10)
    print(f"test_random_numbers_size 1.1: Generated numbers = {numbers}")
    numbers = generate_random_numbers(10)
    print(f"test_random_numbers_size 1.2: Generated numbers = {numbers}")
    assert len(numbers) == 10


def test_random_numbers_size_2():
    numbers = generate_random_numbers(10)
    print(f"test_random_numbers_size 2.1: Generated numbers = {numbers}")
    numbers = generate_random_numbers(10)
    print(f"test_random_numbers_size 2.2: Generated numbers = {numbers}")
    assert len(numbers) == 10

The result:

...
Using --randomly-seed=2523483435

test_example.py::test_random_numbers_size_2 PASSED                       [ 50%]
test_random_numbers_size 2.1: Generated numbers = [26, 52, 25, 95, 2, 69, 11, 94, 74, 48]
test_random_numbers_size 2.2: Generated numbers = [72, 41, 6, 27, 60, 28, 54, 48, 100, 76]

test_example.py::test_random_numbers_size_1 PASSED                       [100%]
test_random_numbers_size 1.1: Generated numbers = [26, 52, 25, 95, 2, 69, 11, 94, 74, 48]
test_random_numbers_size 1.2: Generated numbers = [72, 41, 6, 27, 60, 28, 54, 48, 100, 76]

As you can see the numbers are repeated for each test method. Shouldn't they be different? Is it possible to change the pytest-randomly seed for each test method? I've tried with some fixtures but nothing worked.

The docs say:

  • Resets the global random.seed() at the start of every test case and test to a fixed number - this defaults to time.time() from the start of your test run, but you can pass in --randomly-seed to repeat a randomness-induced failure.

Solution

  • The reason why both generate the same thing is because you used one seed for both generations, yes the output is random but it relies on the same seed making it generate the same thing. If you don't want it to be the same, don't use a fixed seed and use a randomly generated seed.