I want to test a number of different functions I have written to solve the Fizzbuzz challenge and would like to know what is the best way to check the result?
Each function returns a list of the answers and I want to check the list is correct. One of the functions is shown below
def fizz_buzz_using_boolean():
fizz_buzz_list = ()
for x in range(1, 101):
fizz = x % 3 == 0
buzz = x % 5 == 0
if fizz and buzz:
fizz_buzz_list.append('fizzbuzz')
continue
elif fizz:
fizz_buzz_list.append('fizz')
continue
elif buzz:
fizz_buzz_list.append('buzz')
continue
else:
fizz_buzz_list.append(x)
return fizz_buzz_list
My tests look like this:
import pytest
from fizz_buzz import fizz_buzz_if_calc, fizz_buzz_using_boolean
@pytest.fixture
def fizzbuzz_expected_answer():
"""A list of the fizzbuzz answers for 1 - 100"""
fizz_buzz = (1, 2, 'fizz', 4, 'buzz', 'fizz', 7, 8, 'fizz', 'buzz', 11, 'fizz', 13, 14, 'fizzbuzz', 16, 17, 'fizz', 19, 'buzz', 'fizz', 22, 23, 'fizz', 'buzz', 26, 'fizz', 28, 29, 'fizzbuzz', 31, 32, 'fizz', 34, 'buzz', 'fizz', 37, 38, 'fizz', 'buzz', 41, 'fizz', 43, 44, 'fizzbuzz', 46, 47, 'fizz', 49, 'buzz', 'fizz', 52, 53, 'fizz', 'buzz', 56, 'fizz', 58, 59, 'fizzbuzz', 61, 62, 'fizz', 64, 'buzz', 'fizz', 67, 68, 'fizz', 'buzz', 71, 'fizz', 73, 74, 'fizzbuzz', 76, 77, 'fizz', 79, 'buzz', 'fizz', 82, 83, 'fizz', 'buzz', 86, 'fizz', 88, 89, 'fizzbuzz', 91, 92, 'fizz', 94, 'buzz', 'fizz', 97, 98, 'fizz', 'buzz')
return fizz_buzz
def test_fizz_buzz_using_boolean_has_correct_items(fizzbuzz_expected_answer):
actual = fizz_buzz_using_boolean()
assert actual == fizzbuzz_expected_answer
I have used a fixture to return the correct answer. Whilst the tests pass I can’t find other examples of fixtures being used this way.
The other solutions come to mind is to use a global
import pytest
from fizz_buzz import fizz_buzz_if_calc, fizz_buzz_using_boolean
FIZZBUZZ_EXPECTED_ANSWER = (1, 2, 'fizz', 4, 'buzz', 'fizz', 7, 8, 'fizz', 'buzz', 11, 'fizz', 13, 14, 'fizzbuzz', 16, 17, 'fizz', 19, 'buzz', 'fizz', 22, 23, 'fizz', 'buzz', 26, 'fizz', 28, 29, 'fizzbuzz', 31, 32, 'fizz', 34, 'buzz', 'fizz', 37, 38, 'fizz', 'buzz', 41, 'fizz', 43, 44, 'fizzbuzz', 46, 47, 'fizz', 49, 'buzz', 'fizz', 52, 53, 'fizz', 'buzz', 56, 'fizz', 58, 59, 'fizzbuzz', 61, 62, 'fizz', 64, 'buzz', 'fizz', 67, 68, 'fizz', 'buzz', 71, 'fizz', 73, 74, 'fizzbuzz', 76, 77, 'fizz', 79, 'buzz', 'fizz', 82, 83, 'fizz', 'buzz', 86, 'fizz', 88, 89, 'fizzbuzz', 91, 92, 'fizz', 94, 'buzz', 'fizz', 97, 98, 'fizz', 'buzz')
def test_fizz_buzz_using_boolean_has_correct_items():
actual = fizz_buzz_using_boolean()
assert actual == FIZZBUZZ_EXPECTED_ANSWER
Or my least favourite to use a literal in each test (which will lead to lots of duplicatation)
def test_fizz_buzz_using_boolean_has_correct_items():
actual = fizz_buzz_using_boolean()
assert actual == (1, 2, 'fizz', 4, 'buzz', 'fizz', 7, 8, 'fizz', 'buzz', 11, 'fizz', 13, 14, 'fizzbuzz', 16, 17, 'fizz', 19, 'buzz', 'fizz', 22, 23, 'fizz', 'buzz', 26, 'fizz', 28, 29, 'fizzbuzz', 31, 32, 'fizz', 34, 'buzz', 'fizz', 37, 38, 'fizz', 'buzz', 41, 'fizz', 43, 44, 'fizzbuzz', 46, 47, 'fizz', 49, 'buzz', 'fizz', 52, 53, 'fizz', 'buzz', 56, 'fizz', 58, 59, 'fizzbuzz', 61, 62, 'fizz', 64, 'buzz', 'fizz', 67, 68, 'fizz', 'buzz', 71, 'fizz', 73, 74, 'fizzbuzz', 76, 77, 'fizz', 79, 'buzz', 'fizz', 82, 83, 'fizz', 'buzz', 86, 'fizz', 88, 89, 'fizzbuzz', 91, 92, 'fizz', 94, 'buzz', 'fizz', 97, 98, 'fizz', 'buzz')
Which method should I use?